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

如何在CXAnswerCallAction后推送视图控制器?CallKit调用URL Scheme遇错求助

解决CallKit接听后展示特定视图控制器的问题

这个问题我之前也碰到过,根源是iOS 9之后的系统权限限制,而且针对自家App内部跳转的场景,其实有更高效的方案,给你两种解决思路:

方案一:直接操作视图控制器(推荐)

既然是自己的App,完全不需要绕URL Scheme的路子,直接在CallKit的回调里激活App并切换到目标视图控制器即可,步骤如下:

  1. 在CXProviderDelegate的provider(_:perform:)方法(处理CXAnswerCallAction的逻辑里),先激活应用:
UIApplication.shared.activate(ignoringOtherApps: true)
  1. 切换到主线程操作UI(CallKit回调可能在后台线程),直接获取当前窗口并跳转:
DispatchQueue.main.async {
    // 获取当前主窗口
    guard let keyWindow = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) else { return }
    
    // 初始化你的目标视图控制器
    let targetVC = YourSpecificViewController()
    
    // 根据需求选择跳转方式:
    // 方式1:设置为根视图控制器(适合完全替换当前界面的场景)
    keyWindow.rootViewController = UINavigationController(rootViewController: targetVC)
    
    // 方式2:如果当前根VC是导航控制器,直接push
    // if let navController = keyWindow.rootViewController as? UINavigationController {
    //     navController.pushViewController(targetVC, animated: true)
    // }
    
    // 方式3:present弹出目标VC
    // keyWindow.rootViewController?.present(targetVC, animated: true)
}
  1. 别忘了结束CallKit的action,避免超时:
action.fulfill()

这个方案不需要额外配置权限,跳转逻辑更直接可靠,是内部界面跳转的最优解。

方案二:配置URL Scheme白名单(如果一定要用URL Scheme)

如果你坚持要用URL Scheme的方式,需要在Info.plist里添加权限白名单:

打开项目的Info.plist文件,添加LSApplicationQueriesSchemes数组键:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>URLgoesHERE</string> <!-- 替换成你实际的Scheme名称 -->
</array>

配置完成后再调用openURL(_:)就不会报错了,不过还是建议优先用方案一,毕竟内部跳转没必要绕URL Scheme的流程。

注意:CallKit回调可能发生在App后台状态,调用openURL(_:)前最好先调用UIApplication.shared.activate(ignoringOtherApps: true)确保App激活,否则可能无法正常跳转。

内容的提问来源于stack exchange,提问作者Sidharth Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:12:00