我已按照以下教程在我的应用程序中实现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
来获取回溯,但它不会返回任何内容。
答案 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()
代表。