Todayウィジェットを作成し、UserDefaults(suiteName:)
を使用して一部のデータを永続化します。メインアプリケーションでは、UserDefaults.standard()
を使用しています。これは拡張機能では読み取れない(またはできない)ため、_suiteName:
_コンストラクターを使用します。
ユーザーがメインアプリでUserDefaults.standard()
に保持するデータは、拡張機能で使用できる必要があります。
現時点では、値を共有できるように両方に固執しています
_ UserDefaults.standard().set:...forKey:...
UserDefaults(suiteName:...)().set:...forKey:...
...
_
質問は、UserDefaults.standard()
をまとめて削除し、アプリケーションでUserDefaults(suiteName:)
を使用する必要がありますか、またはこの悪い習慣ですか?
編集:アプリグループコンテナーを使用しています。明確にするために、プロジェクト全体でstandard()をsuiteName:に置き換えるだけですか?
共有_UserDefaults.standard
_を使用して、ホストアプリとそのアプリ拡張機能間でデータを共有することはできません。代わりに、UserDefaults(suiteName:)
を使用してデータを共有する共有コンテナを作成する必要があります。
アプリ拡張機能バンドルは、その包含アプリのバンドル内にネストされていますが、実行中のアプリ拡張機能と包含アプリは、互いのコンテナに直接アクセスできません。
データ共有を有効にするには、Xcodeまたは開発者ポータルを使用して、含まれているアプリと含まれているアプリ拡張機能のアプリグループを有効にします。次に、ポータルにアプリグループを登録し、包含アプリで使用するアプリグループを指定します。
アプリグループを有効にすると、アプリ拡張機能とそのアプリは両方ともNSUserDefaults APIを使用してユーザー設定へのアクセスを共有できます。この共有を有効にするには、initWithSuiteName:メソッドを使用して新しいNSUserDefaultsオブジェクトをインスタンス化し、共有グループの識別子を渡します。
詳細については、次を参照してください: https://developer.Apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//Apple_ref/doc/uid/TP40014214-CH21-SW1
アプリグループの使用方法: https://github.com/pgpt10/Today-Widget
StandardまたはSuiteName?
Host App専用のデータには標準のものを使用してください。拡張機能とホストアプリ間で共有するデータにsuiteNameを使用します。両方で同じデータを永続化しないでください。データの冗長性を避けます。状況に応じて両方を使用します。
簡単な例:
if let userDefaults = UserDefaults(suiteName: "group.your.bandle.here") {
userDefaults.set("test 1" as AnyObject, forKey: "key1")
userDefaults.set("test 2" as AnyObject, forKey: "key2")
userDefaults.synchronize()
}
後で読むことができます:
if let userDefaults = UserDefaults(suiteName: "group.your.bandle.here") {
let value1 = userDefaults.string(forKey: "key1")
let value2 = userDefaults.string(forKey: "key2")
...
}