手动编辑时共享应用程序组容器中的 UserDefaults 不会保存

UserDefaults in shared app group container won't save when editing manually

我正在开发我的 macOS 应用程序的新版本,它在 UserDefaults.standard 中存储 version 属性。现在我想测试从版本1到版本2的更新过程。只有版本2写了version 属性。所以版本1应该没有。

预期

UserDefaults:应用程序版本 1

UserDefaults:应用程序版本 2

这是一个沙盒应用程序,所以我去这里删除整个容器。

~/Library/Containers/com.example.myapp/

我切换到 Xcode,在我的 git 历史记录中结帐版本 1,然后 运行 应用程序。

问题

当 运行 宁版本 1 的应用程序时,它写入 settings 属性。但同时它也写了 version 属性,版本 1 甚至没有实现。所以,我假设发生了一些奇怪的缓存问题。

我还需要做些什么才能运行“从头开始”应用程序吗?

我和一位 Apple 工程师谈过,结果发现后台有一个守护进程用于访问用户默认设置。

问题原因

只有守护程序才能访问共享应用程序组中的用户默认值。您使用用户默认值的应用程序也只与守护进程通信。

守护程序也有一个缓存并将return它,因为它不知道您的手动更改并且认为文件没有更改。

解决方案

杀死恶魔

Apple 工程师还说技术上你可以每次都杀死守护进程,但这不是推荐的方法。他们也没有告诉我守护神的名字。

使用默认命令行工具

推荐的方法似乎是使用defaults命令行工具。这个工具基本上和你的应用程序一样。它与守护进程对话,守护进程将更新实际文件。请注意,对于共享应用程序组中的用户默认值,您需要指定文件的完整路径。使用包标识符是不够的。

这里是 defaults 的参考:https://ss64.com/osx/defaults.html

图表:访问用户默认值