【问题标题】:CXPlayDTMFCallAction doesn't play local dtmf soundCXPlayDTMFCallAction 不播放本地 dtmf 声音
【发布时间】:2017-04-29 04:24:37
【问题描述】:

我正在将 CallKit 与 VOIP 应用程序集成。我能够拨打和拨打电话。我按照以下步骤操作:

  1. 配置音频会话
  2. 在 (didActivate) 中启动音频
  3. stopAudio in (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 按键声音?

【问题讨论】:

  • “本地拨号器”是指电话应用程序中的“键盘”选项卡,还是本地通话界面中显示的“键盘”按钮?
  • @StuartM 是的,原生通话界面。
  • @ssk 什么是 self.softphone,它是如何在 callkit 的 ProviderDelegate.swift 中实现的,以及如何在自定义拨号器 UI 上发送按下的数字以进行 IVR 处理。
  • @ParthBarot elf.softphone 是 PJSIP 的 pjsua 库的包装器。

标签: ios10 voip dtmf callkit


【解决方案1】:

在本地通话界面的“键盘”按钮中按下按键时,CallKit 应在本地播放 DTMF 音。但 CallKit 应用负责通过自己的网络接口将 DTMF 音调发送到远程端。

如果您在本地通话 UI 中没有听到本地播放的铃声,请report a bug 发送至 Apple。

【讨论】:

  • 据我阅读并尝试实现对 IVR 系统的 VOIP 呼叫。这种方法是在什么基础上调用的?假设 IVR 说请在 1 声哔声后输入 4。我的应用会在 1 声哔声后收到通知吗?
【解决方案2】:

我能够通过以下方式使其工作:

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;
}

【讨论】:

  • 什么是 self.softphone 以及它是如何在 callkit 的 ProviderDelegate.swift 中实现的以及如何在自定义拨号器 UI 上发送按下的数字以进行 IVR 处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多