2

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

  1. 配置音频会话
  2. startAudio in (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 按键声音?

4

2 回答 2

3

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

如果您没有在本地通话 UI 中听到本地播放的铃声,请向 Apple报告错误。

于 2016-12-14T18:50:34.830 回答
3

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

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;
}
于 2016-12-15T19:54:20.343 回答