macOS 文件关联依赖 LSHandlers 注册机制,需用 defaults write 修改 com.apple.LaunchServices 数据库并执行 lsregister -kill 刷新;右键“显示简介”仅设局部规则,全局生效须写入 LSHandlers 并清除文件扩展属性。

MacOS 修改文件关联和默认应用不靠图形界面“双击设置”,而是依赖 LSHandlers 注册机制和 defaults 命令写入 com.apple.LaunchServices 数据库 —— 直接改系统偏好设置里的“打开方式”只影响单个文件,不改全局关联。
用 defaults write 批量修改某类文件的默认应用
系统级关联存在 Launch Services 数据库中,不能手动编辑 plist,必须用 defaults 写入。关键路径是 com.apple.LaunchServices,键名为 LSHandlers,值为数组,每项指定 LSHandlerContentType(UTI)或 LSHandlerRoleAll(对应应用 Bundle ID)。
- 先查目标文件类型的 UTI:
mdls -name kMDItemContentTypeTree 文件名(如返回public.plain-text) - 查目标应用 Bundle ID:
osascript -e 'id of app "VS Code"→ 得到com.microsoft.VSCode - 执行写入(以
.txt关联 VS Code 为例):defaults write com.apple.LaunchServices LSHandlers -array-add '{LSHandlerContentType=public.plain-text;LSHandlerRoleAll=com.microsoft.VSCode;}' - 重启 Launch Services:
lsregister -kill -r -domain local -domain system -domain user(注意:不是killall Finder,那没用)
为什么右键“显示简介”里改了“打开方式”却无效?
“显示简介”面板中修改的是该文件的 局部覆盖规则(存于文件扩展属性 xattr -wx com.apple.LaunchServices.OpenWith),仅对该文件生效;若文件被复制、重命名或从网络下载,该设置丢失。真正持久化需写入全局数据库。
- 已设局部规则的文件,会优先于
LSHandlers生效 —— 所以改完全局后,建议对已有文件运行:xattr -d com.apple.LaunchServices.OpenWith 文件名 - Finder 中按住
Option键右键“显示简介”,能看到“打开方式”下方是否标有“此设置适用于所有 .xxx 文件”——只有这时才是全局生效
常见失败原因与绕过限制的方法
macOS 12+ 对 LSHandlers 写入做了签名验证,部分第三方应用(尤其未上架 Mac App Store 的)Bundle ID 可能被系统拒绝注册;Safari、Notes 等系统应用则严格锁定无法替换。
- 若
defaults write后lsregister -kill仍不生效,尝试用lsregister手动注册应用:/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/YourApp.app - 某些 UTI(如
public.html)被 Safari 占用且不可覆盖,可改用更具体的 UTI:mdls查出实际值(如dyn.ah62d4rv4ge800c5),再写入 - 终端命令需在用户上下文执行(勿用
sudo),否则写入的是 root 用户数据库,不影响当前桌面会话
真正麻烦的不是写哪条命令,而是 UTI 不统一、应用 Bundle ID 随版本变、以及 macOS 每次大版本更新都会重置部分注册项 —— 所以自动化脚本里最好加 lsregister -dump | grep 校验是否真写进去了。

















