licc

心有猛虎 细嗅蔷薇

0%

UIActivityViewController 在iOS11上的坑

最近在做针对国外用户的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无关

  • 猜想三:Great Wall

    香港的朋友试试他的手机。依旧无解

  • 猜想四: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