创建今日小部件,我使用UserDefaults(suiteName:)
来保留一些数据。在主应用程序中,我正在使用UserDefaults.standard()
。这是扩展无法读取(或可以吗?),这就是我使用suiteName:
构造函数的原因。
用户在主应用中持久保存到UserDefaults.standard()
的数据需要在扩展程序中可用。
此时我坚持两者都可以共享价值
UserDefaults.standard().set:...forKey:...
UserDefaults(suiteName:...)().set:...forKey:...
...
问题是我应该将UserDefaults.standard()
全部放在一起,只是在我的应用程序中使用UserDefaults(suiteName:)
,或者这是不好的做法,如果是这样,为什么?
编辑:我正在使用App组容器。为了澄清,我问我应该在我的项目中用suiteName替换standard()吗?
答案 0 :(得分:24)
您无法使用共享UserDefaults.standard
在主机应用及其应用扩展程序之间共享数据。您必须使用UserDefaults(suiteName:)
创建共享容器以共享数据。
即使应用扩展程序包嵌套在其包含内 应用程序包,正在运行的应用程序扩展和包含应用程序没有 直接访问彼此的容器。
要启用数据共享,请使用Xcode或Developer门户启用 包含应用及其包含的应用扩展程序的应用组。 接下来,在门户中注册应用程序组并指定应用程序组 在包含应用程序中使用。
启用应用群组,应用扩展程序及其包含的应用 可以使用NSUserDefaults API共享对用户的访问权限 喜好。要启用此共享,请使用initWithSuiteName:方法 实例化一个新的NSUserDefaults对象,传入标识符 共享组。
有关更多信息,请参阅:XFS man page
标准名称还是SuiteName?
将标准值用于仅适用于Host App的数据。对要在Extension和Host App之间共享的数据使用suiteName。只是不要在两者中保留相同的数据。避免数据冗余。根据上下文使用它们。
答案 1 :(得分:14)
一个简单的例子:
if let userDefaults = UserDefaults(suiteName: "group.your.bandle.here") {
userDefaults.set("test 1" as AnyObject, forKey: "key1")
userDefaults.set("test 2" as AnyObject, forKey: "key2")
userDefaults.synchronize()
}
你可以稍后阅读:
if let userDefaults = UserDefaults(suiteName: "group.your.bandle.here") {
let value1 = userDefaults.string(forKey: "key1")
let value2 = userDefaults.string(forKey: "key2")
...
}
答案 2 :(得分:7)
还要确保将应用程序组添加到正确的配置(调试,发布)。如果您在Debug中为应用程序目标添加了应用程序组,并尝试在扩展配置的Release config中使用它,那么它将无法正常工作。
如果您在调试配置中添加(对于应用程序目标),则在调试配置中使用(对于扩展目标)
答案 3 :(得分:3)
确保在功能标签
中为全部个目标(您的应用和扩展程序目标)启用了App Groups
然后在创建UserDefaults
时使用上面的组的标识符作为套件名称:
let userDefaults = UserDefaults(suiteName: "group.com.YourCompany.YourApp")
答案 4 :(得分:1)
PGDev:增强:
将“设置(首选项)https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/UserDefaults/Preferences/Preferences.html”拖到扩展名时,您将避免冗余: 它们包含在应用程序专用捆绑包中,必须复制 进入套件命名的捆绑包,以供应用扩展使用
答案 5 :(得分:0)
此外,请确保在添加应用组后清理并重建整个应用。