小编典典

在扩展之间共享UserDefaults

swift

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

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

目前,我坚持两者,以便可以共享这些值

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

问题是我应该将UserDefaults.standard()它们放在一起并仅UserDefaults(suiteName:)在我的应用程序中使用,还是这种不好的做法?

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


阅读 722

收藏
2020-07-07

共1个答案

小编典典

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

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

要启用数据共享,请使用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

标准或套房名称?

对于仅用于主机应用程序的数据使用标准之一。将suiteName用于要在Extension和Host
App之间共享的数据。只是不要在两个数据中都保留相同的数据。避免数据冗余。根据上下文使用它们两者。

2020-07-07