使用 CallKit 接听电话时如何显示 ViewController

Posted

技术标签:

【中文标题】使用 CallKit 接听电话时如何显示 ViewController【英文标题】:How to display a ViewController when answering a call with CallKit 【发布时间】:2017-06-16 13:49:47 【问题描述】:

我已按照以下教程在我的应用中实现 CallKit:

https://www.raywenderlich.com/150015/callkit-tutorial-ios

但我想更进一步,在通话处于活动状态时显示我自己的 ViewController。我正在做视频通话服务,所以我想拥有自己的界面。

这可能吗?我一直在尝试从方法provider(CXProvider:CXAnswerCallAction) 启动 ViewController,这是用户接听电话时调用的方法,但它似乎每次都崩溃。我正在尝试用这个(Swift 3)实例化它:

let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "VideoCallViewController") as! VideoCallViewController
UIApplication.shared.keyWindow?.rootViewController?.present(vc, animated: true, completion: nil)

它在没有解释的情况下在第二行崩溃。它显示lldb,我尝试通过输入bt 来获取回溯,但它没有返回任何内容。

【问题讨论】:

【参考方案1】:

我想通了:

let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc = mainStoryboard.instantiateViewController(withIdentifier: "VideoCallViewController") as! VideoCallViewController

那么,要么:

vc.view.frame = UIScreen.main.bounds
UIView.transition(with: self.window!, duration: 0.5, options: .transitionCrossDissolve, animations: 
    self.window!.rootViewController = vc
, completion: nil)

或:

self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.rootViewController = vc
self.window?.makeKeyAndVisible()

根据https://***.com/a/35226874/5798668,第一个选项更可取,因为如果您使用第二个选项,您的应用中将同时有多个 UIWindows 处于活动状态。

注意:在我的情况下,ProviderDelegate 没有self.window 属性,这是由AppDelegate.swift 传递给它的,其中推送通知正在执行委托的reportIncomingCall()

【讨论】:

在锁定屏幕上接收视频通话时,您是否找到了一种方法来展示您的应用(使用您自己的 Call ViewController)?

以上是关于使用 CallKit 接听电话时如何显示 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 iOS 模拟器中使用 CallKit 接听电话?

Callkit 和 Webrtc 从锁定屏幕接听电话时没有音频

使用 CallKit 显示用于拨出 VoIP 呼叫的 iOS 本机呼叫 UI

如何在使用 Callkit 时播放声音,例如铃声?

CallKit:屏幕锁定时启动应用程序

如何在 iOS 10 上使用 CallKit 显示来电显示(添加标识条目)