CXPlayDTMFCallAction не воспроизводит локальный звук в формате dtmf

Я интегрирую CallKit с приложением VOIP. Я мог совершать входящие и исходящие звонки. Я пошел по шагу:

  1. ConfigureAudioSession
  2. startAudio в (didActivate)
  3. stopAudio в (didDeActivate)

Я реализовал обратные вызовы для делегата поставщика DTMF, как показано ниже:

func provider(_ provider: CXProvider, perform action: CXPlayDTMFCallAction) {
    print("Provider - CXPlayDTMFCallAction")

    let dtmfDigts:String = action.digits

    for (index, _) in dtmfDigts.characters.enumerated() {
        let dtmfDigit = dtmfDigts.utf8CString[index]
        print("Processing dtmfDigit:\(dtmfDigit)" )
        self.softphone.dtmf(on:dtmfDigit)
    }

    self.softphone.dtmfOff()

    // Signal to the system that the action has been successfully performed.
    action.fulfill()
}

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

Из https://developer.apple.com/reference/callkit/cxplaydtmfcallaction:

«CallKit автоматически воспроизводит соответствующие частоты DTMF для любых цифр, передаваемых во время вызова. Приложение отвечает за управление синхронизацией и обработкой цифр как часть выполнения действия».

Это известная проблема или callkit не воспроизводит локальные звуки нажатия клавиш dtmf?


person ssk    schedule 13.12.2016    source источник
comment
Под «родной» программой набора номера вы имеете в виду вкладку «Клавиатура» в приложении «Телефон» или кнопку «клавиатура», отображаемую во встроенном пользовательском интерфейсе вызова?   -  person Stuart M    schedule 14.12.2016
comment
@StuartM Да, собственный интерфейс вызова.   -  person ssk    schedule 14.12.2016
comment
@ssk Что такое self.softphone и как это реализовано в ProviderDelegate.swift callkit и как отправить нажатую цифру в пользовательский интерфейс Custom Dialer для обработки IVR.   -  person Parth Barot    schedule 18.11.2019
comment
@ParthBarot elf.softphone - это оболочка для библиотеки pjsua PJSIP.   -  person ssk    schedule 18.11.2019


Ответы (2)


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

Если вы не слышите локально воспроизводимые тоны из собственного пользовательского интерфейса во время разговора, сообщите об ошибке в Apple. .

person Stuart M    schedule 14.12.2016
comment
Насколько я читал и пытаюсь реализовать вызов VOIP в систему IVR. На каком основании называется этот метод? Скажем, IVR говорит, что введите 4 после 1 звукового сигнала. Будет ли мое приложение уведомлено после этого 1 гудка? - person nr5; 14.06.2019

Мне удалось заставить его работать:

func provider(_ provider: CXProvider, perform action: CXPlayDTMFCallAction) {
    print("Provider - CXPlayDTMFCallAction")

    self.softphone.audioController.configureAudioSession()

    let dtmfDigts:String = action.digits

    for (index, _) in dtmfDigts.characters.enumerated() {
        let dtmfDigit = dtmfDigts.utf8CString[index]
        print("Processing dtmfDigit:\(dtmfDigit)" )
        self.softphone.dtmf(on:dtmfDigit)
    }

    self.softphone.dtmfOff()

    // Signal to the system that the action has been successfully performed.
    action.fulfill()
}

Примечание. Я добавил self.softphone.audioController.configureAudioSession ().

-(void) configureAudioSession
{
    // Configure the audio session
    AVAudioSession *sessionInstance = [AVAudioSession sharedInstance];

    // we are going to play and record so we pick that category
    NSError *error = nil;
    [sessionInstance setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
    if (error) {
        NSLog(@"error setting audio category %@",error);
    }

    // set the mode to voice chat
    [sessionInstance setMode:AVAudioSessionModeVoiceChat error:&error];
    if (error) {
        NSLog(@"error setting audio mode %@",error);
    }

    NSLog(@"setupAudioSession");

    return;
}
person ssk    schedule 15.12.2016
comment
Что такое self.softphone и как он реализован в ProviderDelegate.swift callkit и как отправить нажатую цифру в пользовательском интерфейсе Custom Dialer для обработки IVR. - person Parth Barot; 18.11.2019