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

上面章節(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ù)的交互乌逐。為此,蘋果提供了一項(xiàng)叫App Groups的服務(wù)绢慢,該服務(wù)允許開發(fā)者可以在自己的應(yīng)用之間通過NSUserDefaults胰舆、NSFileManager或者CoreData來進(jìn)行相互的數(shù)據(jù)傳輸蹬挤。下面介紹如何激活A(yù)pp Groups服務(wù):

  • 首先要有一個獨(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)擊+號添加一個App Groups,點(diǎn)擊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)用要實(shí)現(xiàn)共享數(shù)據(jù),那么他們必須在同一個Group里面)菇晃。如圖:


    勾選啟用

擴(kuò)展程序啟用AppGroup

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

  • NSUserDefaults:要想設(shè)置或訪問Group的數(shù)據(jù),不能在使用standardUserDefaults方法來獲取一個NSUserDefaults對象了估灿。應(yīng)該使用initWithSuiteName:方法來初始化一個NSUserDefaults對象崇呵,其中的SuiteName就是創(chuàng)建的Group的名字,然后利用這個對象來實(shí)現(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ǔ)上實(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時抵窒,先使用NSFileManager取得共享目錄,然后再指定共享目錄為存儲數(shù)據(jù)文件的目錄(如存儲的sqlite文件)叠骑。代碼如下:
//獲取分組的共享項(xiàng)目
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地址保存起來。代碼如下所示:

/**
 *  點(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)系作者
  • 序言:七十年代末疙赠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子朦拖,更是在濱河造成了極大的恐慌圃阳,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件璧帝,死亡現(xiàn)場離奇詭異捍岳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)睬隶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門锣夹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人苏潜,你說我怎么就攤上這事银萍。” “怎么了恤左?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵贴唇,是天一觀的道長。 經(jīng)常有香客問我飞袋,道長戳气,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任巧鸭,我火速辦了婚禮瓶您,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纲仍。我一直安慰自己呀袱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布郑叠。 她就那樣靜靜地躺著夜赵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锻拘。 梳的紋絲不亂的頭發(fā)上油吭,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天击蹲,我揣著相機(jī)與錄音,去河邊找鬼婉宰。 笑死歌豺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的心包。 我是一名探鬼主播类咧,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蟹腾!你這毒婦竟也來了痕惋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤娃殖,失蹤者是張志新(化名)和其女友劉穎值戳,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炉爆,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堕虹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了芬首。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赴捞。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖郁稍,靈堂內(nèi)的尸體忽然破棺而出赦政,到底是詐尸還是另有隱情,我是刑警寧澤耀怜,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布恢着,位于F島的核電站,受9級特大地震影響封寞,放射性物質(zhì)發(fā)生泄漏然评。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一狈究、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盏求,春花似錦抖锥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荆烈,卻和暖如春拯勉,著一層夾襖步出監(jiān)牢的瞬間竟趾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工宫峦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岔帽,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓导绷,卻偏偏與公主長得像犀勒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妥曲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

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