Удерживать вызов callkit при входящем сотовом вызове

У меня проблема (но не очень) с callkit.

Я реализовал callkit в своем приложении, и он отлично работает. Я могу получить второй звонок в свое приложение, и callkit предложит мне варианты «Завершить и принять», «Отклонить» или «Удержать и принять». То же самое происходит, если я звоню по сотовой сети (gsm), и мне звонят из моего приложения. Но когда я звоню в приложение (на callkit) и получаю звонок по сотовой сети (GSM), у меня есть только 2 варианта: «Отклонить» или «Завершить и принять».

Есть идеи, почему? Или как мне получить все 3 варианта?

static var providerConfiguration: CXProviderConfiguration {

    var providerConfiguration: CXProviderConfiguration
    providerConfiguration = CXProviderConfiguration(localizedName: "app name")

    providerConfiguration.supportsVideo = false
    providerConfiguration.maximumCallsPerCallGroup = 1
    providerConfiguration.maximumCallGroups = 3
    providerConfiguration.supportedHandleTypes = [.phoneNumber]
    return providerConfiguration
}

Я реализовал:

providerDidReset, 
CXStartCallAction, 
CXAnswerCallAction, 
CXEndCallAction, 
CXSetHeldCallAction, 
CXSetMutedCallAction, 
timedOutPerforming action, 
didActivate audioSession, 
didDeactivate audioSession.

В моем делегате приложения у меня есть функция, которая проверяет активность пользователя. Я установил точки останова во всех функциях, но ничего не вызывается, пока не отобразится представление входящего вызова сотовой связи (GSM).

Я погуглил, но не нашел решения. Насколько я понимаю, callkit работает отлично.


person Redssie    schedule 09.08.2018    source источник
comment
когда вы делаете / принимаете вызов, вы установили подобный cxcallUpdateObject.supportsHolding = YES ;?   -  person RJV Kumar    schedule 09.08.2018
comment
Да, я установил supportsHolding = true   -  person Redssie    schedule 09.08.2018


Ответы (2)


Я боролся с этим для исходящих звонков. Для исходящих вызовов убедитесь, что вы вызываете этот метод для вызова, как только на него ответит удаленная сторона:

[self.provider reportOutgoingCallWithUUID:currentCall.uuid connectedAtDate:[NSDate date]];

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

Сегодня я немного боролся с этим, пока не понял эту часть. Я также звоню:

 [self.provider reportOutgoingCallWithUUID:currentCall.uuid startedConnectingAtDate:[NSDate date]];

изнутри:

- (void)provider:(CXProvider *)provider performStartCallAction:(CXStartCallAction *)action

Не уверен, что эта часть необходима, но я делаю это, потому что это то, что делает демо Speakerbox. Типа, они делают это в обратном вызове ... Я просто делаю это сразу.

person Chad Barbe    schedule 05.09.2018
comment
Спасибо, что нашли время помочь. Однако я уже установил это, и удержание работает, если все звонки являются голосовыми. если один родной (gsm) а другой voip то удержание не работает. - person Redssie; 10.09.2018
comment
Еще одно предложение ... попробуйте реализовать CXCallObserverDelegate и установить себя в качестве делегата наблюдателя вызова: [_callController.callObserver setDelegate: self queue: nil]; Затем распечатайте все о каждом звонке при каждом обновлении. Примерно так: AWLogInfo (@% @: callChanged uuid =% @ hasEnded =% d, hasConnected =% d isOnHold =% d, isOutgoing =% d, [собственный класс], call.UUID, call.hasEnded, call.hasConnected, call.isOnHold, call.isOutgoing); Обладая этой информацией, я смог увидеть, что мои звонки на самом деле не связаны. Посмотрим, так ли это в вашем случае. - person Chad Barbe; 11.09.2018
comment
очевидно, используйте свой собственный метод ведения журнала, а не AWLogInfo. Это мой собственный метод. - person Chad Barbe; 11.09.2018
comment
Спасибо за идею. Я думаю, что мои звонки связаны (если я сделаю второй звонок в приложение, я получу возможность удержать первый звонок), но стоит попробовать еще раз и проверить. - person Redssie; 12.09.2018
comment
Это сработало. Я использовал эту библиотеку response-native-callkit и столкнулся с той же проблемой с Hold & Accent. Я добавил [self.provider reportOutgoingCallWithUUID: currentCall.uuid connectedAtDate: [NSDate date]]; обработчику завершения транзакций прямо перед [self.provider reportCallWithUUID: startCallAction.callUUID updated: callUpdate]; И у меня есть кнопка «Удержать и принять» и кнопка «Отправить на голосовую почту». Спасибо. - person elf2707; 05.10.2018
comment
Привет, если это сработало для вас, пожалуйста, проголосуйте за мой ответ ... Я мог бы использовать очки репутации! - person Chad Barbe; 03.02.2019

Пока вы отправляли объект CXCallUpdate в CallKit перед вызовом, убедитесь, что вы сохранили значение supportsHolding как true.

Мой CXCallUpdate выглядит примерно так:

