Mac应用与XPC Service无法连接求助(沙箱限制相关)
Mac端点安全代理XPC连接失败(沙盒限制Error 159)
从错误信息failed at lookup with error 159 - Sandbox restriction可以明确,问题核心是沙盒权限限制阻止了Mach服务的查找与连接,结合你开发端点安全代理的场景(涉及特权服务、网络扩展、Endpoint Security),以下是针对性的解决步骤:
1. 修复沙盒权限配置
Mac沙盒默认严格限制跨进程通信,必须为应用和XPC Service配置对应的权限:
主应用Entitlements配置
在主应用的.entitlements文件中添加Mach服务查找的临时例外(替换$(TeamIdentifierPrefix)com.yourcompany.DaemonBundle为你的XPC Service完整Mach服务名):
<key>com.apple.security.temporary-exception.mach-lookup.global-name</key> <array> <string>$(TeamIdentifierPrefix)com.yourcompany.DaemonBundle</string> </array>
如果主应用需要访问网络扩展,还需添加:
<key>com.apple.security.network.client</key> <true/>
XPC Service Entitlements配置
由于你的XPC Service需要运行Endpoint Security功能(需root权限),建议禁用沙盒(特权服务无法在沙盒内正常工作):
<key>com.apple.security.app-sandbox</key> <false/>
同时添加Endpoint Security权限:
<key>com.apple.security.endpoint-security.client</key> <true/>
2. 验证launchd Plist配置
确保launchd服务的配置完全正确:
Label字段必须与XPC Service的Mach服务名完全一致(包含团队ID前缀)ProgramArguments指向XPC Service二进制文件的绝对路径(比如/Library/PrivilegedHelperTools/com.yourcompany.DaemonBundle)- 如果需要root权限,设置
UserName为root - 配置
KeepAlive确保服务异常退出后自动重启:<key>KeepAlive</key> <dict> <key>SuccessfulExit</key> <false/> </dict> - 用以下命令确认服务是否正常运行:
如果状态码非0,说明服务启动失败,可查看系统日志排查:launchctl list | grep com.yourcompany.DaemonBundlelog show --predicate 'process == "com.yourcompany.DaemonBundle"' --info
3. 修正代码中的潜在问题
你的XPC连接代码存在两处风险,可能导致连接判断错误:
移除强制解包,避免崩溃
将proxy!.connectResponse(handler)改为可选绑定:
guard let proxy = newConnection.remoteObjectProxyWithErrorHandler { error in Logger(.Error, "Failed to connect with error [\(error)]") self.connection?.invalidate() self.connection = nil handler(false) } as? DaemonXPCProtocol else { Logger(.Error, "Failed to retrieve daemon proxy") handler(false) return }
异步回调修正,避免提前返回成功
不要在connectToDaemon末尾直接调用handler(true),因为proxy.connectResponse是异步操作,应该将成功回调放在Daemon的响应里:
// 假设DaemonXPCProtocol定义为: protocol DaemonXPCProtocol { func connectResponse(completion: @escaping (Bool) -> Void) } // 调用时: proxy.connectResponse { success in DispatchQueue.main.async { handler(success) } }
4. 签名与权限验证
- 主应用和XPC Service必须使用同一开发者账号签名,且启用Hardened Runtime
- 特权XPC Service必须通过
SMJobBless安装(而非手动launchctl load),这是苹果推荐的特权辅助工具安装方式,可确保服务获得正确的权限和签名信任
内容的提问来源于stack exchange,提问作者Bugra Karabudak
相关产品推荐
相关产品推荐

