配置Share Extension
設(shè)置允許發(fā)送的數(shù)據(jù)類(lèi)型:text紧帕、url、image桅打、mp3是嗜、mp4、pdf挺尾、word鹅搪、excel、ppt
處理Share Extension中的數(shù)據(jù)遭铺。
Share Extension中默認(rèn)都會(huì)有一個(gè)數(shù)據(jù)展現(xiàn)的UI界面丽柿。該界面繼承SLComposeServiceViewController這個(gè)類(lèi)型,如:(這是系統(tǒng)幫我們生成的)
#import <UIKit/UIKit.h>
#import <Social/Social.h>
@interface ShareViewController : SLComposeServiceViewController
@end
當(dāng)然我們也可以自定義新的控制器魂挂,并在Share Extension的plist里做下對(duì)應(yīng)的匹配
處理Share Extension中的數(shù)據(jù)
分享界面頂部包括了標(biāo)題甫题、取消(Cancel)按鈕和提交(Post)按鈕。然后下面跟著左邊就是一個(gè)文本編輯框涂召,右邊就是一個(gè)圖片顯示控件坠非。那么,每當(dāng)用戶(hù)點(diǎn)擊取消按鈕或者提交按鈕時(shí)果正,都會(huì)分別觸發(fā)下面的方法:
/**
* 點(diǎn)擊取消按鈕
*/
- (void)didSelectCancel
{
[super didSelectCancel];
}
/**
* 點(diǎn)擊提交按鈕
*/
- (void)didSelectPost
{
[self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
}
在這兩個(gè)方法里面可以進(jìn)行一些自定義的操作炎码。一般情況下,當(dāng)用戶(hù)點(diǎn)擊提交按鈕的時(shí)候舱卡,擴(kuò)展要做的事情就是要把數(shù)據(jù)取出來(lái)辅肾,并且放入一個(gè)與Containing App(** 容器程序,盡管蘋(píng)果開(kāi)放了Extension轮锥,但是在iOS中extension并不能單獨(dú)存在,要想提交到AppStore要尔,必須將Extension包含在一個(gè)App中提交舍杜,并且App的實(shí)現(xiàn)部分不能為空,這個(gè)包含Extension的App就叫Containing app新娜。Extension會(huì)隨著Containing App的安裝而安裝,同時(shí)隨著ContainingApp的卸載而卸載既绩。)共享的數(shù)據(jù)介質(zhì)中(包括NSUserDefault概龄、Sqlite、CoreData)饲握,要跟容器程序進(jìn)行數(shù)據(jù)交互需要借助AppGroups服務(wù)私杜,下面先來(lái)看看怎么獲取擴(kuò)展中的數(shù)據(jù)。
在ShareExtension中救欧,UIViewController包含一個(gè)ExtensionContext這樣的上下文對(duì)象衰粹,NSExtensionContext的結(jié)構(gòu)比較簡(jiǎn)單,包含一個(gè)屬性和三個(gè)方法笆怠。其說(shuō)明如下:
類(lèi)的下面還定義了一些通知铝耻,這些通知都是跟宿主程序的行為相關(guān),在設(shè)計(jì)擴(kuò)展的時(shí)候可以根據(jù)這些通知來(lái)進(jìn)行對(duì)應(yīng)的操作蹬刷。其說(shuō)明如下:
從inputItems中獲取數(shù)據(jù)
inputItems是包含NSExtensionItem類(lèi)型對(duì)象的數(shù)組瓢捉。
NSExtensionItem包含四個(gè)屬性:
對(duì)應(yīng)userInfo結(jié)構(gòu)中的NSExtensionItem屬性的鍵名如下:
為了要取到宿主程序提供的數(shù)組,那么只要關(guān)注loadItemTypeIdentifier:options:completionHandler方法的使用即可办成。有了上面的了解泡态,那么接下來(lái)就是對(duì)inputItems進(jìn)行數(shù)據(jù)分析并提取了,這里以一個(gè)鏈接的分享為例迂卢,改寫(xiě)視圖控制器中的didSelectPost方法兽赁。看下面的代碼:
- (void)didSelectPost
{
__block BOOL hasExistsUrl = NO;
[self.extensionContext.inputItems enumerateObjectsUsingBlock:^(NSExtensionItem * _Nonnull extItem, NSUInteger idx, BOOL * _Nonnull stop) {
[item.attachments enumerateObjectsUsingBlock:^(NSItemProvider * _Nonnull itemProvider, NSUInteger idx, BOOL * _Nonnull stop) {
if ([itemProvider hasItemConformingToTypeIdentifier:@"public.url"])
{
[itemProvider loadItemForTypeIdentifier:@"public.url"
options:nil
completionHandler:^(id<NSSecureCoding> _Nullable item, NSError * _Null_unspecified error) {
if ([(NSObject *)item isKindOfClass:[NSURL class]])
{
NSLog(@"分享的URL = %@", item);
}
}];
hasExistsUrl = YES;
*stop = YES;
}
}];
if (hasExistsUrl)
{
*stop = YES;
}
}];
// This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments.
// Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context.
// [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];
}
上面的例子中遍歷了extensionContext的inputItems數(shù)組中所有NSExtensionItem對(duì)象冷守,然后從這些對(duì)象中遍歷attachments數(shù)組中的所有NSItemProvider對(duì)象刀崖。匹配第一個(gè)包含public.url標(biāo)識(shí)的附件(具體要匹配什么資源,數(shù)量是多少皆有自己的業(yè)務(wù)所決定)拍摇。
- 注意:在上面代碼中注釋了[self.extensionContext completeRequestReturningItems:@[] completionHandler:nil];這行代碼亮钦,主要是使到視圖控制器不被關(guān)閉,等到實(shí)現(xiàn)相應(yīng)的處理后再進(jìn)行調(diào)用該方法充活,對(duì)分享視圖進(jìn)行關(guān)閉蜂莉。
ios 跨軟件傳輸數(shù)據(jù)之系統(tǒng)Share Extension創(chuàng)建與分享(一)
ios 跨軟件傳輸數(shù)據(jù)之Share Extension的配置與外部數(shù)據(jù)獲取(二)
ios 跨軟件傳輸數(shù)據(jù)之Share Extension將分享數(shù)據(jù)傳遞給容器程序(三)
ios 跨軟件傳輸數(shù)據(jù)之Share Extension容器程序數(shù)據(jù)處理與上線(四)