let callHandle = CXHandle(type: .phoneNumber, value: handle)
let callUpdate = CXCallUpdate()
if userName != nil{
       callUpdate.localizedCallerName = userName;
}
callUpdate.remoteHandle = callHandle
callUpdate.supportsDTMF = true
callUpdate.supportsHolding = true
callUpdate.supportsGrouping = false
callUpdate.supportsUngrouping = false
callUpdate.hasVideo = false  

Значение вышеуказанных различных свойств:

localizedCallerName = Если вы хотите отображать имя пользователя на экране системного вызова, в противном случае будет показан номер телефона / адрес электронной почты в зависимости от типа дескриптора

supportsDTMF = На главном экране системы, если вы хотите разрешить ввод номеров клавиатуры во время вызова, если вы сделаете это false, опция клавиатуры будет отключена.

supportsHolding = Если вы хотите, чтобы ваш вызов удерживался, когда запускается какой-либо другой вызов, сохраните это свойство true

supportsGrouping = Если вы хотите разрешить конференц-связь (опция объединения вызовов включена на экране вызова), оставьте это true

supportsUngrouping = Инверсия последнего, после объединения вызовов (конференц-связь), должна разрешить разгруппировку или нет.

hasVideo = Если вы поддерживаете видеозвонок, система автоматически запустит камеру.

@Redssie, дайте мне знать, если потребуется дополнительная помощь, связанная с Callkit.

person Mehul Thakkar    schedule 21.08.2018
comment
спасибо, что нашли время, чтобы помочь :) Я установил для поддержки значение true в каждом обновлении, которое я делаю. с родными звонками все равно не работает. он работает для звонков внутри приложения. если я получаю 2 звонка в приложение, оно работает. если 1 вызов находится внутри приложения, а один - на собственный номер телефона, то я не могу удерживать вызов приложения - person Redssie; 21.08.2018
comment
У меня вставлен тот же код, что и выше, и он работает отлично. Убедитесь, что вы сохранили supportsHolding на CXCallUpdate, согласно вашему коду, похоже, вы добавили на CXProviderConfiguration - person Mehul Thakkar; 21.08.2018
comment
Если вы можете поделиться своим кодом, я обязательно дам вам решение. Я работал над CallKit в течение последнего месяца, так что я, безусловно, могу вам помочь. - person Mehul Thakkar; 21.08.2018
comment
Я думаю, что при исходящем звонке вы, возможно, не отправляете CXCallUpdate на CXProvider, а просто совершаете транзакцию. Вот почему у него не будет никаких установленных переменных, как я описал выше. - person Mehul Thakkar; 21.08.2018
comment
это мой CXCallUpdate: let update = CXCallUpdate () update.remoteHandle = CXHandle (тип: .phoneNumber, значение: remoteNumber) update.hasVideo = videoEnabled update.supportsGrouping = false update.supportsHolding = true update.supportsUngroupalized = false update.supportsUngroupalized = false update remoteDisplayName - person Redssie; 22.08.2018
comment
Я установил его в handleIncomingCall и CXStartCallAction. он отлично работает, если все вызовы относятся к приложению. если один вызов поступает на собственный (gsm) номер, а другой - на приложение, удержание не работает. - person Redssie; 22.08.2018
comment
не могу понять, из-за какой проблемы ваш звонок не показывает опцию удержания. Я протестировал свой код, он отлично работает в моем случае, будь то вызов моего приложения, собственный вызов или вызов других приложений. В моем случае он отлично работает во всех случаях. - person Mehul Thakkar; 22.08.2018
comment
Не могли бы вы удалить эти две строчки из своего кода и попробовать. providerConfiguration.maximumCallsPerCallGroup = 1 providerConfiguration.maximumCallGroups = 3, В моем случае я не добавил этой строчки. вероятно может сработать. - person Mehul Thakkar; 22.08.2018
comment
Я пробовал это делать, но все равно не работает. Спасибо за помощь. Это было отложено на некоторое время, поэтому я постараюсь заставить его работать в другой раз :) - person Redssie; 27.08.2018
comment
@MehulThakkar, когда я держу свой голосовой звонок и отвечаю на звонок gsm, никакие СМИ не могут мне помочь ?? - person Jeeva; 19.12.2019
comment
@Jeeva: Что вы имеете в виду, говоря, что это не СМИ? - person Mehul Thakkar; 19.12.2019
comment
@MehulThakkar stackoverflow.com/questions/51764123/ - person Jeeva; 19.12.2019
comment
@MehulThakkar во всех остальных случаях он работает только на удержании и принимает вызов gms, я не могу слышать какие-либо медиа - person Jeeva; 19.12.2019
comment
@Jeeva: Можете ли вы вставить свой код, связанный с этим, возможно, я смогу выяснить, что может быть не так. В противном случае в моем случае он работает отлично. - person Mehul Thakkar; 19.12.2019
comment
@MehulThakkar stackoverflow.com/q/59370625/6059583 это мой вопрос - person Jeeva; 19.12.2019