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

如何处理CallKit Demo中出现的「No error handler for XPC error: Connection invalid」错误?

解决CallKit演示程序退出时的XPC错误日志问题

问题根源在于你使用了exit(EXIT_SUCCESS)强制终止进程,这种方式会直接杀死应用,导致CallKit与系统服务的XPC连接来不及正常断开,系统检测到无效连接后就会输出[client] No error handler for XPC error: Connection invalid日志。

解决办法:

  1. 避免使用exit()强制退出
    iOS应用的正常生命周期应该由系统管理,主动调用exit()属于异常终止,不仅会触发XPC错误,还可能违反Apple的审核规范。如果是测试场景需要退出,建议让用户通过系统手势(如滑动返回、Home键)操作,或者调用系统提供的后台挂起方法:
@IBAction func exitAction(_: UIBarButtonItem) {
    DispatchQueue.main.async {
        UIApplication.shared.perform(#selector(UIApplication.suspend))
    }
}
  1. 清理CallKit资源后再退出(若必须强制终止)
    如果因为测试需求一定要主动终止应用,需要先清理CallKit相关资源,确保XPC连接正常断开:
  • 先结束所有活跃的CallKit通话:
func endActiveCallAndExit() {
    // 替换为你实际的通话UUID
    guard let activeCallUUID = yourActiveCallUUID else {
        self.exitAfterCleanup()
        return
    }
    
    let endAction = CXEndCallAction(callUUID: activeCallUUID)
    let transaction = CXTransaction(action: endAction)
    
    callController.request(transaction) { [weak self] error in
        if let error = error {
            print("结束通话失败:\(error.localizedDescription)")
        }
        self?.exitAfterCleanup()
    }
}

func exitAfterCleanup() {
    // 释放CallKit控制器实例,断开XPC连接
    callController = nil
    // 延迟确保连接完全断开后再退出
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
        exit(EXIT_SUCCESS)
    }
}
  • 修改exitAction调用上述方法:
@IBAction func exitAction(_: UIBarButtonItem) {
    endActiveCallAndExit()
}

这样处理后,CallKit的XPC连接会正常断开,控制台就不会再输出该错误日志。

内容的提问来源于stack exchange,提问作者Frederick C. Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:33:28