mac開發(fā)系列22:cocoa share extension

1、簡介
share extension是蘋果提供的眾多extension之一,顧名思義,即作為app的一個擴展,用來支持其他app分享內(nèi)容到擴展所屬的app,例如mac微信的share extension,就支持把finder里的文件和safari的網(wǎng)頁分享到mac微信,如下圖所示:




2、 實現(xiàn)流程
2.1)新建share extension,share extension是mac微信project的活躍(主)target的(embed)子target,主target的bundle id必須是share extension的前綴。編譯時,如果發(fā)現(xiàn)缺少鏈接庫,就到target的Build Phases中加上。







2.2)編譯通過并不代表能運行成功。share extension必須在entitlements文件中開啟sandbox(就目前的理解而言,是因為蘋果把share extension target和主target看作兩個相對獨立的實體,必須用sandbox進行權(quán)限隔離,只能通過特定方式進行交互)



另外,還要指定正確的Development Team,Provisioning Profile以及Code Signing Identity,即三者要配套,依次包含。Code Signing Identity中的Mac Developer,對應(yīng)于Provisioning Profile中的Automatic,表示由xcode 8自動查找匹配的證書。

2.3)工作原理圖如下:

share extension與host app之間需要指定支持分享的數(shù)據(jù)類型,即在其Info.plist中配置NSExtensionActivationRule對應(yīng)的值,如下示例:

share extension與host app之間通過extensionContext對象進行交互,代碼示例如下,詳情可參考生成的ShareViewController.m文件,以及官方文檔:
m_extensionItem = self.extensionContext.inputItems.firstObject;

[self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];

share extension可以訪問的host app的文件夾以及權(quán)限,都需要指定:



share extension與主target(containing app)之間不能進行代碼共享,當(dāng)extension要用到主target的一些文件時,例如相同的UI控件代碼,就只能copy一份(雖然這會讓工程顯得很臃腫),聽說有一種動態(tài)鏈接庫技術(shù)可以實現(xiàn)代碼共享,但是筆者還沒研究過。
share extension與主target(containing app)之間的數(shù)據(jù)共享,需要配置App Groups :





共享文件夾可由如下代碼獲取,用來存取數(shù)據(jù)文件:
NSFileManager *oFileMgr = [NSFileManager defaultManager];NSURL *sharedFolder = [oFileMgr containerURLForSecurityApplicationGroupIdentifier:SHARE_FOLDER_NAME];

共享key-value數(shù)據(jù),則可以使用NSUserDefaults,如下所示:
[[NSUserDefaults alloc] initWithSuiteName: SHARE_FOLDER_NAME]; // SHARE_FOLDER_NAME就是配置的共享文件夾名字

share extension與主target(containing app)之間的實時通信,需要使用NSDistributedNotificationCenter來收發(fā)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、目前發(fā)現(xiàn)sandbox是沒法跟第三方自動更新插件兼容的。
官方文檔鏈接:
https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/Share.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容