美文网首页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