应用程序和扩展程序之间的共享 UserDefaults 无法正常工作
Shared UserDefaults between app and extension not working correctly
所以我一直在四处寻找并按照所有步骤正确设置共享 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()
,扩展中检索到的值也不是容器应用程序中保存的值。关于我可能会遗漏什么的任何想法?谢谢!
这里推荐一步步往下挖掘
首先,确保主应用和小部件扩展都启用了应用组功能,并使用相同的并激活(必须设置复选标记)应用组名称:
主应用程序:
今日插件扩展:
然后用直接set/get访问做一个简单的测试。在您的主应用程序的 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
单例有关。
所以我一直在四处寻找并按照所有步骤正确设置共享 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()
,扩展中检索到的值也不是容器应用程序中保存的值。关于我可能会遗漏什么的任何想法?谢谢!
这里推荐一步步往下挖掘
首先,确保主应用和小部件扩展都启用了应用组功能,并使用相同的并激活(必须设置复选标记)应用组名称:
主应用程序:
今日插件扩展:
然后用直接set/get访问做一个简单的测试。在您的主应用程序的 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
单例有关。