Helper 开发
TODO: 添加对应步骤截图
Helper 的特征
Privileged helper 和普通的 daemon 类似, 有如下特性:
- 在系统范围内起作用: 安装到指定目录
- 以 root 身份运行.
- 整个系统范围内只有单个实例
- 只能被有限的 APP 安装和管理
- 只支持命令行工具
命名规范
- Domain 逆序命名
- 允许首字母大写和点
- 推荐在最后带 "helper" 字样
- 例如:
AirPlayXPCHelper
,com.apple.AccountHelper
,com.apple.ProxyHelper
如何使用
如果有下面的需求, 则可以使用 Privileged helper 进行:
- 当需要一次性的 root 权限时
- 当需要简单的 root 操作时
例如:
- 需要 root 权限的 installer 或 uninstaller
- 作为 root 拷贝/删除文件
- 作为 root 注册/解除 Daemon
- 加载/卸载 KEXT
安装和注册的整体流程
- 创建一个 APP
- 创建 PrivilegedHelper 命令行工具
- 创建和 helper 关联的 launchd.plist 文件
- 满足签名需求
- 使用 SMJobless 安装/注册
- 通过 XPC 和客户端通信
如下是各个步骤的详细说明.
1 创建客户端 APP
创建一个简单的应用即可, 语言选择可以是 OC 或 Swift. 之后 Helper 是和这个 APP 在同一个工程中(不同的 Target), 主 App 去掉 sandbox 的标志.
2 创建 Helper 并进行配置
创建的命令行工具, 命名为 com.demo.DemoHelper
(苹果推荐 Helper 和 BundleID 相同).
然后创建 Info.plist(命令行工具正常情况是没有 plist 的), 内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleShortVersionString</key>
<string>1</string>
<key>CFBundleVersion</key>
<string>0</string>
</dict>
</plist>