macOS 开发随手笔记
macOS 开发中经常会遇到奇奇怪怪的坑, 随手记录一下, 方便以后查阅
FullDiskAccess 权限问题
从10.14 还是10.15 开始, macOS 要求软件如果需要随意访问磁盘文件, 需要额外申请 FullDiskAccsss 权限, 否则将无法访问用户的桌面, 文档等敏感文件.
需要注意的是, 没有权限的情况下, 即使你的程序以 root 身份执行也会提示错误.
不过倒也不是每个程序都需要此权限, 只要父进程有权限即可. 例如我们给终端分配的全盘访问权限, 那么就可以随意在终端中使用命令访问任意文件了.
但是这个权限并没有一个特定的 api 去申请. 只有自己想办法.
例如, 我们可以访问用户的桌面文件夹
1 | if (0 != access("/Users/xxx/Desktop/", R_OK | W_OK)) { |
当尝试读取桌面失败后, 用户就可以在系统设置->安全性与隐私->隐私->完全磁盘访问权限 中看到你的程序, 钩上之后就可以了.
需要注意的是, 程序最好是一个app, 而不是一个普通的可执行文件, 否则升级系统到 11.0 后, 可能会出现权限损坏的问题.
有些系统有bug, 例如 11.0.1, 即使这样尝试了, 不一定会在系统设置中看到.
比如, 你的程序并不是用户主动启动, 而是通过launchDaemon 自动启动的, 用户从未进入过你的程序目录, 这个时候, 即使你尝试访问桌面文件夹, 也不会在设置中看到你的程序, 但是只要进入finder文件夹中进入了程序的文件夹就会在系统设置中出现.
这个bug 猜测是没有刷新程序数据库的原因.
修复这个问题, 有两个办法:
- 在申请权限时, 使用open 命令或是api 强制打开程序目录.
- 申请权限时, 使用另一个程序调用 api 获申请程序的图标.