我有一个带有共享扩展的 iOS 应用程序。我正在尝试使用 NSUserDefaults 和应用程序组在它们之间共享数据,但是,虽然我可以写入 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 进行了测试。在模拟器和运行 iOS 10 的 iPhone 6s 上也有相同的行为。