Совершение исходящего звонка с помощью CallKit

У меня на самом деле Swift 2.3. Входящий вызов отлично работает с CallKit. Но исходящий вызов....

Видел проект SpeakerBox, занимаюсь тем же. Но это не работает.

Чтобы начать свой звонок, я использовал

let handle = CXHandle(type: .PhoneNumber, value: "TOTO")
let startCallAction = CXStartCallAction(callUUID: uuid, handle: handle)
startCallAction.video = video
let transaction = CXTransaction()
transaction.addAction(startCallAction)
requestTransaction(transaction)

После этого в SpeakerBox Project эта функция вызывается:

func provider(provider: CXProvider, perform action: CXStartCallAction)

Но не в моем проекте. Затем, когда я вешаю трубку, я вижу: «Вызов не удался».

У вас есть идея?


person Kevin Budain    schedule 18.10.2016    source источник
comment
Call Failed часто указывает на сбой вашего собственного приложения. Можете ли вы сказать в отладчике, что ваше приложение дает сбой?   -  person Stuart M    schedule 19.10.2016
comment
Вы делаете это на устройстве, а не на симуляторе? Вы добавили фоновый режим voip? Вы правильно инициализировали своего провайдера?   -  person user102008    schedule 19.10.2016


Ответы (3)


Убедитесь, что вы правильно настраиваете CXProvider и его делегата. Если вы не установите свойство delegate CXProvider, делегат не получит никаких действий для выполнения.

Кроме того, если вы видите пользовательский интерфейс «Call Failed», это может означать, что ваше приложение дает сбой. Я бы проверил журналы сбоев или запустил приложение в отладчике.

person Stuart M    schedule 27.10.2016

Насколько я вижу, демо-версия SpeakerBox не выполняет следующий метод провайдера:

https://developer.apple.com/documentation/calkit/cxprovider/1930701-reportcall

func reportCall(with UUID: UUID, 
        endedAt dateEnded: Date?, 
         reason endedReason: CXCallEndedReason)  

- (void)reportCallWithUUID:(NSUUID *)UUID endedAtDate:(nullable NSDate 
*)dateEnded reason:(CXCallEndedReason)endedReason;  

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

Вызовите «reportCall endAt» перед тем, как запросить транзакцию CXEndCallAction для удаления экрана «Call failed».

person Lveecode    schedule 05.09.2017
comment
Даже добавив это, мы все еще видим Call Failed. Когда мы добавим это, мы также увидим ошибку транзакции CXEndCallAction — Error Domain = com.apple.CallKit.error.requesttransaction Code = 4 (который является unknownCallUUID). Должны ли мы сделать этот вызов асинхронным или как часть обработки действия завершения вызова в Provider Delegate? - person LowAmmo; 07.10.2017
comment
Если вы получаете сообщение об ошибке Error Domain=com.apple.CallKit.error.requesttransaction Code=4 (который является unknownCallUUID), вы передаете неизвестный UUID в метод reportCallWithUUID. Убедитесь, что вы используете тот же UUID вызова, что и ваш фактический вызов. - person Lveecode; 10.10.2017

Вы добавили необходимые разрешения в свой info.plist?

введите здесь описание изображения

person Septronic    schedule 08.05.2018