Ios UI-won';从后台接收的VOIP呼叫输入我的应用程序时是否显示?

Ios UI-won';从后台接收的VOIP呼叫输入我的应用程序时是否显示?,ios,swift,background,voip,Ios,Swift,Background,Voip,当从一个传入的背景视频呼叫打开应用程序时,我对显示我的UI有点困惑。我正在成功地使iOS在应用程序处于后台时调用默认的“传入视频呼叫”界面,但在呼叫应答后,我的应用程序没有被正确唤醒 当我收到呼叫推送时,我会设置一个CXProvider并通知CallKit有来电: func handleIncomingCallFromBackground() { //These properties are parsed from the push payload before this

当从一个传入的背景视频呼叫打开应用程序时,我对显示我的UI有点困惑。我正在成功地使iOS在应用程序处于后台时调用默认的“传入视频呼叫”界面,但在呼叫应答后,我的应用程序没有被正确唤醒

当我收到呼叫推送时,我会设置一个CXProvider并通知CallKit有来电:

    func handleIncomingCallFromBackground() {
        //These properties are parsed from the push payload before this method is triggered
        guard let callingUser = callingUser, roomName != nil else {
            print("Unexpected nil caller and roomname (background)")
            return
        }

        let callHandleTitle = "\(callingUser.first_name) \(callingUser.surname)"

        let configuration = CXProviderConfiguration.default
        let callKitProvider = CXProvider(configuration: configuration)
        callKitProvider.setDelegate(self, queue: nil)

        let callHandle = CXHandle(type: .generic, value: callHandleTitle)
        self.callHandle = callHandle

        let callUpdate = CXCallUpdate.default
        callUpdate.remoteHandle = callHandle

        let callUUID = UUID()
        self.callUUID = callUUID

        callKitProvider.reportNewIncomingCall(with: callUUID, update: callUpdate) { error in
            if error != nil {
                self.resetTwilioObjects()
            }
        }
    }
我响应CXProvider的应答调用委托方法,在该方法中,我从服务器获取视频调用的访问令牌,向服务器发送响应以提醒调用方我们已接受该调用,并执行到我们自己的视频调用控制器的切换(这就是jobsVC.showVideoCallVC()的全部功能)它处理通过Twilio房间等连接呼叫。代码如下

 func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
        guard let customer = callingUser, let callHandle = self.callHandle, let uuid = callUUID, let roomName = roomName else {
            resetTwilioObjects()
            return
        }

        self.twilioAPI = TwilioAPI()
        self.twilioAPI!.accessToken(room: roomName) { (success, accessToken) in
            switch success{
            case true:
                guard let token = accessToken else {
                    return
                }

                let customerID = customer.userID

                DispatchQueue.global().asyncAfter(deadline: .now() , execute: {
                    self.twilioAPI!.postResponse(customerID: customerID, status: 1) { (success) in
                        if let success = success, !success {
                            self.resetTwilioObjects()
                        }
                    }
                })

                guard let jobsVC = P_ChildHomeJobsVC.instance else {
                    print("Jobs VC unexpectedly nil")
                    return
                }

                //All this method does is perform a segue, the parameters are stored for later.
                jobsVC.showVideoCallVC(callingUser: customer, callHandle: callHandle, callKitProvider: provider, callUUID: uuid, twilioAccessToken: token, roomName: roomName)
                action.fulfill()

            default:
                action.fail()
                self.resetTwilioObjects()
            }
        }
    }
根据设备是否锁定,我会得到不同的行为:

  • 如果设备被锁定,在点击我的应用图标打开应用程序时,我会看到最新的应用程序屏幕截图,顶部会显示一个绿色条,而不是UI
  • 如果设备被解锁,在点击我的应用图标打开应用程序时,什么也不会发生——它会停留在iOS界面上
根据我的日志,segue实际上正在正确执行,视频呼叫控制器的内部工作甚至正在启动,但在我得到applicationWillResignActive:delegate调用后不久,一切都停止了

奇怪的是(或者可能不是)如果设备在应用程序仍在前台时被锁定,一切都会按预期进行:应用程序被正确唤醒,并显示更新的UI。我注意到我仍然得到applicationWillResignActive:call,但在那之后立即得到applicationdidebecomeactive:call

关于我可能做错了什么,有人有什么建议或提示吗