在扩展之间共享UserDefaults

Rya*_*TCB 23 swift today-extension userdefaults ios10-today-widget

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

用户UserDefaults.standard()在主应用中持久保存的数据需要在扩展中可用.

在这个时候,我坚持两者,以便可以共享价值观

 UserDefaults.standard().set:...forKey:...
 UserDefaults(suiteName:...)().set:...forKey:...
 ...
Run Code Online (Sandbox Code Playgroud)

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

编辑:我正在使用App组容器.为了澄清我要问我应该在我的项目中用suiteName替换standard()吗?

PGD*_*Dev 30

您不能使用共享UserDefaults.standard来共享A UserDefaults(suiteName:)和它之间的数据UserDefaults.standard.您必须使用UserDefaults(suiteName:),即共享容器UserDefaults.standard来共享数据.

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

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

启用应用程序组后,应用程序扩展及其包含应用程序都可以使用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

标准名称还是SuitName?

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

  • 对仅用于 Host App 的数据使用标准一种。对于要在扩展程序和主机应用程序之间共享的数据,请使用套件名称。只是不要在两者中保留相同的数据。避免数据冗余。根据上下文使用它们。 (2认同)

osk*_*rko 21

一个简单的例子:

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()
}
Run Code Online (Sandbox Code Playgroud)

你可以稍后阅读:

if let userDefaults = UserDefaults(suiteName: "group.your.bandle.here") {
    let value1 = userDefaults.string(forKey: "key1")
    let value2 = userDefaults.string(forKey: "key2")
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 你不需要调用`synchroniz` (7认同)

Tai*_* Le 9

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

在此处输入图片说明

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

let userDefaults = UserDefaults(suiteName: "group.com.YourCompany.YourApp")
Run Code Online (Sandbox Code Playgroud)

  • 这一步非常重要。 (8认同)

小智 9

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

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

  • @JeffB6688 好吧,我最初对此感到困惑。但当我输入我最初的想法时,我发现了这一点。如果您单击“常规”、“签名和功能”等所在的项目。选择“签名和功能”,在其下方有“全部、调试、发布”。这就是 Rahul 所说的“将应用程序组添加到调试和发布中”的意思 (3认同)