我有一个共享扩展的iOS应用程序。我试图使用NSUserDefaults和App Groups在它们之间共享数据,但是,虽然我可以写入NSUD对象,但是没有错误,并且synchronize()
没有错误,读取扩展总是导致nil
。为什么NSUserDefaults在我的应用程序和共享扩展之间不起作用?
我有一个应用程序组,文本字符串“group.net.foo.bar”,这两个应用程序&扩展在Capabilities - > App Groups下配置。此字符串是一个常量结构在我的应用程序:
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
在我所有的苹果文档和沮丧,类似的问题在这里对堆栈溢出,我不能猜得出的阅读我做错了。
的Xcode 8.0版(8A218a),也和Xcode 8.1 Beta 2版相同的行为测试的模拟器安迪我的iPhone 6S运行iOS 10.
布拉沃,就是这样。任何想法是什么'defaults.addSuite(命名:...)'用于? –
很高兴为您效劳。如上所述,我不确定。这里的文档有点混乱。 – zisoft
事实上 - 我想我被绊倒了,因为我发现的所有当前示例都是使用'initWithSuiteName'的ObjC或Swift 2.3。 Swift 3.0重命名了这个,我认为'userDefaultsObject.addSuite(named:...)'是我看到的最接近的东西,我错过了重命名的构造函数。 –