UIActivityViewController
UIActivityViewController 【UIActivityViewController】iOS 系统中提供了一些标准服务,如拷贝文本到剪切板、分享图片或链接到社交媒体、发送邮件等等。
我们可以通过这个类来调用这些标准的服务:
NSString *shareText = @"百度";
UIImage *shareImage = [UIImage imageNamed:@"icon"];
NSURL *shareUrl = [NSURL URLWithString:@"https://baidu.com"];
NSArray *activityItemsArray = @[shareText,shareImage,shareUrl];
UIActivityViewController *vc = [[UIActivityViewController alloc]initWithActivityItems:activityItemsArray
applicationActivities:nil];
vc.modalInPopover = YES;
[self presentViewController:vc animated:YES completion:nil];
除了系统的标准服务外,还可以通过创建
UIActivity
子类来定义自己的服务,具体细节可以参见 NShipster 的博文。但是这种方式创建的服务只能够被自己的应用所使用,如果想要创建一个服务可以被其他应用使用,则需要通过创建扩展程序来实现。
SLComposeServiceViewController 在使用模版创建
Share Extension
扩展时,会自动创建一个继承 SLComposeServiceViewController
类的控制器,其提供了一个简单的分享界面。通过重写下面的两个方法来实现对分享以及取消分享后的操作:
- (void)didSelectPost;
- (void)didSelectCancel;
另外,对于 iPhone 设备而言,该类还提供了相关方法用来在分享界面下方添加一些额外设置。
- (NSArray *)configurationItems;
- (void)reloadConfigurationItems;
- (void)pushConfigurationViewController:(UIViewController *)viewController;
- (void)popConfigurationViewController;
重写
configurationItems
方法,返回一个包含 SLComposeSheetConfigurationItem
类实例的数组,调用 reloadConfigurationItems
方法会刷新分享界面,自定义的选项则显示在分享界面下方。如果选择项有额外细节需要确定,那么可以定义一个 UIViewController 实例对象,并使用
pushConfigurationViewController:
显示该详细界面,进行设置,完毕后,调用 popConfigurationViewController
方法返回。SLComposeSheetConfigurationItem 用来表示选择项,包含一个标题和相应值,并且提供了一个触摸 block 事件,可以用来修改值或显示具体细节等。
但是在使用时,注意避免强引用当前控制器或当前选择项,否则会造成循环引用。
如果进行扩展后的分享视图仍然不符合需求,那么可以自定义分享界面。
一种方法是修改分享扩展的
Info.plist
文件,删除 NSExtension
下的 NSExtensionMainStoryboard
选项,并添加 NSExtensionPrincipalClass
选项,值指定为自定义的控制器类。另一种方法,如果仍然是使用
.storyboard
文件设计分享界面,那么可以直接将自动创建的 ShareViewController
类的父类从 SLComposeServiceViewController
修改为 UIViewController
,而不必变更 Info.plist
文件。这样,设计好的标准分享服务便可以为其他调用系统服务的应用进行服务了,当然,前提是该应用被其他人安装。
除了定义自己的分享标准服务外,框架
Social.framework
中还给出了 SLComposeViewController
类,用来向系统支持的社交媒体分享文本、图片或者链接。而且,还通过
SLRequest
类提供了创建请求社交媒体数据请求报文的方法。通过 performRequestWithHandler:
方法,发送创建的请求,达到分享数据或者获取用户数据的目的。当然,除了
Share Extension
扩展外,还有 Action Extension
扩展,该扩展更多的是处理传递而来的数据,而不仅仅是进行分享。感兴趣的话,可以看看这几篇文章:App Extension、Share Extension、Action Extension
推荐阅读
- iOS|iOS 原生UIActivityViewController(分享功能)
- 功能|使用UIActivityViewController分享时,限制分享
- iOS UIActivityViewController/UIActivity 自定义不显示问题
- Apple开发疑难秒懂百科|SwiftUI完美弹出UIActivityViewController(通过微信、QQ或隔空投送分享)的应用分享窗口
- 【Objective-C】在|【Objective-C】在 UIButton 上添加 UIActivityIndicator 及设置大小