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