iOS 原生实现分享功能

2019-06-04  本文已影响0人  JQWONG

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


UIActivityViewController效果 Social框架效果

两种方法都可以实现分享的功能,当弹起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,查了一些资料,可能因为机子是国行的机子导致facebookControllertwitterController为空,请做相应的操作

if (twitterController) {
        [viewController presentViewController:twitterController animated:YES completion:nil];
    }

未经授权,禁止转载!
尊重原创,转载请注明出处,谢谢!
上一篇下一篇

猜你喜欢

热点阅读