[17/7/6追記] Swift4に対応・確認しました。
[17/5/20追記] iOS 10.3.1, macOS Sierra 10.12.4で動作確認しました。
MKiCloudSyncというライブラリがあります。
簡単に local (UserDefaults)と iCloud (NSUbiquitousKeyValueStore)を同期してくれる優れものです。アプリ/デバイス間で少量データを授受するのに便利です。
しかしながら、本家が Objective-Cである+機能追加 のため、Swiftで書き直し UbiquitousSyncを作成しました。
インストール
Github UbiquitousSync
Share moduleフォルダー内の UbiquitousSync.swift を Dragして Xcode projectに追加してください。
使用方法
基本
startWithPrefix()
- アプリ初期処理 (AppDelegateなど)で、UbiquitousSync.startWithPrefix() をコール。
- Keyに “iCloud_” prefixを持つ UserDefaults項目の初期値が iCloudよりロードされます。
- 以降、当該 Keyの UserDefaults項目に書き込みがあれば、iCloud側も同期して変更します。
- iCloud側で変更があった場合は UserDefaultsを更新し、Notification (kUbiquitousSyncNotification)が発生します。userInfoで変更のあった Keyを通知します。
オプション
startWithPrefix(prefixToSync:String, restore:Bool)
- prefixToSync Keyプリフィックス変更 (defaultは “iCloud_” )
- restore==true (default) 初期処理で iCloud (NSUbiquitousKeyValueStore)値を UserDefaultsにロードする、restore==false ロードしない。
removeiCloudItems4Debug(prefix:String, cloud:Bool, local:Bool)
- prefixToSync 同期 Keyプリフィックス変更, 指定する場合は startWithPrefix で同じとしてください。cloud / local 各々 NSUbiquitousKeyValueStore / UserDefaultsの内容を削除します。
- removeiCloudItems4Debugは startWithPrefixより前にコールしてください。
- デバッグ用です。
MKiCloudSyncとの仕様差異
- 初期処理で iCloud の値を localにローディングするようにしました。startWithPrefix restore=false でオリジナル相当になります。
- Notificationで変更項目の Keyを渡します。
- オーバヘッドの削減のため、変更項目のみ書き換えるようにしました。
- iCloud (NSUbiquitousKeyValueStore)と local (UserDefaults)の項目を初期化できます。
デモ・プロジェクト
- 数字を +/- するだけの iOS/macOSデモアプリです。
- 開発環境: Xcode9 beta2, Swift4。
- 動作環境: iOS11 beta2 (iOS simulator), 10.3.2 (iPhone5), macOS Sierra 10.12.5 (iMac), High Sierra 10.13 beta2 (mac book air) で確認しています。
- iOSシミュレータでは、simulator->iCloud 方向にしか動作しません。
- 一般的な NSUbiquitousKeyValueStore設定方法は、Appleの sample PrefsInを参照ください。
その他
- iCloudの同期遅延が大きいです。1分前後かかることもあります。
- “UbiquitousSync”というクラス名は命名則違反かも?気持ちが悪ければ変更してください。
- 前述の通り、本ライブラリの基本的なアイディアは MKiCloudSyncに依ります。CopyrightとCreditに関し作者 Kumar氏に連絡し了解をいただいております。