如何在使用CallKit应答呼叫时显示ViewController

时间:2017-06-16 13:49:47

标签: ios swift xcode swift3 callkit

我已按照以下教程在我的应用程序中实现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 个答案:

答案 0 :(得分: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://stackoverflow.com/a/35226874/5798668,第一个选项更可取,因为如果您使用第二个选项,您将同时在您的应用中激活多个UIWindows。

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