Звук не работает, когда на входящий звонок отвечают, когда экран заблокирован - быстро

Я создаю приложение с помощью службы VOIP. Теперь я интегрировал свое приложение с CallKit, чтобы обрабатывать запрос входящего вызова.

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

Как решить эту проблему?

Вот как сообщает о входящих звонках:

func reportIncomingCall(uuid: UUID, handle: String, hasVideo: Bool = false, completion: ((NSError?) -> Void)?) {
    // 1.
    print("This is UUID === ", uuid)
    configureAudioSession()
    let update = CXCallUpdate()
    update.remoteHandle = CXHandle(type: .phoneNumber, value: handle)
    update.hasVideo = hasVideo


    provider.reportNewIncomingCall(with: uuid, update: update) { error in


        if error == nil {
            // 3.
            self.configureAudioSession()
            let call = CallKitCallInit(uuid: uuid, handle: handle)
            self.callKitManager.add(call: call)
            lastCallUUID = uuid
            print("UUID === ", uuid)
        } else {

        }

        // 4.
        completion?(error as NSError?)
    }


}

Вот как я настраиваю звук

func configureAudioSession() {
    let session = AVAudioSession.sharedInstance()
    do{
        try session.setCategory(AVAudioSessionCategoryPlayAndRecord)

    } catch {
        print("========== Error in setting category \(error.localizedDescription)")
    }
    do {
        try session.setMode(AVAudioSessionModeVoiceChat)
    } catch {
        print("========= Error in setting mode \(error.localizedDescription)")
    }
    do {
        try session.setPreferredSampleRate(44100.0)
    } catch {
        print("======== Error setting rate \(error.localizedDescription)")
    }
    do {
        try session.setPreferredIOBufferDuration(0.005)
    } catch {
        print("======== Error IOBufferDuration \(error.localizedDescription)")
    }
    do {
        try session.setActive(true)
    } catch {
        print("========== Error starting session \(error.localizedDescription)")
    }
}

Когда я ответил на звонок, когда экран заблокирован, я увидел ошибку, которую он выдал в функции configureAudioSession().

Почему не удается установить звук при заблокированном экране?


person Visal Sambo    schedule 30.12.2018    source источник
comment
Есть в этом успех?   -  person WorieN    schedule 22.07.2019
comment
@WorieN Я сделал, добавив action.fulfill() внутри provider(_ provider: CXProvider, perform action: CXAnswerCallAction) функции CXProviderDelegate   -  person Visal Sambo    schedule 23.07.2019
comment
@WorieN Подробнее читайте в моем ответе ниже. Это работает для меня.   -  person Visal Sambo    schedule 23.07.2019


Ответы (2)


Я сделал, добавив эти строки кода

func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
    // 1.
    guard let call = callKitManager.callWithUUID(uuid: action.callUUID) else {
        action.fail()
        return
    }
    // 2.
    configureAudioSession()
    // 3.
    call.answer()
    // 4.
    action.fulfill()
}

Это configureAudioSession

func configureAudioSession() {
    let session = AVAudioSession.sharedInstance()

    do{
        try session.setCategory(AVAudioSession.Category.playAndRecord,
                                mode: AVAudioSession.Mode.voiceChat,
                                 options: [])

    } catch {
        print("========== Error in setting category \(error.localizedDescription)")
    }

    do {
        try session.setPreferredSampleRate(44100.0)
    } catch {
        print("======== Error setting rate \(error.localizedDescription)")
    }
    do {
        try session.setPreferredIOBufferDuration(0.005)
    } catch {
        print("======== Error IOBufferDuration \(error.localizedDescription)")
    }
    do {
        try session.setActive(true)
    } catch {
        print("========== Error starting session \(error.localizedDescription)")
    }
}
person Visal Sambo    schedule 23.07.2019

Вы можете попробовать использовать AVAudioSessionModeVoiceChat вместо режима AVAudioSessionModeMoviePlayback при настройке аудиосеанса.

person Sanjan Piya    schedule 30.12.2018
comment
Я обновился, но все еще не работает. Есть ли другое решение? @Sanjan - person Visal Sambo; 30.12.2018