在我的VOIP应用程序中开始使用CallKit时,我面临多个呼叫的问题。
当有一对一的VOIP呼叫时,声音工作正常。但一旦一方接到另一个VOIP呼叫,并选择Hold and Accept选项;第一个呼叫被成功挂起,第二个呼叫被应答;但声音现在被关闭了。即使在通话之间交换也不起作用。并且丢弃一个呼叫也不起作用。我正在使用RTP进行语音传输。
我试着设置断点,检查AVAudioSession的类别和模式是否正确。
在控制台中,我可以在我的一端检查有多个呼叫的设备是否停止发送声音包。
我在reportNewIncomingCallWithUUID和CXStartCallAction提供商之前启用VOIP。
GSM通话情况相同。如果有一对一的VOIP呼叫声音正常,并且在一侧接收到GSM呼叫,并且用户选择"保持并接受"选项,则GSM呼叫中的声音工作正常。但若用户将VOIP呼叫设为活动,并通过交换呼叫将GSM呼叫挂起,则VOIP呼叫中并没有声音。切换通话并激活GSM通话,声音再次正常工作。但VOIP呼叫没有声音。
在这种情况下,我们得到AVAudioSessionInterruptionTypeBegan,但从未调用AVaudioSessionInter中断TypeEnded。即使在GSM呼叫结束之后。
有人遇到过类似的问题吗?
也有同样的问题。如果我有一个活动呼叫,那么有新的呼叫传入,我点击保持&接受新呼叫可以工作,但在CallKit中使用Swap后,音频停止工作。
经过长时间的调试,发现了通过CallKit本机接口(即CXProviderDelegate
协议中的provider:performSetHeldCallAction:
方法)为Swap调用禁用/激活音频的位置。
在我的例子中,我使用了[audioController deactivateAudioSession]
方法进行调用,即放入OnHold。
但我发现,当通过CallKit点击Swap
按钮时,对另一个处于活动状态的调用(从OnHold状态)触发了相同的方法provider:performSetHeldCallAction:
。
所以在我的情况下,我首先切换呼叫的保持(它使呼叫保持或使其活动而不保持)。然后我检查什么是通话条件(无论是否保持),然后分别停用或激活音频。
通常情况下,它看起来是这样的:
- (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提供程序委托工作的类中。