Экран CallKit идет за пользовательским интерфейсом приложения во время звонка - PullRequest
0 голосов
/ 03 марта 2020

У нас есть приложение iOS, которое настроено на получение уведомлений VoIP через инфраструктуру PushKit. Когда приходит уведомление VoIP, мы немедленно сообщаем о входящем звонке в CallKit (согласно iOS 13 рекомендациям) со следующим кодом:

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
        let backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: nil)
        self.callsManager.handleIncomingNotification(with: payload.dictionaryPayload, backgroundTaskIdentifier: backgroundTaskIdentifier, completion: completion)
    }

CallsManager - это одноэлементный класс, который обрабатывает входящее уведомление как следует:

        let call = addOrUpdateCall(
            service: TwilioService(),
            token: voipNotification.token,
            in: voipNotification.room,
            with: voipNotification.nickname,
            uuid: UUID())

        if call.ring() != .none {
            let update = CXCallUpdate()
            update.remoteHandle = CXHandle(type: .emailAddress, value: voipNotification.email)
            update.hasVideo = voipNotification.hasVideo
            update.supportsDTMF = false
            update.supportsHolding = false
            update.supportsGrouping = false
            update.supportsUngrouping = false
            update.localizedCallerName = voipNotification.nickname

            self.callProvider?.reportNewIncomingCall(with: call.uuid, update: update, completion: { (error) in
               completion()

               if let error = error {
                  self.serialQueue.async {
                      switch error {
                        case CXErrorCodeIncomingCallError.filteredByDoNotDisturb, CXErrorCodeIncomingCallError.filteredByBlockList:
                           _ = call.decline()
                        default:
                           call.fail(error: error)
                      }
                   }
               }
           })
       }

По сути, мы извлекаем необходимую информацию из уведомления и немедленно отображаем экран входящего вызова.

Функция addOrUpdateCall просто гарантирует, что в массив вызовов, которые у нас есть в памяти, мы не храним дубликаты вызовов.

Обычно это работает отлично: отображается экран входящих вызовов CallKit, и телефон начинает звонить. Но иногда очень редко c экран CallKit отображается на секунду, а затем исчезает за пользовательским интерфейсом приложения.

Это происходит только тогда, когда приложение находится на переднем плане или телефон разблокирован. не происходит, если телефон заблокирован.

После многих попыток мы нашли несколько systemati c способ воспроизведения проблемы с использованием двух iOS устройств:

  1. С одного устройства позвоните на другое и положите трубку через несколько секунд.
  2. Повторите это три раза подряд, оставляя несколько секунд между каждым вызовом.
  3. Вызов с другого устройства: на первом устройстве интерфейс CallKit отображается в течение секунды, а затем скрывается за приложением, но устройство продолжает звонить и вибрировать.

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

Я уже пытался найти обходной путь, при котором я непрерывно звоню reportNewIncomingCall каждую секунду, надеясь, что это принесло бы интерфейс CallKit впереди. Похоже, что это облегчает проблему, но это все еще происходит время от времени.

Мы пробовали несколько моделей iPhone, и кажется, что iPhone XS и iPhone XS Max (пользовательский интерфейс CallKit появляется и скрывается через секунду, но возвращается автоматически, даже без обходного пути, описанного выше) , но мы смогли воспроизвести проблему на iPhone 7, два iPhone 6S и iPhone 6S Plus.

Кто-нибудь может мне помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...