为什么 NSUserDefaults 在我的应用和共享扩展之间不起作用?
Why doesn't NSUserDefaults work between my app & share extension?
我有一个带有共享扩展的 iOS 应用程序。我正在尝试使用 NSUserDefaults 和 App Groups 在它们之间共享数据,但是,虽然我可以写入 NSUD 对象,读取它,并且 synchronize()
没有错误,但读取扩展总是导致 nil
.
我有一个应用程序组,文字字符串 "group.net.foo.bar",应用程序和扩展程序都已在功能 -> 应用程序组下为其配置。这个字符串在我的应用程序的常量结构中:
struct Forum {
static let APP_GROUP = "group.net.foo.bar"
static let AUTH_KEY = "AUTH_KEY"
}
在主应用程序中,我创建了一个 UserDefaults 对象并向其写入:
fileprivate lazy var userDefaults: UserDefaults = {
let defaults = UserDefaults()
defaults.addSuite(named: Forum.APP_GROUP)
return defaults
}()
// later
userDefaults.set(apiKey, forKey: Forum.AUTH_KEY)
userDefaults.synchronize()
在那之后创建一个新的 NSUD 对象 synchronize()
并检索 AUTH_KEY 工作。在扩展中,我创建了一个 NSUD 并尝试检索该值,但无济于事:
private lazy var userDefaults: UserDefaults = {
let defaults = UserDefaults()
defaults.addSuite(named: Forum.APP_GROUP)
return defaults
}()
// later
private func getApiKey() -> String? {
return userDefaults.string(forKey: Forum.AUTH_KEY)
}
// returns nil
在我阅读 Apple 文档和 Stack Overflow 上令人沮丧的类似问题的所有内容中,我无法判断我做错了什么。
Xcode 版本 8.0 (8A218a),也使用 Xcode 8.1 Beta 2 进行了测试。模拟器上的行为相同 andy my iPhone 6s 运行 iOS 10.
不确定 defaults.addSuite(named: ...)
是否与 UserDefaults(suiteName: ...)
相同。在我的应用程序中,我以这种方式使用 appGroups,它按预期工作:
// write
if let userDefaults = UserDefaults(suiteName: appGroupName) {
userDefaults.set("---" as AnyObject, forKey: "distance")
userDefaults.set("---" as AnyObject, forKey: "altitude")
...
userDefaults.synchronize()
}
// read
if let userDefaults = UserDefaults(suiteName: appGroupName) {
self.distanceLabel.text = userDefaults.string(forKey: "distance")
self.altitudeLabel.text = userDefaults.string(forKey: "altitude")
}
如果您尝试使用 userDefault 将数据保存到扩展 APP 时遇到此问题,也许您编写了以下代码:[[NSUserDefaults standardUserDefaults] initWithSuiteName:@"group.xxx.com"];,此代码重置默认用户默认值。实际上,正确的代码是:[[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.com"]; enter link description here
我有一个带有共享扩展的 iOS 应用程序。我正在尝试使用 NSUserDefaults 和 App Groups 在它们之间共享数据,但是,虽然我可以写入 NSUD 对象,读取它,并且 synchronize()
没有错误,但读取扩展总是导致 nil
.
我有一个应用程序组,文字字符串 "group.net.foo.bar",应用程序和扩展程序都已在功能 -> 应用程序组下为其配置。这个字符串在我的应用程序的常量结构中:
struct Forum {
static let APP_GROUP = "group.net.foo.bar"
static let AUTH_KEY = "AUTH_KEY"
}
在主应用程序中,我创建了一个 UserDefaults 对象并向其写入:
fileprivate lazy var userDefaults: UserDefaults = {
let defaults = UserDefaults()
defaults.addSuite(named: Forum.APP_GROUP)
return defaults
}()
// later
userDefaults.set(apiKey, forKey: Forum.AUTH_KEY)
userDefaults.synchronize()
在那之后创建一个新的 NSUD 对象 synchronize()
并检索 AUTH_KEY 工作。在扩展中,我创建了一个 NSUD 并尝试检索该值,但无济于事:
private lazy var userDefaults: UserDefaults = {
let defaults = UserDefaults()
defaults.addSuite(named: Forum.APP_GROUP)
return defaults
}()
// later
private func getApiKey() -> String? {
return userDefaults.string(forKey: Forum.AUTH_KEY)
}
// returns nil
在我阅读 Apple 文档和 Stack Overflow 上令人沮丧的类似问题的所有内容中,我无法判断我做错了什么。
Xcode 版本 8.0 (8A218a),也使用 Xcode 8.1 Beta 2 进行了测试。模拟器上的行为相同 andy my iPhone 6s 运行 iOS 10.
不确定 defaults.addSuite(named: ...)
是否与 UserDefaults(suiteName: ...)
相同。在我的应用程序中,我以这种方式使用 appGroups,它按预期工作:
// write
if let userDefaults = UserDefaults(suiteName: appGroupName) {
userDefaults.set("---" as AnyObject, forKey: "distance")
userDefaults.set("---" as AnyObject, forKey: "altitude")
...
userDefaults.synchronize()
}
// read
if let userDefaults = UserDefaults(suiteName: appGroupName) {
self.distanceLabel.text = userDefaults.string(forKey: "distance")
self.altitudeLabel.text = userDefaults.string(forKey: "altitude")
}
如果您尝试使用 userDefault 将数据保存到扩展 APP 时遇到此问题,也许您编写了以下代码:[[NSUserDefaults standardUserDefaults] initWithSuiteName:@"group.xxx.com"];,此代码重置默认用户默认值。实际上,正确的代码是:[[NSUserDefaults alloc] initWithSuiteName:@"group.xxx.com"]; enter link description here