CXPlayDTMFCallAction不播放本地dtmf声音

时间:2016-12-13 23:39:02

标签: ios10 voip dtmf callkit

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

  1. ConfigureAudioSession
  2. startAudio in(didActivate)
  3. stopAudio in(didDeActivate)
  4. 我已经为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键按下声音?

2 个答案:

答案 0 :(得分:3)

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

如果您没有听到本地通话中用户界面播放的音调,那么请report a bug向Apple发送。

答案 1 :(得分:1)

我能够通过以下方式使其发挥作用:

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