天天看點

(0098)iOS開發之應用間的分享系列(3)

(0096)iOS開發之應用間的分享系列(1)

(0097)iOS開發之應用間的分享系列(2)

前兩篇都是講的分别是

将自己的應用添加到系統的分享面闆

将圖檔通過分享面闆分享到自己的應用中并顯示。

這一篇主要講

在iOS用戶端不使用第三方架構的前提下,怎麼實作分享的功能。在自己的應用中調起系統分享面闆分享到面闆上的其他應用中

UIActivityViewController

蘋果從iOS6開始,提供了一個活動清單視圖,為分享和操作資料提供了一個統一的服務接口,通過

UIActivityViewController

來控制它的呈現和關閉,凡是繼承

UIActivity

抽象類的子類對象都可以放在清單中呈現出來。如下圖所示:

(0098)iOS開發之應用間的分享系列(3)

UIActivityViewController 使用大緻使用步驟:

  • 1 設定分享的内容
- (IBAction)pushLoadBundle:(id)sender {

    // 1. 設定分享的内容
    NSString *shareTitle = @"分享的标題";
    UIImage *shareImage = [UIImage imageNamed:@"suningIcon"];
    
    // 必須要提供url 才會顯示分享标簽否則隻顯示圖檔
    NSURL *shareUrl = [NSURL URLWithString:@"http://www.baidu.com"];
    NSArray *activityItems = @[shareTitle,
                               shareImage,
                               shareUrl];
    
    // 2.建立分享的控制器
    UIActivityViewController *activityVc = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
    // 3.設定不想顯示的平台和功能
    activityVc.excludedActivityTypes = @[UIActivityTypePostToFacebook,UIActivityTypeAirDrop];
    
    // 4.設定操作回調,使用者點選 菜單按鈕後事件執行完成會回調這個block
    activityVc.completionWithItemsHandler = ^(UIActivityType _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) {
        if (completed) {
            NSLog(@"分享成功");
        }else{
            NSLog(@"分享取消");
        }
    };

    // 5.顯示分享菜單
    [self presentViewController:activityVc animated:YES completion:nil];
}
           
  • 2 調起分享面闆
    (0098)iOS開發之應用間的分享系列(3)
  • 3 選擇分享平台的去向:這裡微信
(0098)iOS開發之應用間的分享系列(3)
  • 4 分享結果:成功就可以在微信中檢視。

自定義UIActivity

官方文檔解釋,UIActivity必須通過繼承的方式來使用。如果系統提供的操作不能滿足我們的需求,也可以自定義UIActivity,可擷取按鈕選擇事件,手動的進行處理。下面就來手動的實作微網誌分享操作。

1.建立WeiboActivity:

WeiboActivity.h

typedef void(^PerformWeiboActivityBlock)(void);
@interface WeiboActivity : UIActivity
@property (nonatomic,copy)PerformWeiboActivityBlock performWeiboActivityBlock;
@end
           

WeiboActivity.m

#import "WeiboActivity.h"
@implementation WeiboActivity

+ (UIActivityCategory)activityCategory{
    return UIActivityCategoryShare;
}

- (NSString *)activityType{
    return @"com.myz.share.weibo.post";
}
//顯示在清單中的圖示
- (UIImage *)activityImage{
    return [UIImage imageNamed:@"share_weibo"];
}
//顯示在清單中标題
- (NSString *)activityTitle{
    return @"微網誌分享";
}

- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems{
    return YES;
}

- (void)prepareWithActivityItems:(NSArray *)activityItems{
}

- (void)performActivity {
    if (self.performWeiboActivityBlock) {
        self.performWeiboActivityBlock();
    }
    [self activityDidFinish:YES];
}
@end
           

觸發面闆并分享到微網誌

- (void)shareToSinaWeibo:(id)btn {
    // 1. 設定分享的内容
    NSString *shareTitle = @"分享的标題";
    UIImage *shareImage = [UIImage imageNamed:@"suningIcon"];
    
    // 必須要提供url 才會顯示分享标簽否則隻顯示圖檔
    NSURL *shareUrl = [NSURL URLWithString:@"http://www.baidu.com"];
    NSArray *activityItems = @[shareTitle, shareImage, shareUrl];
    
    WeiboActivity *weiboActivity = [[WeiboActivity alloc] init];
    weiboActivity.performWeiboActivityBlock = ^{
        [self socialSinaWeibo];
    };
    NSArray * activitys = @[weiboActivity];
    
    UIActivityViewController *activityViewController =    [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:activitys];
    [self presentViewController:activityViewController animated:YES completion:nil];
    
}

