macOS有着严格的用户权限管理,一般情况下App都是运行在普通用户权限下,这个时候App是无法修改系统配置,也不能往用户目录以外的目录读写文件。有些操作下我们必须要获取root权限才能执行,比如:
1. 往系统目录安装可执行文件(比如:/usr/bin);
2. 设置App为系统启动项;
3. 修改系统设置;
目前主要有三种方式可以获取系统的root权限:
这个接口允许我们在执行命令行命令的时候弹出提示框,用户输入root密码之后能够以root的权限执行命令。
运行效果,提示"xxx 想要进行更改":
需要注意的是这个接口在macOS 10.7以后就是Deprecated了,苹果推荐使用另一种方式进行提权操作。
这是苹果用于替换第一种方式的提权方案,它需要我们创建一个命令行程序Helper设置为随launchd启动(拥有root权限),App再通过SMJobBless接口实现和Helper通信,从而将需要root权限执行的命令交由Helper执行:
Helper命令行工具:
1. 配置Info.plist
这里的SMAuthorizedClients是通过官方脚本生成:
2. Launchd.plist 用于配置Helper自启动:
3. 在主程序配置Helper安装(Build Phase):
通过以上3步就完成了Helper的配置,接下来看下如何和Helper通信:
1. Helper 初始化Listener,用于监听主App的连接请求:
其中HelperInterface是实现了协议XPCProtocol的类,就是真正实现功能的类型。
2. 主App通过SMJobBless和Helper通信:
XPCProtocol就是主App和Helper之间约定的API,主App创建XPCServiceConnection之后就可以直接通过该API实现接口调用:
XPCProtocol定义:
需要注意使用SMJobBless的方式实现提权需要对Helper程序进行签名,并且要求是正式的付费开发者账号签名才有效,免费的个人开发者账号即使签名成功了,Helper程序也无法被launchd正常启动。
这种方式只能同步执行命令,会阻塞当前App主线程(子线程无法实现密码输入),所以只适合那种可以在前台并且不耗时的命令行任务。