web-dev-qa-db-ja.com

拡張機能間でUserDefaultsを共有する

Todayウィジェットを作成し、UserDefaults(suiteName:)を使用して一部のデータを永続化します。メインアプリケーションでは、UserDefaults.standard()を使用しています。これは拡張機能では読み取れない(またはできない)ため、_suiteName:_コンストラクターを使用します。

ユーザーがメインアプリでUserDefaults.standard()に保持するデータは、拡張機能で使用できる必要があります。

現時点では、値を共有できるように両方に固執しています

_ UserDefaults.standard().set:...forKey:...
 UserDefaults(suiteName:...)().set:...forKey:...
 ...
_

質問は、UserDefaults.standard()をまとめて削除し、アプリケーションでUserDefaults(suiteName:)を使用する必要がありますか、またはこの悪い習慣ですか?

編集:アプリグループコンテナーを使用しています。明確にするために、プロジェクト全体でstandard()をsuiteName:に置き換えるだけですか?

20
RyanTCB

共有_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を使用します。両方で同じデータを永続化しないでください。データの冗長性を避けます。状況に応じて両方を使用します。

27
PGDev

簡単な例:

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")
    ...
}
16
oskarko

確認してください App Groupsは、[〜#〜] all [〜#〜]のターゲット(アプリと拡張機能ターゲット)でCapabilitiesタブで有効になります

enter image description here

そして、UserDefaultsを作成するときに、スイート名として上記のグループの識別子を使用します。

let userDefaults = UserDefaults(suiteName: "group.com.YourCompany.YourApp")
5
Tai Le