因在之前自己寫的一款 RSS 閱讀器 應(yīng)用中职辨,有不少用戶反饋說希望添加個 iCloud 同步訂閱列表的功能,加上自己也對 iCloud 這一塊的不熟悉斯嚎,所以閑來研究下 iCloud 的內(nèi)容土陪。上述應(yīng)用是支持 iPhone 和 iPad 的,兩端同時(shí)使用時(shí)朗涩,沒有同步功能的話,的確是一件很蛋痛的事情绑改,這里先來分享下如果通過 iCloud 來同步應(yīng)用的偏好設(shè)置谢床。
配置環(huán)境
在項(xiàng)目中配置下 iCloud 的證書,現(xiàn)在 apple 相關(guān)的東西還是比較友好了厘线,在 Xcode 中勾選相應(yīng)配置就可以自動生成對應(yīng)的證書识腿,如下:
這里只用到了 Key-value storage,CloudKit 是可以不勾選的造壮。
通過模擬器來調(diào)試 iCloud
在模擬器中調(diào)試 iCloud 是和真機(jī)類似的渡讼,都是在設(shè)置中登錄 iCloud 的賬號,但是在模擬器中耳璧,iCloud 是不是自動同步的成箫,需要檢查同步的時(shí)候需要手動執(zhí)行,我們通過 Xcode 中的 Debug 功能來執(zhí)行:
同步
-
保存 Key-value 到 iCloud
NSUbiquitousKeyValueStore.default().set(true, forKey: kOffLineRead)
在修改偏好設(shè)置的時(shí)候旨枯,把相應(yīng)的值同步到 iCloud蹬昌。
-
監(jiān)聽變化
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { NotificationCenter.default.addObserver(self, selector: #selector(updateCloudItems(_ :)), name: NSUbiquitousKeyValueStore.didChangeExternallyNotification, object: NSUbiquitousKeyValueStore.default()) } func updateCloudItems(_ notification: Notification) { guard let userInfo = notification.userInfo else { return } guard let reason = userInfo[NSUbiquitousKeyValueStoreChangeReasonKey] as? Int else { return } if reason == NSUbiquitousKeyValueStoreServerChange || reason == NSUbiquitousKeyValueStoreInitialSyncChange { guard let changeKeys = userInfo[NSUbiquitousKeyValueStoreChangedKeysKey] as? [String] else { return } if changeKeys.contains(kOffLineRead) { if let value = NSUbiquitousKeyValueStore.default().object(forKey: kOffLineRead) as? Bool { UserDefaults.standard.set(value, forKey: kOffLineRead) UserDefaults.standard.synchronize() } } } }
因?yàn)檫@里的偏好設(shè)置應(yīng)用了整個應(yīng)用,所以在程序啟動時(shí)就去監(jiān)聽 iCloud 的變化攀隔,如果只是某個頁面的展示內(nèi)容皂贩,可以考慮在性展示的時(shí)候再去監(jiān)聽栖榨。這里需要注意的是,iCloud 對 Key-value 的大小是有限制的明刷,以前好像是2M治泥,現(xiàn)在沒有測試過,所以大的東西不要用 Key-value 來保存遮精。