You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>
    
  • 用以下命令确认服务是否正常运行:
    launchctl list | grep com.yourcompany.DaemonBundle
    
    如果状态码非0,说明服务启动失败,可查看系统日志排查:
    log 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:57:13