1、简介
share extension是苹果提供的众多extension之一,顾名思义,即作为app的一个扩展,用来支持其他app分享内容到扩展所属的app,例如mac微信的share extension,就支持把finder里的文件和safari的网页分享到mac微信,如下图所示:


2、 实现流程
2.1)新建share extension,share extension是mac微信project的活跃(主)target的(embed)子target,主target的bundle id必须是share extension的前缀。编译时,如果发现缺少链接库,就到target的Build Phases中加上。





2.2)编译通过并不代表能运行成功。share extension必须在entitlements文件中开启sandbox(就目前的理解而言,是因为苹果把share extension target和主target看作两个相对独立的实体,必须用sandbox进行权限隔离,只能通过特定方式进行交互)

另外,还要指定正确的Development Team,Provisioning Profile以及Code Signing Identity,即三者要配套,依次包含。Code Signing Identity中的Mac Developer,对应于Provisioning Profile中的Automatic,表示由xcode 8自动查找匹配的证书。

2.3)工作原理图如下:

share extension与host app之间需要指定支持分享的数据类型,即在其Info.plist中配置NSExtensionActivationRule对应的值,如下示例:

share extension与host app之间通过extensionContext对象进行交互,代码示例如下,详情可参考生成的ShareViewController.m文件,以及官方文档:
m_extensionItem = self.extensionContext.inputItems.firstObject;
[self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
share extension可以访问的host app的文件夹以及权限,都需要指定:

share extension与主target(containing app)之间不能进行代码共享,当extension要用到主target的一些文件时,例如相同的UI控件代码,就只能copy一份(虽然这会让工程显得很臃肿),听说有一种动态链接库技术可以实现代码共享,但是笔者还没研究过。
share extension与主target(containing app)之间的数据共享,需要配置App Groups :



共享文件夹可由如下代码获取,用来存取数据文件:
NSFileManager *oFileMgr = [NSFileManager defaultManager];NSURL *sharedFolder = [oFileMgr containerURLForSecurityApplicationGroupIdentifier:SHARE_FOLDER_NAME];
共享key-value数据,则可以使用NSUserDefaults,如下所示:
[[NSUserDefaults alloc] initWithSuiteName: SHARE_FOLDER_NAME]; // SHARE_FOLDER_NAME就是配置的共享文件夹名字
share extension与主target(containing app)之间的实时通信,需要使用NSDistributedNotificationCenter来收发Notification,如下所示:
[[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"WeChatMacShare_Notification" object:nil userInfo:nil deliverImmediately:YES];
[[[NSDistributedNotificationCenter defaultCenter] rac_addObserverForName:@"WeChatMacShare_Notification" object:nil] subscribeNext:^(NSNotification *obj) {
// do something when recv a notification
}];
2.4)share extension判断mac微信是否在线,以及拉起微信:
[NSRunningApplication runningApplicationsWithBundleIdentifier:bundleId];
[[NSWorkspace sharedWorkspace] launchApplication:@"/Applications/WeChat.app"];
3、目前发现sandbox是没法跟第三方自动更新插件兼容的。
官方文档链接:
https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/Share.html
网友评论