swift - 手动编辑时不会保存共享应用程序组容器中的 UserDefaults
问题描述
我正在开发我的 macOS 应用程序的新版本,该应用程序将version
属性存储在UserDefaults.standard
. 现在我想测试从版本1到版本2的更新过程。只有版本2写入version
属性。所以版本 1 不应该有它。
期待
UserDefaults:应用程序版本 1
UserDefaults:应用程序版本 2
这是一个沙盒应用程序,所以我去这里删除整个容器。
~/Library/Containers/com.example.myapp/
我切换到 Xcode,在我的 git 历史记录中检查版本 1,然后运行该应用程序。
问题
运行应用程序的版本 1 时,它会写入settings
属性。但同时它也写入了version
版本 1 甚至没有实现的属性。所以,我认为发生了一些奇怪的缓存问题。
为了“从头开始”运行应用程序,我还需要做些什么吗?
解决方案
我与一位 Apple 工程师交谈过,结果发现后台有一个守护进程用于访问用户默认值。
问题的原因
只有守护进程应该有权访问共享应用程序组中的用户默认值。您使用用户默认值的应用程序也只与守护进程对话。
守护进程也有一个缓存并将其返回,因为它不知道您的手动更改并认为文件没有更改。
解决方案
杀死恶魔
苹果工程师还说,从技术上讲,你可以每次都杀死守护进程,但这不是推荐的方式。他们也没有告诉我这个恶魔的名字。
使用默认命令行工具
推荐的方法似乎是使用defaults
命令行工具。这个工具基本上和你的应用程序一样。它与守护进程对话,守护进程将更新实际文件。请注意,对于共享应用程序组中的用户默认值,您需要指定文件的完整路径。使用捆绑标识符是不够的。
这是参考defaults
:https ://ss64.com/osx/defaults.html
图表:访问用户默认值
推荐阅读
- excel - VBA中最大可能的十进制值是多少?
- docusignapi - 当我们发送信封进行签名时,如何停止向 Carbon Copy 收件人发送通知?
- python - 如何通过重复一行来连接两个 DataFrame?
- docker - 为什么 docker 在守护进程模式 (-d) 下运行获得权限被拒绝 (selinux) 而不是在交互模式下 (-ti)
- javascript - 如何在 Javascript 中为浏览器设计“终端”或 CLI 应用程序?(模拟阻塞 I/O)
- html - 视频文件在 Internet Explorer11 中 3 秒后停止播放
- selenium - Appium-inspector[android] 无法加载应用内的某些页面
- url-routing - 无法切换路径 404,无法捕获通配符路由
- json - 如何从 JSON 文件中获取价值并在网站上显示
- matlab - 部分更改文本框中文本的颜色