MacOS系统中NSUserDefaults standardUserDefaults的存储数据位置在哪?
macOS Catalina 下 NSUserDefaults 存储位置与直接修改方法
你无法找到存储文件的核心原因
- macOS Catalina 及之后的系统默认对用户目录下的
~/Library做了隐藏处理,Finder 全局搜索默认过滤该路径下的内容,不会主动索引到偏好存储文件 - 系统内置
cfprefsd偏好守护进程会将 NSUserDefaults 写入的内容先存在内存缓存中,不会实时刷写到磁盘 plist 文件,导致你翻遍可见的 plist 也找不到对应存储值 - Catalina 新增的权限控制要求:如果没有给 Finder 开启完全磁盘访问权限,Finder 根本无法读取 Preferences、沙盒容器目录下的文件,自然无法完成全局定位
实际存储路径
如果你没有在代码中自定义偏好域(即没有用 initWithSuiteName: 指定独立存储域),所有通过 standardUserDefaults 写入的值,会根据应用的沙盒配置存在两类路径下:
- 未开启沙盒权限的普通应用:文件路径为
~/Library/Preferences/[你的应用Bundle Identifier].plist - 开启沙盒权限的应用:文件路径在沙盒容器内部,为
~/Library/Containers/[你的应用Bundle Identifier]/Data/Library/Preferences/[你的应用Bundle Identifier].plist
类似Windows注册表的直接修改操作方法
第一步:访问被隐藏的目录
打开 Finder 后按住 Option 键,点击顶部菜单栏的「前往」,此时菜单会显示平时被隐藏的「资源库(Library)」选项,点击即可进入被隐藏的用户资源目录,无需修改系统全局隐藏配置。
第二步:优先使用系统原生命令操作(最稳定)
macOS 内置的 defaults 命令工具和 NSUserDefaults 存储机制深度打通,操作逻辑和 Windows 注册表编辑器一致,比手动改 plist 更不容易被缓存覆盖:
- 查看对应应用所有已存储的持久化键值:执行
defaults read [你的应用Bundle ID] - 直接修改指定键的存储值:比如将键名
hasCompletedOnboarding的布尔值改为NO,执行defaults write [你的应用Bundle ID] hasCompletedOnboarding -bool NO - 清空对应应用的所有持久化存储值:执行
defaults delete [你的应用Bundle ID]
如果找不到对应应用的Bundle ID,或者调试的是Xcode临时运行的SwiftUI预览进程,可以在终端执行 defaults find "你的自定义存储键名",系统会自动全局遍历所有偏好存储域,定位到包含你要修改的键值的具体存储位置,不用手动翻找目录。
第三步:手动编辑 plist 的注意事项
如果你需要直接打开 plist 文件修改值,必须遵循以下步骤避免修改失效:
- 完全退出对应应用,防止应用运行时将内存中的旧偏好缓存回写到磁盘,覆盖你修改的内容
- 用 plist 编辑器或 Xcode 打开对应路径的 plist 文件完成修改
- 修改完成后执行
killall cfprefsd,强制重启偏好守护进程,清空内存缓存让系统重新从磁盘加载 plist 内容
注意:如果只修改磁盘上的plist文件、不重启偏好守护进程,你改的内容会被内存里的旧缓存直接覆盖,完全达不到修改效果
内容的提问来源于stack exchange,提问作者SimonKravis
相关产品推荐
相关产品推荐

