У меня проблема с CallKit API в iOS 10.3.3 и более поздних версиях iOS.
Моя конфигурация поддерживает удержание и группировку вызовов, вот фрагмент кода.
let configuration = CXProviderConfiguration(localizedName: applicationName)
configuration.supportsVideo = supportsVideo
configuration.supportedHandleTypes = [.phoneNumber]
configuration.maximumCallGroups = 2
configuration.maximumCallsPerCallGroup = 3
В iOS10, CallKit сбрасывает вызов, когда приложение запрашивает действие setHeld для вызова.Вот фрагмент запроса действия вызова setHeld.
public func performSetCallOnHoldAction(_ call: Call, isOnHold: Bool) {
let setHeldAction = CXSetHeldCallAction(call: UUID(uuidString: call.callUUID)!, onHold: isOnHold)
let transaction = CXTransaction()
transaction.addAction(setHeldAction)
requestTransaction(transaction)
}
И, наконец, вот метод делегата CXProvider, который завершает действие удержания / отмены вызова для вызова:
func provider(_ provider: CXProvider, perform action: CXSetHeldCallAction) {
// Retrieve the Call instance corresponding to the action's call UUID
guard let call = CallList.sharedInstance().call(withUUID: action.callUUID.uuidString) else {
action.fail()
return
}
// Perform PJSUA set held action
if action.isOnHold {
Pjsua2Wrapper.sharedInstance()?.holdCall(withCallUUID: call.callUUID, completion: { (error) in
(error != nil) ? action.fail() : action.fulfill()
})
} else {
Pjsua2Wrapper.sharedInstance()?.unholdCall(withCallUUID: call.callUUID, completion: { (error) in
(error != nil) ? action.fail() : action.fulfill()
})
}
}
Обратите внимание, чтоЯ использую Pjsip для выполнения действия удержания / отмены удержания и внутри блока завершения, который я называю action.fulfill(
) или action.fail()
, в зависимости от того, возвращает ли psjip ошибку.
В графическом интерфейсе приложения есть кнопка переключения переключения,который вызывает функцию для выполнения CXSetHeldCallAction
на CXCallController
.
В iOS 11.0 все работает отлично, но в iOS 10, когда вы нажимаете эту кнопку переключения, вызов, который должен быть переведен в режим удержания, получаетпо какой-то причине завершается CXProvider
(CXProvider
отвечает CXEndCallAction
).
Я искал в отладчике метод requestTransaction
, если он возвращает ошибку транзакции, но нет ошибки при запросе транзакции для вызова контроллера.
Кто-нибудь имеет представление о том, что не так,или что-то, что я могу попробовать решить эту проблему?