Системный экран iOS Callkit, нет звука, если я жду соединения перед вызовом CXAnswerCallAction::fulfillIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Системный экран iOS Callkit, нет звука, если я жду соединения перед вызовом CXAnswerCallAction::fulfill

Сообщение Anonymous »

Я пытаюсь интегрировать Callkit в приложение Flutter, которое использует webRTC для вызовов, и у меня возникла проблема с приемом вызовов на заблокированном экране.

Код: Выделить всё

CXAnswerCallAction
требует, чтобы метод action.fulfill() вызывался после установления соединения. Вот фрагмент кода, не дожидаясь установления соединения:

Код: Выделить всё

public func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
guard let call = self.callManager?.callWithUUID(uuid: action.callUUID) else{
action.fail()
return
}

call.data.isAccepted = true
self.answerCall = call
self.callManager?.updateCall(call)
sendEvent(SwiftCallKeepPlugin.ACTION_CALL_ACCEPT, call.data.toJSON())

DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(1200)) {
self.configureAudioSession()
}
action.fulfill()
}
Это приводит к тому, что счетчик времени соединения сразу становится видимым на экране, но пользователю все равно приходится ждать установления соединения и он ничего не слышит.
Вот код, который ожидает установления соединения перед вызовом action.fulfill():

Код: Выделить всё

public func waitForConnection(uuid: UUID, action: CXAnswerCallAction) {
if(self.awaitedConnection.uuid != uuid) {
action.fail()
} else if(self.awaitedConnection.isConnected) {
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(1200)) {
self.configureAudioSession()
}
action.fulfill()
} else {
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(1000)) {
self.waitForConnection(uuid: uuid, action: action)
}
}
}

public func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
guard let call = self.callManager?.callWithUUID(uuid: action.callUUID) else{
action.fail()
return

}

call.data.isAccepted = true
self.answerCall = call
self.callManager?.updateCall(call)
self.awaitedConnection.uuid = action.callUUID
self.awaitedConnection.isConnected = false
sendEvent(wiftCallKeepPlugin.ACTION_CALL_ACCEPT, call.data.toJSON())

waitForConnection(uuid: action.callUUID, action: action)
}
К сожалению, хотя на iOS 15.7 это работает отлично, на iOS 17.3 это приводит к отсутствию звука, звука и записи. Я также не могу включить его позже, когда звонок продолжается.
Для справки:

Код: Выделить всё

func configureAudioSession(){
let session = AVAudioSession.sharedInstance()
do{
try session.setCategory(AVAudioSession.Category.playAndRecord, options: AVAudioSession.CategoryOptions.allowBluetooth)
try session.setMode(self.getAudioSessionMode(data?.audioSessionMode ?? "voiceChat"))
try session.setActive(data?.audioSessionActive ?? true)
try session.setPreferredSampleRate(data?.audioSessionPreferredSampleRate ?? 44100.0)
try session.setPreferredIOBufferDuration(data?.audioSessionPreferredIOBufferDuration ?? 0.005)
}catch{
print(error)
}
}
В документации action.fulfill() я вижу, что «этот метод следует вызывать только из реализации метода CXProviderDelegate».
/>В этом ли причина проблемы? Но как это сделать, если соединение нужно ждать асинхронно, а метод провайдера синхронный?

Подробнее здесь: https://stackoverflow.com/questions/780 ... lling-cxan
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»