创建一个“今天”小部件,我将使用UserDefaults(suiteName:)来持久化一些数据。在主要应用程序中,我使用的是UserDefaults.standard()。这是读不懂的(或者可以吗?)通过扩展,这就是为什么我使用suiteName:构造函数。
用户在主应用程序中持久化到UserDefaults.standard()的数据需要在扩展中获得。
此时,我坚持这两种方法,以便能够共享这些值。
UserDefaults.standard().set:...forKey:...
UserDefaults(suiteName:...)().set:...forKey:...
...问题是,我应该把UserDefaults.standard()放在一起,只在我的应用程序中使用UserDefaults(suiteName:),还是这种做法很糟糕,如果是的话,原因何在?
编辑:我正在使用应用程序组容器。为了得到澄清,我想问的是,我是否应该在整个项目中用standard()替换suiteName:?
发布于 2017-08-10 08:17:01
您不能使用UserDefaults.standard在主机应用程序及其应用程序扩展之间共享数据。相反,您必须使用UserDefaults(suiteName:)创建一个共享容器来共享数据。
尽管应用程序扩展包嵌套在包含app的包中,但正在运行的应用程序扩展和包含app的应用程序不能直接访问对方的容器。 若要启用数据共享,请使用Xcode或Developer门户为包含的应用程序及其包含的应用程序扩展启用应用程序组。接下来,在门户中注册应用程序组,并指定要在包含的应用程序中使用的应用程序组。 启用应用程序组之后,应用程序扩展及其包含的应用程序都可以使用NSUserDefaults API来共享对用户首选项的访问。要启用此共享,请使用initWithSuiteName:方法实例化一个新的NSUserDefaults对象,传递共享组的标识符。
有关更多信息,请参见:ref/doc/uid/TP40014214-CH21-SW1
如何使用应用程序组:https://github.com/pgpt10/Today-Widget
标准还是SuiteName?
对仅用于宿主应用程序的数据使用标准一。对于要在扩展程序和宿主应用程序之间共享的数据,请使用suiteName。只是不要将相同的数据保存在这两种数据中。避免数据冗余。根据上下文使用这两种语言。
发布于 2019-03-10 05:39:46
确保在“功能”选项卡中为App Groups为启用了所有目标(应用程序和扩展目标)

然后在创建时使用上面的组的标识符作为套件名
let userDefaults = UserDefaults(suiteName: "group.com.YourCompany.YourApp")发布于 2018-03-09 13:57:11
一个简单的示例,其中我创建了一个共享包:
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")
...
}https://stackoverflow.com/questions/45607903
复制相似问题