67

创建一个 Today 小部件,我正在使用UserDefaults(suiteName:)它来保存一些数据。在我使用的主应用程序中UserDefaults.standard()。这不能被扩展读取(或者可以吗?),这就是我使用suiteName:构造函数的原因。

用户在主应用程序中保留的数据UserDefaults.standard()需要在扩展程序中可用。

此时我坚持两者,以便可以共享价值观

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

问题是我应该把UserDefaults.standard()所有东西放在一起,只UserDefaults(suiteName:)在我的应用程序中使用,还是这是不好的做法,如果是,为什么?

编辑:我正在使用应用程序组容器。为了澄清,我问我是否应该在整个项目中替换standard()suiteName:

4

5 回答 5

71

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

即使应用程序扩展包嵌套在其包含应用程序的包中,正在运行的应用程序扩展程序和包含应用程序也无法直接访问彼此的容器。

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

启用应用组后,应用扩展及其包含的应用都可以使用 NSUserDefaults API 来共享对用户首选项的访问权限。要启用此共享,请使用 initWithSuiteName: 方法实例化一个新的 NSUserDefaults 对象,并传入共享组的标识符。

有关更多信息,请参阅: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

标准或套件名称?

对仅适用于 Host App 的数据使用标准的一种。对要在 Extension 和 Host App 之间共享的数据使用 suiteName。只是不要在它们中保留相同的数据。避免数据冗余。根据上下文使用它们。

于 2017-08-10T08:17:01.880 回答
51

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

在此处输入图像描述

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

let userDefaults = UserDefaults(suiteName: "group.com.YourCompany.YourApp")
于 2019-03-10T05:39:46.670 回答
43

我创建共享包的一个简单示例:

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")
    ...
}
于 2018-03-09T13:57:11.527 回答
9

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

如果您添加调试配置(用于应用程序目标),则在调试配置中使用它(用于扩展目标)

于 2020-03-04T05:09:19.597 回答
1

PGD​​ev:增强:

将设置(首选项) https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/UserDefaults/Preferences/Preferences.html拖到扩展程序时,您无法避免冗余:它们包含在应用程序私有中捆绑包并且必须复制到套件名称捆绑包中才能用于应用程序扩展

于 2020-03-05T07:03:15.057 回答