iOS 调用原生实现分享功能有两种方法,一种是UIActivityViewController,另外一种是使用苹果官方提供的Social框架中的SLComposeViewController。两者的表现效果会略有不同。


两种方法都可以实现分享的功能,当弹起UIActivityViewController后选择对应的分享平台也会弹出分享面板进行分享,后者是可以直接调起分享板面
但是在iOS 11开始,系统不允许直接调起对应的分享面板,必须通过UIActivityViewController调起分享面板
针对这个问题,这里给出解决方案
UIActivityViewController方法
-(void)shareToSocial{
UIActivityViewController * activityViewController = [[UIActivityViewController alloc]
initWithActivityItems:items applicationActivities:nil];
NSMutableArray *excludeArray = [@[UIActivityTypeAirDrop,
UIActivityTypePrint,
UIActivityTypePostToVimeo] mutableCopy];
//不需要分享的图标
if (shouldExclude != nil) {
[excludeArray addObjectsFromArray:shouldExclude];
}
activityViewController.excludedActivityTypes = excludeArray;
[self presentViewController: activityViewController animated: YES completion: nil];
return YES;
}
- excludedActivityTypes可选参数
UIActivityTypePostToFacebook,
UIActivityTypePostToTwitter,
UIActivityTypePostToWeibo,
UIActivityTypeMessage,
UIActivityTypeMail,
UIActivityTypePrint,
UIActivityTypeCopyToPasteboard,
UIActivityTypeAssignToContact,
UIActivityTypeSaveToCameraRoll,
UIActivityTypeAddToReadingList,
UIActivityTypePostToFlickr,
UIActivityTypePostToVimeo,
UIActivityTypePostToTencentWeibo,
UIActivityTypeAirDrop,
UIActivityTypeOpenInIBooks
值得注意的是,如果你App应用于iPad需要加多一步处理,否则会导致App crash
if ([UIDevice isPad]) {
activityViewController.popoverPresentationController.sourceView = viewController.view;
activityViewController.popoverPresentationController.sourceRect = CGRectMake([UIScreen mainScreen].bounds.size.width * 0.5,viewController.view.bounds.size.height, 1.0, 1.0);
}
Social方法
- (void) shareToSocial {
//判断是否有安装Facebook
if (![SLComposeViewController isAvailableForServiceType: SLServiceTypeFacebook]) {
UIAlertController *warningAlert = [UIAlertController alertControllerWithTitle:@"Error"
message:@"Your device does not have Facebook installed."
preferredStyle:UIAlertControllerStyleAlert];
[warningAlert addAction:[UIAlertAction
actionWithTitle:@"OK"
style:UIAlertActionStyleDefault
handler:nil]];
[viewController presentViewController:warningAlert animated:YES completion:nil];
return;
}
SLComposeViewController *facebookController = [SLComposeViewController composeViewControllerForServiceType: SLServiceTypeFacebook];
self.delegate = sharingDelegate;
[viewController presentViewController:facebookController animated:YES completion:nil];
}
没错,通过这段代码,你并不能直接调起分享面板
因为SLServiceTypeFacebook
在iOS 11后已经移除不再起作用,这个问题只需要通过加一行代码也可以解决
NSString *const serviceTypeFacebook = @"com.apple.share.Facebook.post";
将serviceTypeFacebook
代替SLServiceTypeFacebook
即可解决问题
- 常见的serviceType
serviceType = @"com.tencent.xin.sharetimeline" //微信
serviceType = @"com.tencent.mqq.ShareExtension" //QQ
serviceType = @"com.apple.share.Facebook.post" //Facebook
serviceType = @"com.apple.share.Twitter.post" //Twitter
Note:关于这个serviceType本人尚未找到官方文档
本人在部分机子进行测试时,调起Facebook或者Twitter时会发生crash,查了一些资料,可能因为机子是国行的机子导致facebookController
, twitterController
为空,请做相应的操作
if (twitterController) {
[viewController presentViewController:twitterController animated:YES completion:nil];
}
未经授权,禁止转载!
尊重原创,转载请注明出处,谢谢!
网友评论