美文网首页iOS随笔iOS开发
UIActivityViewController 在iOS11上

UIActivityViewController 在iOS11上

作者: cc412 | 来源:发表于2017-11-28 20:52 被阅读120次

    最近在做针对国外用户的App,考虑到国外都是Facebook和Twitter等社交平台,所以考虑使用iOS系统中的原生分享。但是在iOS11上面遇到一些坑,遂记录一下。

    在iOS11以下的版本中,系统默认集成了社交账号的功能。但是在iOS11中内置的社交账号被移除了。并且在iOS11中废弃了一些方法。

    SOCIAL_EXTERN NSString *const SLServiceTypeTwitter NS_DEPRECATED(10_8, 10_13, 6_0, 11_0);
    SOCIAL_EXTERN NSString *const SLServiceTypeFacebook NS_DEPRECATED(10_8, 10_13, 6_0, 11_0);
    SOCIAL_EXTERN NSString *const SLServiceTypeSinaWeibo NS_DEPRECATED(10_8, 10_13, 6_0, 11_0);
    SOCIAL_EXTERN NSString *const SLServiceTypeTencentWeibo NS_DEPRECATED(10_8, 10_13, 6_0, 11_0);
    SOCIAL_EXTERN NSString *const SLServiceTypeLinkedIn NS_DEPRECATED(10_8, 10_13, 6_0, 11_0);
    

    使用系统分享可以使用UIActivityViewControllerSLComposeViewController。但是在iOS11中SLComposeViewController已经无法使用。

      BOOL available = [SLComposeViewController isAvailableForServiceType:SLServiceTypeSinaWeibo];
        //iOS11系统中使用这个方法应该所有平台都是NO
        if (!available) {
            return;
        }
    

    所以只能使用UIActivityViewController。使用系统的分享SDK好处还是很多的。不用再各个平台上申请账号,申请Key,设置白名单等等,只需几行代码就能优雅的实现分享功能。

        NSString *textToShare = @"test titile";
        UIImage* imageShare = [UIImage imageNamed:@"logo"];
        NSURL *urlShare = [NSURL URLWithString:@"https://www.youdao.com"];
        NSArray *activityItems = @[textToShare, imageShare, urlShare];
        UIActivityViewController *actVC = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
        //excludedActivityTypes 是排除那些分享功能,数组里面的都不显示
        actVC.excludedActivityTypes = @[UIActivityTypeMessage,UIActivityTypePrint,UIActivityTypeSaveToCameraRoll,UIActivityTypeAddToReadingList,UIActivityTypePostToFlickr,UIActivityTypePostToVimeo,UIActivityTypeAirDrop];
        //区分iPad 和 iPhone
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
            actVC.popoverPresentationController.sourceView = self.view;
              [self presentViewController:actVC animated:YES completion:nil];
          } else {
              [self presentViewController:actVC animated:YES completion:nil];
          }
    
          actVC.completionWithItemsHandler = ^(UIActivityType  _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) {
              NSLog(@"===%@",returnedItems);
          };
    

    excludedActivityTypes是剔除那些分享功能,枚举如下

        UIKIT_EXTERN NSString *const UIActivityTypePostToFacebook     NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;    //发送到Facebook
        UIKIT_EXTERN NSString *const UIActivityTypePostToTwitter      NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;    //发送到Twitter
        UIKIT_EXTERN NSString *const UIActivityTypePostToWeibo        NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;    //发送到新浪微博
        UIKIT_EXTERN NSString *const UIActivityTypeMessage            NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;    //短信
        UIKIT_EXTERN NSString *const UIActivityTypeMail               NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;    //邮件
        UIKIT_EXTERN NSString *const UIActivityTypePrint              NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;    //打印
        UIKIT_EXTERN NSString *const UIActivityTypeCopyToPasteboard   NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;    //拷贝
        UIKIT_EXTERN NSString *const UIActivityTypeAssignToContact    NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;    //指定给联系人
        UIKIT_EXTERN NSString *const UIActivityTypeSaveToCameraRoll   NS_AVAILABLE_IOS(6_0) __TVOS_PROHIBITED;    //保存至相机胶卷
        UIKIT_EXTERN NSString *const UIActivityTypeAddToReadingList   NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;    //添加至阅读列表
        UIKIT_EXTERN NSString *const UIActivityTypePostToFlickr       NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;    //发送到Flickr(雅虎旗下图片分享网站)
        UIKIT_EXTERN NSString *const UIActivityTypePostToVimeo        NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;    //发送到Vimeo
        UIKIT_EXTERN NSString *const UIActivityTypePostToTencentWeibo NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;    //发送到腾讯微博
        UIKIT_EXTERN NSString *const UIActivityTypeAirDrop            NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;    //AirDrop
        UIKIT_EXTERN NSString *const UIActivityTypeOpenInIBooks       NS_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED;    //在iBooks中打开
    
    

    如果是iOS11以下的系统,上面的分享功能应该没什么问题。但是在iOS11上面出现了Twitter和Facebook都不能分享的问题(微信、微博等正常)。

    在iOS11上面分享这两个平台点击logo以后没有任何反应。下面开始排查问题。

    • 猜想一:系统移除掉内置社交平台后,Twitter和Facebook的App没有更新

    升级手机中这两个App,更新后无效。但是找到了一些资料
    Twitter - Developers:Bug in iOS 11?
    Twitter 官方说已经针对iOS11进行了更新适配

    • 猜想二:国内特供版?接口封掉了

    iOS10上面一切正常,但是考虑到iOS11系统的改变,所以删掉中国App Store下载的App,登录美国App Store 账号下载这两个App。打开后依旧。无效

    此时发现系统相册中的分享,点击Facebook和Twitter也无反应。所以应该和App无关

    • 猜想三:伟大的墙的作用?

    挂VPN,改手机系统语言为英文,找在香港的朋友试试他的手机。依旧无解

    • 猜想四:iOS11系统版本bug,没更新

    都更新到最新的iOS11.1.2(正式版)。问题依旧

    • 猜想五:手机的原因,因为是国行

    以上几种情况使用了不同的机型测试,但是都是国行手机。但是现在都是全网通并且国外卖的手机也都是大陆产的,所以一开始就没考虑这个。以上猜想都否决以后开始想到这个原因。
    找了一圈,最后测试发现

    印度买的iPhone 5S在iOS11上分享Facebook和Twitter 成功
    日本买的iPhone 8 Plus 在iOS11上面分享成功
    并且iOS11的系统有11.1.2和11.1.0的

    所以最后结论是在iOS11上面移除掉了系统内置分享后,国行手机对Facebook 和Twitter 的原生分享都失效了。但是除了国行以外的手机应该都没问题。

    解决办法

    只有自己接入Facebook和Twitter的SDK,去官网注册key不再使用系统的。
    但是考虑到我们的用户群都是外国人,国行手机占有率很低,所以我们忽略了这个Bug(如果是Bug的话),毕竟国内常用的微信、微博、QQ一切正常。

    这个问题我会持续追踪,看看后期系统更新会不会解决这个问题。另外我也在Twitter官网上提问了。目前为止还没有回应。

    In iOS11,Use UIActivityViewController to share have no reaction

    相关文章

      网友评论

      • fac10c576862:使用ipad测试,我尝试的情况是twiter可以,facebook点击无反应,系统相册的分享也是这个结果,仅供参考
      • 嘞似彩笔:纠结了好久... 也是国外客户说他的可以... 终于知道原因了。:joy:
      • 像个被吓坏的孩子:今天遇到同样的问题,你写的真的非常详细。非常棒
        cc412:多谢夸奖:v:

      本文标题:UIActivityViewController 在iOS11上

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