2017-10-16 275 views
1

当我的VOIP应用程序中开始使用CallKit时,我遇到了多个呼叫的问题。当接听第二个电话并将第一个电话置于保持状态时,CallKit没有声音

当有一对一VOIP呼叫时,声音工作正常。但一旦一方获得另一个VOIP呼叫,并选择保留并接受选项;第一个通话成功挂起,第二个通话被应答;但声音现在已经关闭了。即使在调用之间交换也不起作用。并且删除一个呼叫也不起作用。 我正在使用RTP进行语音。

我试图把断点,并检查AVAudioSession的类别和模式是否正确。

在控制台中,我可以检查我的末端,有多个呼叫的设备,停止发送声音数据包。

我使VOIP之前reportNewIncomingCallWithUUIDCXStartCallAction提供商。

与GSM呼叫相同的情况。如果有一对一VOIP呼叫,并且声音正常,并且在一侧接收到GSM呼叫,并且用户选择保持并接受选项,则GSM呼叫中的声音工作正常。但是,如果用户使VOIP呼叫处于活动状态,并通过交换呼叫来保持GSM呼叫,则VOIP呼叫中没有声音。交换呼叫并使GSM呼叫处于活动状态,声音再次正常工作。但VOIP电话没有声音。

在这种情况下,我们得到AVAudioSessionInterruptionTypeBeganAVAudioSessionInterruptionTypeEnded永远不会被调用。即使在GSM呼叫结束之后。

有没有人遇到类似的问题?

回答

0

有同样的问题。如果我有1个有效的通话,那么新的通话是传入的,我点击保持&接受。新的通话工作,但在CallKit音频中使用Swap后停止工作。

经过长时间调试发现,实际音频通过CallKit本机接口停用/激活交换呼叫的位置 - 即provider:performSetHeldCallAction:方法从CXProviderDelegate协议。

在我的情况下,我使用[audioController deactivateAudioSession]方法的电话是放在OnHold。

但是我发现,当通过CallKit点击Swap按钮时,同样的方法provider:performSetHeldCallAction:被激活用于正处于活动状态的其他呼叫(来自OnHold状态)。

所以在我的情况下,我首先切换保持呼叫(它把呼叫保持或将其保持活跃状态​​)。 然后我检查呼叫状况(无论是否保持),然后分别停用或激活音频。

在常见的方式,它看起来是这样的:

- (void)provider:(CXProvider *)provider performSetHeldCallAction:(CXSetHeldCallAction *)action { 
    SomeCallClass *call = [self.callManager callWithUUID:action.callUUID]; 
    if (!call) { 
     [action fail]; 
     return; 
    } 

    NSError *holdError; 
    [call toggleHold:&holdError]; 

    if (holdError) { 
     [action fail]; 
    } else { 

     if (call.onHold) 
      [self.audioController deactivateAudioSession]; 
     else 
      [self.audioController activateAudioSession]; 
     [action fulfill]; 
    } 
} 

此代码应该是,它作为一个CallKit提供委托类。