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ù)的交互蜒茄。為此,蘋果提供了一項叫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的)


    配置App ID

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

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


    設(shè)置AppGroup

激活A(yù)ppGroup特性

  • 點擊+號添加一個App Groups胜臊,點擊OK按鈕:


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

設(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;
        }

    }];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烁巫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宠能,更是在濱河造成了極大的恐慌亚隙,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件违崇,死亡現(xiàn)場離奇詭異阿弃,居然都是意外死亡诊霹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門渣淳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脾还,“玉大人,你說我怎么就攤上這事入愧”陕” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵棺蛛,是天一觀的道長怔蚌。 經(jīng)常有香客問我,道長鞠值,這世上最難降的妖魔是什么媚创? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮彤恶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鳄橘。我一直安慰自己声离,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布瘫怜。 她就那樣靜靜地躺著术徊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鲸湃。 梳的紋絲不亂的頭發(fā)上赠涮,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機(jī)與錄音暗挑,去河邊找鬼笋除。 笑死,一個胖子當(dāng)著我的面吹牛炸裆,可吹牛的內(nèi)容都是我干的垃它。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼烹看,長吁一口氣:“原來是場噩夢啊……” “哼国拇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惯殊,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤酱吝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后土思,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體务热,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡忆嗜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了陕习。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霎褐。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖该镣,靈堂內(nèi)的尸體忽然破棺而出冻璃,到底是詐尸還是另有隱情,我是刑警寧澤损合,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布省艳,位于F島的核電站,受9級特大地震影響嫁审,放射性物質(zhì)發(fā)生泄漏跋炕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一律适、第九天 我趴在偏房一處隱蔽的房頂上張望辐烂。 院中可真熱鬧,春花似錦捂贿、人聲如沸纠修。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扣草。三九已至,卻和暖如春颜屠,著一層夾襖步出監(jiān)牢的瞬間辰妙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工甫窟, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留密浑,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓蕴坪,卻偏偏與公主長得像肴掷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子背传,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,689評論 2 354