UI не будет отображаться при входе в мое приложение из VOIP-звонка, полученного в фоновом режиме? - PullRequest
0 голосов
/ 24 января 2019

У меня небольшая путаница в отношении отображения моего пользовательского интерфейса при открытии приложения из входящего фонового видеовызова.Я успешно заставляю iOS вызывать интерфейс «входящего видеовызова» по умолчанию, когда приложение находится в фоновом режиме, но после ответа на вызов мое приложение не просыпается должным образом?

Когда я получаюpush push, я устанавливаю 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()
            }
        }
    }

В зависимости от того, заблокировано ли устройство, я получаю различные действия:

  • Если устройство заблокировано, при нажатиизначок моего приложения, чтобы открыть приложение, я получаю последний скриншот приложения с зеленой полосой вверху вместо пользовательского интерфейса.
  • Если устройстворазблокирована, после нажатия на значок моего приложения, чтобы открыть приложение, ничего не происходит вообще - оно остается на интерфейсе iOS.

Согласно моим журналам, переход фактически выполняется правильно, и внутренняя работаконтроллер видеозвонка даже запускается, но вскоре после того, как я получаю applicationWillResignActive: делегатский вызов и все останавливается.

Что странно (а может и нет), если устройство заблокировано во время блокировкиприложение все еще находится на переднем плане, все работает как положено: приложение правильно проснулось и отображается обновленный пользовательский интерфейс.Я заметил, что я все еще получаю applicationWillResignActive: вызов, но сразу же получаю applicationDidBecomeActive: после этого.

Есть ли у кого-нибудь какие-либо предложения или подсказки относительно того, кем я могу бытьделать неправильно?

...