由于iOS 擁有Airdrop的便捷式分享,以及越加復(fù)雜化的社交生態(tài)圈,越來越多的項目直接使用系統(tǒng)自帶的UIActivityViewController 達(dá)成社交化分享,并且進(jìn)行一些列的自定義操作,方便的處理分享功能。剛好項目中有用到,一直以為很簡單的東西還是踩了不少的坑,于是拿出來與大家分享下。
簡單實現(xiàn)
- 系統(tǒng)自帶的Facebook,Twitter分享,國內(nèi)有墻的存在,無法喚起app分享,因此使用自定義處理,方便兼容。
- 其他使用用戶安裝的APP自帶的分享extension足以。
自定義UIActivity
- 就是顯示在分享中的(UIActivityCategoryAction)第二行(UIActivityCategoryShare)第一行,可自定義顯示樣式(圖標(biāo)、文字)
- 需要實現(xiàn)系統(tǒng)hook方法
-
activityVC.excludedActivityTypes屬性,過濾自定義實現(xiàn)的分享type 比如activityVC.excludedActivityTypes = @[UIActivityTypePostToFacebook,UIActivityTypePostToTwitter]; - (void)performActivity 點擊事件實現(xiàn)
- 保存shareItems
- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems { self.shareItems = activityItems; return YES; }
最終方案:自定義分享使用富媒體(圖片,鏈接、標(biāo)題共存),Airdrop以及系統(tǒng)其他APP分享 只使用鏈接
- 關(guān)鍵方法
YSShareManager.h中
// 根據(jù)初始化方式 保存臨時變量,以實現(xiàn)富媒體分享
@property (copy ,nonatomic,readonly)NSString *imageUrl;
@property (copy ,nonatomic,readonly)NSString *shareText;
@property (strong ,nonatomic,readonly)UIImage *shareImage;
@property (strong ,nonatomic,readonly)NSURL *shareUrl;
/**
適應(yīng)Airdrop 分享最低層傳遞富媒體 中層action以及Airdrop只傳遞URL
@param imgUrl image地址
@param text 文本
@param urlStr 鏈接 不能為空
*/
+ (void)shareWithImageUrl:(nullable NSString*)imgUrl
text:(nullable NSString *)text
url:(nonnull NSString *)urlStr;
/**
清除臨時儲存的變量
*/
+ (void)clearShareKit;
-
YSShareManager.m中
UIActivityViewControllerCompletionWithItemsHandler myBlock = ^(NSString *activityType,BOOL completed,NSArray *returnedItems,NSError *activityError) {
NSLog(@"activityType :%@", activityType);
if (completed) {
[FBSDKAppEvents logEvent:[NSString stringWithFormat:@"share_Success_%@",activityType]];
}
else {
[FBSDKAppEvents logEvent:[NSString stringWithFormat:@"share_Failed_%@",activityType]];
}
分享反饋中清空臨時保存的變量
[self clearShareKit];
};
使用方式
初始化
- 在appdelegate中或者在分享所在控制器實現(xiàn)添加對應(yīng)的自定義分享
/**
添加制定類型分享 控制分享處理方式
@param option 類型枚舉 單個添加
@param perform 分享動作預(yù)設(shè)(要做啥子事情)
*/
+ (void)configShareKitAddOneActivityWithType:(YSShareOptionType)type
handleBlock:(SharePerform)perform;
/**
自己去實現(xiàn) 自定義分享 優(yōu)先級比較上面的type高 兩者共存 自定義UIActivity子類使用此方法
@param activities 自定義分享實例
*/
+ (void)configShareKitWithCustomActivities:(nullable NSArray <UIActivity *>*)activities;
- 在回調(diào)函數(shù)中選擇使用相應(yīng)的所需參數(shù),自定義實現(xiàn)規(guī)則
YSWeakSelf(self);
[YSShareManager configShareKitAddOneActivityWithType:YSShareOptionTypeFaceBook handleBlock:^(NSArray * _Nonnull shareItems) {
[weakself shareToFaceBookWithItems:shareItems];
}];
- 舉個栗子
在我們項目中Home頁面加載后初始化分享配置
- (void)shareToFaceBookWithItems:(NSArray *)shareItems
{
//判斷服務(wù)是否可用
NSString *shareText = [BGLShareManager shareManager].shareText;
NSURL *shareURL = [BGLShareManager shareManager].shareUrl;
UIImage *shareImg = [BGLShareManager shareManager].shareImage;
[FBSDKAppEvents logEvent:@"Share to Facebook"];
......
}
在詳情頁發(fā)起分享
- (void)clickShareBtnAct:(id)sender{
// 適配iPad的分享
[BGLShareManager shareManager].sharePositionView = sender;
NSString *imageUrl = [_bannerImageUrlArr objectAtIndex:_bigImageShowView.currentItemIndex];
[BGLShareManager shareWithImageUrl:imageUrl text:_pName url:urlStr];
}
爬過的坑
關(guān)于Airdrop
不支持圖片和 URL 、文字 多種媒體同時傳遞
單一傳遞圖片時,直接保存到圖片瀏覽器
單一傳遞URL時,默認(rèn)打開瀏覽器,可以使用APP的scheme或者短鏈接定向打開應(yīng)用 ,使用
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication可以接收URL,進(jìn)行內(nèi)部處理單一傳遞NSString時 自動轉(zhuǎn)換為txt 使用app有注冊txt格式app列表打開
針對iPad
由于顯示樣式完全不同于手機(jī),需要單獨處理,發(fā)起分享前設(shè)置sharePositionView
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:activityVC animated:YES completion:nil];
}else{
UIPopoverPresentationController *popover = activityVC.popoverPresentationController;
if (popover) {
popover.sourceView = [BGLShareManager shareManager].sharePositionView;
popover.permittedArrowDirections = UIPopoverArrowDirectionAny;
}
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:activityVC animated:YES completion:NULL];
}
短信分享界面不顯示取消按鈕
項目中可能存在第三方文件
UINavigationController+FDFullscreenPopGesture.m 使用了runtime
- 解決方案1 :一刀切,這個第三方庫已經(jīng)不再實用新系統(tǒng)
- 解決方案2 :修改,刪除了pod管理這個第三庫,手動修改部分過濾條件
- (void)fd_pushViewController:(UIViewController *)viewController animated:(BOOL)animated { //過濾MessageUI,并且添加取消按鈕 if ([self isKindOfClass:[MFMessageComposeViewController class]]) { [self fd_pushViewController:viewController animated:animated]; [[self.viewControllers lastObject] navigationItem].rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(dismissModal:)]; return; } }
分享功能雖不復(fù)雜,但著實資料無多,大多復(fù)制粘貼,不如真實使用之后的實踐。文采有限,希望君閱之有所收獲。