Переход с пользовательского интерфейса CallKit на пользовательский интерфейс в приложении

У меня есть приложение VoIP. Раньше он работал без CallKit, поэтому у него есть собственный пользовательский интерфейс вызова в приложении. Теперь я интегрирую CallKit UI для обработки вызовов, которые происходят, когда приложение не запущено, и у меня есть вопрос:

Каков рекомендуемый способ определить момент, когда пользовательский интерфейс CallKit закрывается и собирается переключиться на пользовательский интерфейс в приложении?

В настоящее время я вижу, что пользовательский интерфейс CallKit исчезает в двух случаях:

  1. когда процесс приложения не запущен, а устройство разблокировано (например, на главном экране) и поступает вызов, сначала появляется пользовательский интерфейс CallKit, но если вы принимаете вызов (ответ), пользовательский интерфейс CallKit немедленно исчезает, и появляется приложение.
  2. когда процесс приложения не запущен, а устройство заблокировано, поступает вызов, появляется пользовательский интерфейс CallKit, вы принимаете вызов (ответ), а затем нажимаете значок приложения в пользовательском интерфейсе CallKit, затем снова пользовательский интерфейс CallKit исчезает и появляется приложение.

Каков рекомендуемый способ обнаружения этих условий для создания пользовательского интерфейса в приложении?

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

Я просмотрел API CallKit, но ничего не нашел для этой цели.


person battlmonstr    schedule 12.07.2018    source источник


Ответы (2)


Для второго варианта использования у меня в AppDelegate есть такая логика:

func applicationWillEnterForeground(_ application: UIApplication) {
    maybeShowCallUi()
}

fileprivate func maybeShowCallUi() {
    if CallManager.shared.calls.count > 0 {
        print("One or more calls active.")
        DispatchQueue.main.async() { [weak self] in
            print("Trying to show in call UI.")
            self?.showInCallViewController()
        }
    } else {
        print("No calls active.")            
    }
} 

Мой объект CallManager похож на образец кода SpeakerBox, предоставленный Apple. Он отслеживает все звонки.

person TALE    schedule 08.07.2019
comment
не делайте этого, используйте callObserver для обнаружения частной функции системного вызова isOnPhoneCall (_ callObj: CallInfoModel) - ›Bool {для вызова в CXCallObserver (). calls {if call.hasEnded == false {return true} if call.isOutgoing {return true }} return false} - person famfamfam; 05.10.2020
comment
Я не уверен, почему вы говорите не делать этого. CallManager - это наблюдатель, который просто отслеживает вызовы, поскольку CallKit уведомляет о них приложение. battlmonstr хотел узнать, как переключиться на пользовательский интерфейс приложения. Это то, что делает приведенный выше код. - person TALE; 08.10.2020
comment
братан, я использовал класс CallManager. затем, используя диспетчер SpeakerBox, я обнаружил, что иногда вызов не может быть отклонен менеджером или иногда сбой, поэтому calls.count ›0, но это означает, что системный вызов отображается, поэтому я решаю использовать CXCallObserver = пусть система его обнаружит для нас вместо CallManager - person famfamfam; 08.10.2020

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

    - (void)provider:(CXProvider *)provider performAnswerCallAction:(nonnull CXAnswerCallAction *)action {
        //show call screen here. 
      }
person RJV Kumar    schedule 13.07.2018
comment
Спасибо за предложение, но для случая 2 это не работает. - person battlmonstr; 13.07.2018