在 App 扩展和主 App 间共享数据
?
tags: iOS 8,Swift,App Groups
隨著 iOS 8 的發(fā)布,蘋(píng)果為廣大開(kāi)發(fā)者很多新的 API,其中最突出顯著的就非 App Extension 莫屬了。這為開(kāi)發(fā)者們又帶來(lái)了很多機(jī)會(huì)。
而我們?cè)陂_(kāi)發(fā) App Extension 的時(shí)候,基本大多數(shù)人都會(huì)遇到這樣一個(gè)問(wèn)題。就是由于 App Store 的規(guī)則是 App Extension 不能獨(dú)立的發(fā)布,而是要跟隨一個(gè)宿主應(yīng)用一起發(fā)布。
比如奇妙清單:
我們看到,通過(guò) App 擴(kuò)展,奇妙清單將主 App 的任務(wù)數(shù)據(jù)顯示到了通知中心上面。而這個(gè)通知中心插件的數(shù)據(jù)是來(lái)自它的主應(yīng)用的。
要達(dá)到這個(gè)效果,就需要這兩個(gè) App 之間的數(shù)據(jù)進(jìn)行共享。注意,是兩個(gè)獨(dú)立的應(yīng)用哦。App 擴(kuò)展雖然是以插件形式附屬在主 App 中的,但它也作為一個(gè)獨(dú)立的 App。
在兩個(gè)獨(dú)立的應(yīng)用間共享存儲(chǔ)數(shù)據(jù)有什么方法呢?這就需要 App Groups 的概念。
從名字就可以看出來(lái)啦,App Groups 就是應(yīng)用分組,將不同的應(yīng)用分到一個(gè) App Groups 中,即可在這些應(yīng)用之間共享數(shù)據(jù)。
具體操作流程如下:
在項(xiàng)目的設(shè)置界面中找到應(yīng)用的 Target,然后選擇 Capabilities 選項(xiàng)卡,然后會(huì)列出很多選項(xiàng),往下拉就會(huì)找到 App Groups 選項(xiàng),我們打開(kāi)它的開(kāi)關(guān)。如下圖:
(注意一點(diǎn):打開(kāi) App Groups 需要關(guān)聯(lián)你的蘋(píng)果開(kāi)發(fā)者賬號(hào)。所以在這之前,你還需要擁有一個(gè)蘋(píng)果開(kāi)發(fā)者賬號(hào)。)
成功開(kāi)啟后,會(huì)出現(xiàn) App Groups 設(shè)置界面。點(diǎn)擊下方的加號(hào)按鈕,來(lái)添加一個(gè)新的 App Groups。如下圖:
App Groups 的命名規(guī)則和 Bundle Identifier 一樣,都是使用反向 DNS 規(guī)則。比如 group.app.test
添加完成后,新的 Group 就會(huì)顯示在設(shè)置界面上,我們將它左邊的復(fù)選框勾選上,就完成了。
到此為止,主 App 的設(shè)置步驟就完成了,下面我們還要對(duì)擴(kuò)展 App 進(jìn)行類(lèi)似的操作。首先還是找到 App Groups 選項(xiàng)框,并打開(kāi)開(kāi)關(guān)。
(注意:這次我們的 Target 選擇的是 extension)
打開(kāi)開(kāi)關(guān)后,這次和剛才的操作步驟有所不同,因?yàn)槲覀冎耙呀?jīng)創(chuàng)建過(guò) App Groups 了,這次就不需要?jiǎng)?chuàng)建新的了,只需要點(diǎn)擊 App Groups 設(shè)置界面中的刷新按鈕,就可以看到我們之前創(chuàng)建過(guò)的 Group 了。
然后勾選上即可完成 App 擴(kuò)展 的 Group 設(shè)置。
這些基本設(shè)置操作完成后,我們就可以在這兩個(gè) App 之間進(jìn)行數(shù)據(jù)共享啦。大家可以想一想,我們用什么方法進(jìn)行數(shù)據(jù)共享比較合適呢?
其實(shí)很簡(jiǎn)單啦,就是我們熟悉的 NSUserDefaults 了。相信每一位朋友對(duì)這個(gè)類(lèi)都不陌生。沒(méi)想到吧,它還有共享數(shù)據(jù)這個(gè)作用。如果仔細(xì)查看它的文檔,你就會(huì)發(fā)現(xiàn)它還有這樣一個(gè)初始化方法 initWithSuiteName: 而官方文檔上對(duì)這個(gè)方法是這樣解釋的:
Returns an NSUserDefaults object initialized with the defaults for the specified app group.
看到了吧,里面提到了 App Group, 這個(gè)初始化方法就是為 App Group 量身打造的。如果有興趣進(jìn)一步研究,可以查看下 NSUserDefaults 的 官方文檔。
下面我們就繼續(xù)啦,App 數(shù)據(jù)共享即將大功告成。首先我們?cè)谥?App 中的 AppDelegate 中的 didFinishLaunchingWithOptions 方法中來(lái)寫(xiě)存入數(shù)據(jù)的代碼:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -\> Bool {var defaultForExtension:NSUserDefaults! = NSUserDefaults(suiteName: "group.app.test")if(defaultForExtension != nil){defaultForExtension.setObject("2014", forKey: "year")defaultForExtension.synchronize()}return true}有沒(méi)有注意到這里面 NSUserDefaults 的構(gòu)造方法NSUserDefaults(suiteName: "group.app.test") ,我們將前面我們創(chuàng)建的 App Groups 的標(biāo)識(shí)作為參數(shù)傳給了它的構(gòu)造方法。這樣,這個(gè) NSUserDefaults 就專(zhuān)為我們的這個(gè) App Group 存儲(chǔ)數(shù)據(jù)了。
接下來(lái),再到 App 擴(kuò)展 中,再用這個(gè) NSUserDefaults 將我們?cè)O(shè)置的值讀取出來(lái):
var defaultForExtension:NSUserDefaults! = NSUserDefaults(suiteName: "group.app.test") if(defaultForExtension != nil){var result:NSString = defaultForExtension.objectForKey("year") as NSStringprintln(result) }到這里,我們的 App 和 Extension 之間的數(shù)據(jù)共享就完成了, 是不是解決了一個(gè)大問(wèn)題呢。反正我覺(jué)得是。
更多文章請(qǐng)?jiān)L問(wèn)我的個(gè)人博客?www.theswiftworld.com
轉(zhuǎn)載于:https://www.cnblogs.com/theswiftworld/p/4158590.html
總結(jié)
以上是生活随笔為你收集整理的在 App 扩展和主 App 间共享数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java队列集合的性能测试
- 下一篇: UVa 12100 - Printer