在扩展之间共享UserDefaults

时间:2017-08-10 08:07:11

标签: swift today-extension userdefaults ios10-today-widget

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

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

此时我坚持两者都可以共享价值

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

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

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

6 个答案:

答案 0 :(得分:24)

您无法使用共享UserDefaults.standard在主机应用及其应用扩展程序之间共享数据。您必须使用UserDefaults(suiteName:)创建共享容器以共享数据。

  

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

     

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

     

启用应用群组,应用扩展程序及其包含的应用   可以使用NSUserDefaults API共享对用户的访问权限   喜好。要启用此共享,请使用initWithSuiteName:方法   实例化一个新的NSUserDefaults对象,传入标识符   共享组。

有关更多信息,请参阅:XFS man page

如何使用应用组:https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW1

标准名称还是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

enter image description here

然后在创建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)

此外,请确保在添加应用组后清理并重建整个应用。