iOS随笔iOS开发

UIActivityViewController 在iOS11上

2017-11-28  本文已影响120人  cc412

最近在做针对国外用户的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以后没有任何反应。下面开始排查问题。

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

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

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

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

都更新到最新的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

上一篇下一篇

猜你喜欢

热点阅读