(0096)iOS開發之應用間的分享系列(1)
(0097)iOS開發之應用間的分享系列(2)
前兩篇都是講的分别是
将自己的應用添加到系統的分享面闆
将圖檔通過分享面闆分享到自己的應用中并顯示。
這一篇主要講
在iOS用戶端不使用第三方架構的前提下,怎麼實作分享的功能。在自己的應用中調起系統分享面闆分享到面闆上的其他應用中
。
UIActivityViewController
蘋果從iOS6開始,提供了一個活動清單視圖,為分享和操作資料提供了一個統一的服務接口,通過
UIActivityViewController
來控制它的呈現和關閉,凡是繼承
UIActivity
抽象類的子類對象都可以放在清單中呈現出來。如下圖所示:

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 選擇分享平台的去向:這裡微信
- 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
iOS 11 之前微網誌分享步驟:
- 設定後添加微網誌賬戶
(0098)iOS開發之應用間的分享系列(3) (0098)iOS開發之應用間的分享系列(3) - 添加之後,回到程式分享
(0098)iOS開發之應用間的分享系列(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系統分享方案總結