如何在CXAnswerCallAction后推送视图控制器?CallKit调用URL Scheme遇错求助
解决CallKit接听后展示特定视图控制器的问题
这个问题我之前也碰到过,根源是iOS 9之后的系统权限限制,而且针对自家App内部跳转的场景,其实有更高效的方案,给你两种解决思路:
方案一:直接操作视图控制器(推荐)
既然是自己的App,完全不需要绕URL Scheme的路子,直接在CallKit的回调里激活App并切换到目标视图控制器即可,步骤如下:
- 在
CXProviderDelegate的provider(_:perform:)方法(处理CXAnswerCallAction的逻辑里),先激活应用:
UIApplication.shared.activate(ignoringOtherApps: true)
- 切换到主线程操作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) }
- 别忘了结束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
相关产品推荐
相关产品推荐

