Для поддержки удержания вам не нужно запускать / останавливать аудио сеанс, вместо этого вы можете использовать CXSetHeldCallAction
, предоставляемый самим Callkit. Вот код удержания, который я использую.
let callKitCallController = CXCallController()
func performHoldAction(isOnHold:Bool, uuid:UUID) {
let holdCallAction = CXSetHeldCallAction(call: uuid, onHold: isOnHold)
let transaction = CXTransaction(action: holdCallAction)
callKitCallController.request(transaction) { error in
if let error = error {
CPrint("holdCallAction transaction request failed: \(error.localizedDescription).")
return
}
CPrint("holdCallAction transaction request successful")
}
}
Как только система переводит вызов в режим удержания (указанным выше методом ИЛИ из-за принятия другого входящего вызова или по любой другой причине), затем в CXProviderDelegate
метод func provider(_ provider: CXProvider, perform action: CXSetHeldCallAction)
возвращает ответный вызов для получения подробной информации.
Здесь система / callkit сама взаимодействует со звуком, вам не нужно явно запускать или останавливать аудио для удержания.
Примечание: убедитесь, что вы дали supportsHolding
- true
для CXCallUpdate
, который вы дали для нового вызова.