手动编辑时共享应用程序组容器中的 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
图表:访问用户默认值
我正在开发我的 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