ios 跨軟件傳輸數(shù)據(jù)之Share Extension將分享數(shù)據(jù)傳遞給容器程序(三)

上面章節(jié)已經(jīng)講述了如何取得宿主應(yīng)用所分享的內(nèi)容。那么,接下來就是將這些內(nèi)容傳遞給容器程序進(jìn)行相應(yīng)的操作(如:在一款社交應(yīng)用中,可能會(huì)為取得的分享內(nèi)容發(fā)布一條用戶動(dòng)態(tài))。在默認(rèn)情況下,iOS的應(yīng)用是存在一個(gè)沙盒里面的,不允許應(yīng)用與應(yīng)用直接進(jìn)行數(shù)據(jù)的交互。為此,蘋果提供了一項(xiàng)叫App Groups的服務(wù),該服務(wù)允許開發(fā)者可以在自己的應(yīng)用之間通過NSUserDefaults、NSFileManager或者CoreData來進(jìn)行相互的數(shù)據(jù)傳輸。下面介紹如何激活A(yù)pp Groups服務(wù):

  • 首先要有一個(gè)獨(dú)立的AppID(帶通配符*號的AppID是不允許激活A(yù)pp Groups的)


    配置App ID

使用AppGroup如果之前已經(jīng)創(chuàng)建好的有不帶有*號的App ID 可以直接編輯App ID把App Groups選中,然后編輯并添加 App Groups ID。

  • 然后打開容器應(yīng)用的項(xiàng)目配置的Capabilities頁簽,激活A(yù)pp Groups特性,如圖:


    設(shè)置AppGroup

激活A(yù)ppGroup特性

  • 點(diǎn)擊+號添加一個(gè)App Groups,點(diǎn)擊OK按鈕:


    企業(yè)微信截圖_8a7b2296-9edf-48ca-9689-17df5e2c05c0.png

設(shè)置Group名稱

  • 創(chuàng)建完成后,XCode會(huì)自動(dòng)把應(yīng)用添加到新建的分組中。如圖:


    激活特性

容器程序啟用AppGroup

  • 上述步驟完成后,容器程序的App Groups已經(jīng)算是設(shè)置完成。然后輪到Share Extension插件需要激活A(yù)pp Groups服務(wù),設(shè)置步驟跟容器程序相同,唯一不同的是,插件不需要?jiǎng)?chuàng)建新的App Group,只要加入到容器程序剛才創(chuàng)建的Group即可(這里可以理解為,哪些應(yīng)用要實(shí)現(xiàn)共享數(shù)據(jù),那么他們必須在同一個(gè)Group里面)。如圖:


    勾選啟用

擴(kuò)展程序啟用AppGroup

至此,應(yīng)用和擴(kuò)展的App Groups服務(wù)都已經(jīng)啟動(dòng),現(xiàn)在就要進(jìn)行分享內(nèi)容的傳輸操作。下面分別介紹一下NSUserDefaults、NSFileManager以及CoreData三種方式是如何實(shí)現(xiàn)App Groups下的數(shù)據(jù)操作:

  • NSUserDefaults:要想設(shè)置或訪問Group的數(shù)據(jù),不能在使用standardUserDefaults方法來獲取一個(gè)NSUserDefaults對象了。應(yīng)該使用initWithSuiteName:方法來初始化一個(gè)NSUserDefaults對象,其中的SuiteName就是創(chuàng)建的Group的名字,然后利用這個(gè)對象來實(shí)現(xiàn),跨應(yīng)用的數(shù)據(jù)讀寫,代碼如下:
//初始化一個(gè)供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ǔ)上實(shí)現(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:其實(shí)CoreData是基于NSFileManager取得共享目錄后來實(shí)現(xiàn)數(shù)據(jù)共享的。即在初始化CoreData時(shí),先使用NSFileManager取得共享目錄,然后再指定共享目錄為存儲(chǔ)數(shù)據(jù)文件的目錄(如存儲(chǔ)的sqlite文件)。代碼如下:
//獲取分組的共享項(xiàng)目
NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.cn.vimfung.ShareExtensionDemo"];
NSURL *storeURL = [containerURL URLByAppendingPathComponent:@"DataModel.sqlite"];

//初始化持久化存儲(chǔ)調(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];
}];

為了方便演示,這里會(huì)使用NSUserDefault來直接把取到的url地址保存起來。代碼如下所示:

/**
 *  點(diǎn)擊提交按鈕
 */
- (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;
        }

    }];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容