web-dev-qa-db-ja.com

アプリと拡張機能の間で共有されているUserDefaultsが正しく機能しない

そのため、共有UserDefaultsを正しく設定するためにすべての手順を調べて実行してきましたが、何かが足りないはずです。

アプリと拡張機能の両方でアプリグループ機能を有効にしています。どちらも同じスイート名(_"group.TestSharedPreferences"_)を使用しており、次のように記述しています。

_struct Preferences {
    static let shared = UserDefaults(suiteName: "group.TestSharedPreferences")!
}
_

viewDidLoad

_Preferences.shared.set(1, forKey: "INT")
_

そして読むために:

_Preferences.shared.integer(forKey: "INT") // Returns 1 in Container App
Preferences.shared.integer(forKey: "INT") // Returns 0 in Today Extension
_

_"INT"_を設定した直後にsynchronize()を使用しても、拡張機能で取得された値は、コンテナーAppに保存された値ではありません。私が欠けているかもしれないものについてのアイデアはありますか?ありがとうございました!

20
iDec

ここで段階的に掘り下げることをお勧めします。

まず、メインアプリとウィジェット拡張機能の両方でアプリグループ機能が有効になっていて、同じものを使用してアクティブ化されていることを確認します(チェックマークを設定する必要があります)。アプリグループ名:

メインアプリ:Main App

今日のウィジェット拡張:

Today Widget Extension

次に、直接設定/取得アクセスを使用して簡単なテストを行います。メインアプリのAppDelegate.didFinishLaunchingWithOptionsメソッド(アプリグループ名とキーを必要に応じて変更します):

if let userDefaults = UserDefaults(suiteName: "group.de.zisoft.GPS-Track") {
    userDefaults.set("test 1" as AnyObject, forKey: "key1")
    userDefaults.set("test 2" as AnyObject, forKey: "key2")
    userDefaults.synchronize()
}

Today Widget ExtensionのViewControllerで:

if let userDefaults = UserDefaults(suiteName: "group.de.zisoft.GPS-Track") {
    let value1 = userDefaults.string(forKey: "key1")
    let value2 = userDefaults.string(forKey: "key2")
    ...
}

これが機能する場合、問題はPreferencesシングルトンに関連している必要があります。

22
zisoft