Скрыть кнопку FaceTime в пользовательском интерфейсе CallKit

Я реализую поддержку CallKit внутри приложения VoIP.

Мне удалось отключить кнопку видео, установив supportsVideo на false в CXProviderConfiguration. Теперь появилась кнопка FaceTime.

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


Обновление. Как указано в ответах ниже, кнопку можно отключить, но номер вызывающего абонента будет потерян (обозначен как Unknown). Я хочу сохранить номер и отключить кнопку FaceTime.


Обновление: при отключении FaceTime в настройках iPhone отключается кнопка FaceTime. Однако это не верное решение проблемы.


Обновление: любые изменения типа CXHandle, в том числе вставка в него символов, недопустимых для номера телефона, не влияют на проблему — кнопка FaceTime по-прежнему отображается.


person Dan Tumaykin    schedule 20.12.2016    source источник
comment
Нашли ли вы какую-либо новую информацию по этой проблеме с тех пор, как последний раз редактировали свой вопрос?   -  person pepsy    schedule 10.10.2019


Ответы (4)


В духе хороших и плохих новостей я смог отключить кнопку FaceTime, очистив remoteHandle (не удалено и не скрыто, просто выделено серым цветом).

Однако в качестве побочного эффекта вызывающий объект отображается как «Неизвестный», если вы не установите свойство localizedCallerName для CXCallUpdate.
Вызов без дескриптора будет иметь побочный эффект, заключающийся в том, что его нельзя будет нажать в разделе «Последние».

CXCallUpdate *callUpdate = [[CXCallUpdate alloc] init];
//callUpdate.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:handle];
[self.provider reportNewIncomingCallWithUUID:uuid update:callUpdate completion:^(NSError* error) {}];
person Eli Burke    schedule 20.12.2016
comment
Спасибо за ответ, думаю, что ваше решение может быть полезно и в других случаях. Я знаю об этом, но, к сожалению, мы хотим сохранить и номер звонившего. Это номер телефона, он просто не имеет ничего общего с FaceTime и глобальной телефонной сетью. - person Dan Tumaykin; 21.12.2016
comment
Не обязательно говорить Неизвестно. Вы можете изменить отображаемую строку, установив свойство localizedCallerName файла CXCallUpdate. Но вызов без дескриптора будет иметь побочный эффект, заключающийся в том, что его нельзя будет нажать в «Последних». - person user102008; 22.12.2016

Я вырвал себе волосы из-за этой проблемы, удаление remoteHandle отключило кнопку, но вы больше не можете звонить из истории системных вызовов.

Наконец-то нашел идеальное решение, которым хочу поделиться.

Предположим, мы поддерживаем аудио/видео.

  1. Инициализировать CXProviderConfiguration.

    let providerConfiguration = CXProviderConfiguration(localizedName: "yourConfigName")
    providerConfiguration.supportsVideo = supportsVideo
    providerConfiguration.supportedHandleTypes = [.generic, .phoneNumber, .emailAddress] // Pick your own supportedHandleTypes.
    
  2. Исключить remoteHandle при сообщении о входящем звонке.

    let update = CXCallUpdate()
    
    // Set hasVideo so it shows correct type on incomingCall screen.
    update.hasVideo = supportsVideo
    
    // Exclude remoteHandle so that the FaceTime button is disabled
    // update.remoteHandle = CXHandle(type: .generic, value: yourHandle)
    
  3. Важно! Обновите remoteHandle при завершении вызова в делегате func provider(_ provider: CXProvider, perform action: CXEndCallAction).

Исключение remoteHandle, когда reportIncomingCall потеряет возможность вызова из истории системных вызовов. Но вы можете обновить вызов и настроить его прямо перед завершением вызова.

 func provider(_ provider: CXProvider, perform action: CXEndCallAction) {
    let update = CXCallUpdate()

    // Set the remoteHandle, so you can call from System Call History
    update.remoteHandle = CXHandle(type: .generic, value: yourHandle)
    provider.reportCall(with: uuid, updated: update)

    action.fulfill()
} 
person dichen    schedule 04.04.2018

Я отключил кнопку FaceTime, следуя тому же подходу, что и для отключения "Добавить вызов". ", которая не нарушает функциональность имени вызывающего абонента, однако, как ни странно, кнопка FaceTime снова становится активной, если пользователь касается кнопки динамика. Я не понимаю, почему это поведение не может быть ошибкой Apple, поэтому я просто отказался от правильного исправления.

редактировать: вот почему: я приписывал CXHandle CXCallUpdate только после того, как вызов был установлен, поэтому сначала кнопка FaceTime была отключена, учитывая, что не было CXHandle. Активация кнопки динамика каким-то образом вызвала обновление в пользовательском интерфейсе CallKit — в этот момент уже существовало бы CXHandle, и, таким образом, кнопка FaceTime была бы включена.

person Gobe    schedule 09.01.2017

Это действительно может отключить кнопку FaceTime, очистив remoteHandle, как говорит @Eli Burke, но побочным эффектом является отключение вызова из «Последних». Я не знаю почему.

person foolishBoy    schedule 23.12.2016
comment
Вы меня не поняли, я просто не знаю, почему я не могу отключить кнопку FaceTime и разрешить звонки из «Недавних»? - person foolishBoy; 26.12.2016