美文网首页
iOS 原生实现分享功能

iOS 原生实现分享功能

作者: JQWONG | 来源:发表于2019-06-04 17:44 被阅读0次

    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];
        }
    

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

    相关文章

      网友评论

          本文标题:iOS 原生实现分享功能

          本文链接:https://www.haomeiwen.com/subject/mplrxctx.html