上面章節(jié)已經(jīng)講述了如何取得宿主應(yīng)用所分享的內(nèi)容挺勿。那么,接下來就是將這些內(nèi)容傳遞給容器程序進(jìn)行相應(yīng)的操作(如:在一款社交應(yīng)用中,可能會為取得的分享內(nèi)容發(fā)布一條用戶動態(tài))烟阐。在默認(rèn)情況下,iOS的應(yīng)用是存在一個沙盒里面的紊扬,不允許應(yīng)用與應(yīng)用直接進(jìn)行數(shù)據(jù)的交互蜒茄。為此,蘋果提供了一項叫App Groups的服務(wù)珠月,該服務(wù)允許開發(fā)者可以在自己的應(yīng)用之間通過NSUserDefaults扩淀、NSFileManager或者CoreData來進(jìn)行相互的數(shù)據(jù)傳輸。下面介紹如何激活A(yù)pp Groups服務(wù):
-
首先要有一個獨立的AppID(帶通配符*號的AppID是不允許激活A(yù)pp Groups的)
使用AppGroup如果之前已經(jīng)創(chuàng)建好的有不帶有*號的App ID 可以直接編輯App ID把App Groups選中啤挎,然后編輯并添加 App Groups ID驻谆。
-
然后打開容器應(yīng)用的項目配置的Capabilities頁簽卵凑,激活A(yù)pp Groups特性,如圖:
激活A(yù)ppGroup特性
-
點擊+號添加一個App Groups胜臊,點擊OK按鈕:
設(shè)置Group名稱
-
創(chuàng)建完成后勺卢,XCode會自動把應(yīng)用添加到新建的分組中。如圖:
容器程序啟用AppGroup
-
上述步驟完成后象对,容器程序的App Groups已經(jīng)算是設(shè)置完成黑忱。然后輪到Share Extension插件需要激活A(yù)pp Groups服務(wù),設(shè)置步驟跟容器程序相同勒魔,唯一不同的是甫煞,插件不需要創(chuàng)建新的App Group,只要加入到容器程序剛才創(chuàng)建的Group即可(這里可以理解為冠绢,哪些應(yīng)用要實現(xiàn)共享數(shù)據(jù)抚吠,那么他們必須在同一個Group里面)。如圖:
擴(kuò)展程序啟用AppGroup
至此弟胀,應(yīng)用和擴(kuò)展的App Groups服務(wù)都已經(jīng)啟動楷力,現(xiàn)在就要進(jìn)行分享內(nèi)容的傳輸操作。下面分別介紹一下NSUserDefaults孵户、NSFileManager以及CoreData三種方式是如何實現(xiàn)App Groups下的數(shù)據(jù)操作:
- NSUserDefaults:要想設(shè)置或訪問Group的數(shù)據(jù)萧朝,不能在使用standardUserDefaults方法來獲取一個NSUserDefaults對象了。應(yīng)該使用initWithSuiteName:方法來初始化一個NSUserDefaults對象夏哭,其中的SuiteName就是創(chuàng)建的Group的名字检柬,然后利用這個對象來實現(xiàn),跨應(yīng)用的數(shù)據(jù)讀寫方庭,代碼如下:
//初始化一個供App Groups使用的NSUserDefaults對象
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.cn.vimfung.ShareExtensionDemo"];
//寫入數(shù)據(jù)
[userDefaults setValue:@"value" forKey:@"key"];
//讀取數(shù)據(jù)
NSLog(@"%@", [userDefaults valueForKey:@"key"]);
- NSFileManager:通過調(diào)用 containerURLForSecurityApplicationGroupIdentifier:方法可以獲得AppGroup的共享目錄厕吉,然后在此目錄的基礎(chǔ)上實現(xiàn)任意的文件操作。代碼如下:
//獲取分組的共享目錄
NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.cn.vimfung.ShareExtensionDemo"];
NSURL *fileURL = [groupURL URLByAppendingPathComponent:@"demo.txt"];
//寫入文件
[@"abc" writeToURL:fileURL atomically:YES encoding:NSUTF8StringEncoding error:nil];
//讀取文件
NSString *str = [NSString stringWithContentsOfURL:fileURL encoding:NSUTF8StringEncoding error:nil];
NSLog(@"str = %@", str);
- CoreData:其實CoreData是基于NSFileManager取得共享目錄后來實現(xiàn)數(shù)據(jù)共享的械念。即在初始化CoreData時头朱,先使用NSFileManager取得共享目錄,然后再指定共享目錄為存儲數(shù)據(jù)文件的目錄(如存儲的sqlite文件)龄减。代碼如下:
//獲取分組的共享項目
NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.cn.vimfung.ShareExtensionDemo"];
NSURL *storeURL = [containerURL URLByAppendingPathComponent:@"DataModel.sqlite"];
//初始化持久化存儲調(diào)度器
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DataModel" withExtension:@"momd"];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
[coordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:nil
error:nil];
//創(chuàng)建受控對象上下文
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[context performBlockAndWait:^{
[context setPersistentStoreCoordinator:coordinator];
}];
為了方便演示项钮,這里會使用NSUserDefault來直接把取到的url地址保存起來。代碼如下所示:
/**
* 點擊提交按鈕
*/
- (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);
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.cn.vimfung.ShareExtensionDemo"];
[userDefaults setValue: ((NSURL *)item).absoluteString forKey:@"share-url"];
//用于標(biāo)記是新的分享
[userDefaults setBool:YES forKey:@"has-new-share"];
}
}];
hasExistsUrl = YES;
*stop = YES;
}
}];
if (hasExistsUrl)
{
*stop = YES;
}
}];