我有一个带有共享扩展名的iOS应用。我试图使用NSUserDefaults和App Group在它们之间共享数据,但是,尽管我可以写入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()
在该
synchronize()
之后创建一个新的NSUD对象并检索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进行了测试。在模拟器上的相同行为以及运行iOS 10的iPhone 6s也是如此。
最佳答案
不知道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")
}
关于ios - 为什么NSUserDefaults在我的应用程序和共享扩展之间不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39982403/