首页 > 解决方案 > 手动编辑时不会保存共享应用程序组容器中的 UserDefaults

问题描述

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

期待

UserDefaults:应用程序版本 1

版本 1

UserDefaults:应用程序版本 2

版本 2

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

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

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

问题

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

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

标签: swiftmacosnsuserdefaultsappstore-sandboxmacos-big-sur

解决方案


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

问题的原因

只有守护进程应该有权访问共享应用程序组中的用户默认值。您使用用户默认值的应用程序也只与守护进程对话。

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

解决方案

杀死恶魔

苹果工程师还说,从技术上讲,你可以每次都杀死守护进程,但这不是推荐的方式。他们也没有告诉我这个恶魔的名字。

使用默认命令行工具

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

这是参考defaultshttps ://ss64.com/osx/defaults.html

图表:访问用户默认值

访问共享应用程序组容器中的用户默认值

推荐阅读