在扩展之间共享 UserDefault

创建一个 Today 小部件,我使用 UserDefaults(suiteName:)来保存一些数据。在主应用程序中,我使用的是 UserDefaults.standard()。这是不可读的(或者可以吗?)这就是为什么我使用 suiteName:构造函数。

用户在主应用程序中保存到 UserDefaults.standard()的数据需要在扩展中提供。

此时,我坚持两者,以便可以共享这些值

 UserDefaults.standard().set:...forKey:...
UserDefaults(suiteName:...)().set:...forKey:...
...

问题是,我是否应该删除所有的 UserDefaults.standard(),只是在我的应用程序中使用 UserDefaults(suiteName:),或者这是不好的做法,如果是这样,为什么?

编辑: 我正在使用一个 App 组容器。为了澄清,我要求我只是取代 standard()suiteName:在我的整个项目?

38713 次浏览

不能使用 UserDefaults.standard在宿主应用程序和它的应用程序扩展之间共享数据。相反,您必须使用 UserDefaults(suiteName:)创建一个共享容器来共享数据。

即使应用程序扩展包嵌套在其包含的 应用程序的捆绑包,运行的应用程序扩展和包含应用程序没有 直接进入对方的集装箱。

若要启用数据共享,请使用 Xcode 或 Developer 门户启用 包含应用程序及其所包含的应用程序扩展的应用程序组。 接下来,在门户中注册应用程序组并指定应用程序组 在包含应用程序中使用。

启用应用程序组后,应用程序扩展及其包含的应用程序 都可以使用 NSUserDefault API 共享对用户的访问 若要启用此共享,请使用 initWithSuiteName: 方法 实例化一个新的 NSUserDefault 对象,并传入标识符 共享小组的成员。

有关详情,请参阅: https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW1

如何使用应用程序组: https://github.com/pgpt10/Today-Widget

标准名称还是套件名称? ?

对于仅用于主机应用程序的数据使用标准的。对于要在扩展和主机应用程序之间共享的数据,请使用 suiteName。只是不要在两者中保存相同的数据。避免数据冗余。根据上下文使用它们。

一个简单的例子,我创建了一个共享包:

if let userDefaults = UserDefaults(suiteName: "group.your.bundle.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.bundle.here") {
let value1 = userDefaults.string(forKey: "key1")
let value2 = userDefaults.string(forKey: "key2")
...
}

确保在 能力选项卡中为 所有的目标(您的应用程序和扩展目标)启用了 App Groups

enter image description here

然后在创建 UserDefaults时使用上面的 组的标识符作为套件名称:

let userDefaults = UserDefaults(suiteName: "group.com.YourCompany.YourApp")

还要确保将应用程序组添加到正确的配置(调试、发布)中。如果您在 Debug 中为您的应用程序目标添加应用程序组,并尝试在针对您的扩展的发布配置中使用它,那么它将无法工作。

如果添加了 Debug config (针对 app target) ,那么在 Debug config (针对扩展目标)中使用它

PGDev: 增强:

将设置(首选项) https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/UserDefaults/Preferences/Preferences.html拖动到扩展名时,无法避免冗余: 它们包含在应用程序私有包中,必须进行复制 成套件命名捆绑成为可用的应用程序扩展