//@import Social
- (void)socialSinaWeibo {
    // 1. 判斷裝置是否支援指定的分享平台
    // SLComposeViewController:社交分享的視圖控制器
    BOOL isAvailable = [SLComposeViewController isAvailableForServiceType:SLServiceTypeSinaWeibo];
    if (isAvailable == NO) {
        NSLog(@"應用不支援新浪微網誌分享");
        return;
    }
    // 2. 建立分享視圖控制器,并指定分享平台
    SLComposeViewController *composeVC = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeSinaWeibo];
    /* 系統支援的分享功能可以分享的平台
     SOCIAL_EXTERN NSString *const SLServiceTypeTwitter
     SOCIAL_EXTERN NSString *const SLServiceTypeFacebook
     SOCIAL_EXTERN NSString *const SLServiceTypeSinaWeibo
     SOCIAL_EXTERN NSString *const SLServiceTypeTencentWeibo
     SOCIAL_EXTERN NSString *const SLServiceTypeLinkedIn
     */
    
    // 3. 設定分享内容
    [composeVC setInitialText:@"微網誌分享"];
    [composeVC addImage:[UIImage imageNamed:@"share_weibo.png"]];
    [composeVC addURL:[NSURL URLWithString:@"https://www.baidu.com"]];
    
    // 4. 進入分享界面
    [self presentViewController:composeVC animated:YES completion:^{
        NSLog(@"進入分享界面");
    }];
    // 5. 監聽使用者操作
    [composeVC setCompletionHandler:^(SLComposeViewControllerResult result) {
        if (result == SLComposeViewControllerResultCancelled) {
            NSLog(@"取消分享");
        }else if (result == SLComposeViewControllerResultDone) {
            NSLog(@"分享成功");
        }
    }];
}

           

下圖框着的自定義的item

(0098)iOS開發之應用間的分享系列(3)

iOS 11 之前微網誌分享步驟:

  1. 設定後添加微網誌賬戶
    (0098)iOS開發之應用間的分享系列(3)
    (0098)iOS開發之應用間的分享系列(3)
  2. 添加之後,回到程式分享
    (0098)iOS開發之應用間的分享系列(3)
  3. 分享結果檢視

iOS 11 之後SLComposeViewController 廢棄

關于SLComposeViewController生成執行個體的方法,需要注意的是iOS11.0之前,可以通過<Social/Social.h>架構提供的幾種枚舉類型來生成執行個體,這些枚舉類型在11.0之後被遺棄了。

SLServiceTypeTwitter

SLServiceTypeFacebook

SLServiceTypeSinaWeibo

SLServiceTypeTencentWeibo

SLServiceTypeLinkedIn

是以iOS 11 之後的自定義分享這種方式調不起微網誌等分享的。使用SLComposeViewController分享到facebook,SLComposeViewControllerCompletionHandler總是傳回SLComposeViewControllerResultCancelled。

隻能通過另一種方式:Share Extension。什麼是Share Extension?在iOS 8的時候, 蘋果開放了幾個新特性, 其中一個就是Share Extension。它是蘋果系統自帶的社會化SDK。而SLComposeViewController支援調用所有的Share Extension。

以下是從網上找來的各個主流App的Share Extension

com.taobao.taobao4iphone.ShareExtension  //  淘寶
com.apple.share.Flickr.post   //  Flickr
com.apple.share.SinaWeibo.post  //   新浪微網誌
com.laiwang.DingTalk.ShareExtension  //   釘釘
com.apple.mobileslideshow.StreamShareService  //  iCloud
com.alipay.iphoneclient.ExtensionSchemeShare  //   支付寶
com.apple.share.Facebook.post  //   Facebook
com.apple.share.Twitter.post  //   Twitter
com.apple.Health.HealthShareExtension   // 應該是健康管理
com.tencent.xin.sharetimeline  //   微信(好友、朋友圈、收藏)
com.apple.share.TencentWeibo.post  //   騰訊微網誌
com.tencent.mqq.ShareExtension  //   QQ
           

iOS 11 之後通過Share Extension 分享。Share Extension 分享請轉看文章:

(0097)iOS開發之應用間的分享系列(2)

參看文章

UIActivityViewController使用

iOS系統分享方案總結

繼續閱讀