×
广告

UIActivityViewController 牛刀小试:iOS 8 一键分享

96
seedante
2015.05.20 21:23* 字数 751

今天想把社交分享的功能完成,但由于孤陋寡闻没听说过这个类,搜索了几个几年前的第三方库来完成这个功能,甚至还花了大半个小时在源代码里看别人怎么实现的,还没瞧出来的时候搜索到了 UIActivityViewController,要是有人提点就不用花费这么长时间了。不过话也说回来,搜索的关键字精准度不高,我用的是 iOS 8 social share api。总算找到了路,以后得注意学习下专业术语,不然有 google 也不会用。另外,写这篇文章来记录的时候也发现还有 Social 框架专用于社交媒体分享;去年 iOS 8 的一个重大的新功能扩展(EXtension)也支持分享功能。最近学习 WWDC 和 Swift,越发觉得 iOS8 是个非常重大的版本更新,特别是对开发者,可惜,我到现在也没接触过多少。今天先讲UIActivityViewController吧。

UIActivityViewController 使用起来非常简单,可分享的去处多了去了,需要我们写的也没有几行代码,苹果已经完成了大部分的底层代码。不过,我也注意到没法集成 Facebook 和 twitter,搜索发现这个问题很普遍而且至今没有得到有效解决,看这里:No FB and TW share icon on iOS 7, 最新的回答表示在 iOS 8.3 上也没有解决,即使在真机上设置好了相关帐号。但是,Photos 里是可以用的,即使没有设置帐号也会进一步提示设置帐号。苹果,你又不厚道了,好东西都自己留着,扔个阉割版出来给开发者。

示例:
最简单的配置只需要设置好需要分享的数据,可以是文本信息、图像和链接,支持的服务都会提供。

NSString *info = @"share test";
UIImage *image=[UIImage imageNamed:@"UIBarButtonItemGrid.png"];
NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
NSArray *postItems=@[info, image, url];

UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:postItems applicationActivities:nil];
//controller.excludedActivityTypes = @[UIActivityTypePostToFacebook];    
//if iPhone
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    [self presentViewController:controller animated:YES completion:nil];
}
//if iPad
else {
    // Change Rect to position Popover
    UIBarButtonItem *shareBarButtonItem = self.navigationItem.leftBarButtonItem;
    UIPopoverController *popup = [[UIPopoverController alloc] initWithContentViewController:controller];
    [popup presentPopoverFromBarButtonItem:shareBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

进阶设置:
1.生成实例时提供一组 UIActivity 对象来提供自定义的服务。
2.配置 completionWithItemsHandler 属性使得完成了操作或是取消操作后执行其他收尾动作。
3.配置 excludedActivityTypes 来指定不需要提供的操作。

在 iPad 上UIActivityViewController 以 popover 的方式显示(但显然苹果有更好的显示方式,Modal 模式,看 Photos 里的页面,不厚道+1),不然会有运行时错误:UIActivityViewController crashing on iOS8 iPads。在 iOS 8 里UIActivityViewController 的这种显示方式是以新类UIPopoverPresentation Controller 为基础的。popover 方式需要一个挂靠点, UIPopoverPresentationController支持三种方式来设置挂靠点:
1.barButtonItem
2.sourceView
3.sourceRect

NSHipster 上这篇文章对 UIActivityViewController 解析得很深入:社交分享只是小试牛刀而已,该类的真正用处是为不同服务提供数据传输。

iOS 入门系列
Web note ad 1