应用和扩展程序之间的共享UserDefaults无法正常工作

iDe*_*Dec 17 nsuserdefaults ios swift

所以我一直在环顾四周,并按照所有步骤正确设置共享UserDefaults,但我应该遗漏一些东西.

我在我的应用和扩展程序上激活了应用组功能.两者都使用相同的套件名称("group.TestSharedPreferences"),我这样写:

struct Preferences {
    static let shared = UserDefaults(suiteName: "group.TestSharedPreferences")!
}
Run Code Online (Sandbox Code Playgroud)

viewDidLoad:

Preferences.shared.set(1, forKey: "INT")
Run Code Online (Sandbox Code Playgroud)

阅读:

Preferences.shared.integer(forKey: "INT") // Returns 1 in Container App
Preferences.shared.integer(forKey: "INT") // Returns 0 in Today Extension
Run Code Online (Sandbox Code Playgroud)

即使synchronize()在设置后使用"INT",扩展中检索的值也不是容器App中保存的值.关于我可能遗失的任何想法?谢谢!

zis*_*oft 22

我建议在这里一步一步地挖掘.

首先,确保主应用程序和小部件扩展程序都启用了应用程序组功能并使用相同的并激活(必须设置复选标记)应用程序组名称:

主要应用: 主要应用

今日小部件扩展:

今天Widget扩展

然后使用直接设置/获取访问进行简单测试.在您的主应用程序的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()
}
Run Code Online (Sandbox Code Playgroud)

在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")
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果这样做,问题必须与你的Preferences单身人士有关.