美文网首页
mac开发系列22:cocoa share extension

mac开发系列22:cocoa share extension

作者: 悲观患者 | 来源:发表于2017-08-14 11:54 被阅读96次

    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

    相关文章

      网友评论

          本文标题:mac开发系列22:cocoa share extension

          本文链接:https://www.haomeiwen.com/subject/rrqurxtx.html