如何创建一个单独的 NSUserDefaults(标准除外)- 不是跨扩展共享的?

Posted

技术标签:

【中文标题】如何创建一个单独的 NSUserDefaults(标准除外)- 不是跨扩展共享的?【英文标题】:How to create a separate NSUserDefaults (other than standard) - which is not shared across extensions? 【发布时间】:2019-12-19 21:38:38 【问题描述】:

我在开发一个写入 NSUserDefaults 的 SDK。有时,客户端的主机应用程序会批量擦除标准 NSUserDefaults,从而践踏 SDK 数据。解决方案似乎是不使用“标准”用户默认值。看来您可以使用构造函数init(suiteName:),但我在其他地方读到,如果您创建这样的实例,它将在主机可能激活的某些条件下跨应用扩展共享(我的 SDK 不知道)。如果它们在应用程序扩展中运行,我需要将它们彼此分开,但更改密钥名称或套件名称不是一个好的选择,因为 SDK 本质上不知道它在哪个位置运行. 有没有办法创建一个行为像标准但不是标准的用户默认实例?

【问题讨论】:

【参考方案1】:

应用扩展具有不同的捆绑 ID。因此,您可以使用捆绑 ID 作为 suiteName 的前缀。

Bundle.main.bundleIdentifier 将为您提供当前可执行文件的捆绑 ID。

【讨论】:

我很欣赏这个想法。我正在考虑,但希望有更好的方法。我猜那会是一个奇怪的套件名称,两个反向域名拼在一起。 另外,这将使 SDK 对捆绑 ID 的更改敏感。

以上是关于如何创建一个单独的 NSUserDefaults(标准除外)- 不是跨扩展共享的?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NSUserdefaults 为每个启动的对象创建一个密钥

如何在一个 UITextField 中设置两个不同的 NSUserDefaults

首选项(NSUserDefaults)崩溃?

如何使用 NSUserDefaults 和 NSDateComponent 来存储?

如何在 swift 中保存和读取 NSUserdefaults 中的数组数组?

强制使用已使用 NSUserDefaults 创建的实体