在我的VOIP应用程序中开始使用CallKit时,我遇到了多次调用的问题。
当有一对一的VOIP通话时,声音正常。但是一旦一方获得另一个VOIP呼叫,并选择保持和接受选项;第一个呼叫被成功保持,第二个呼叫被应答;但声音现在关闭了。即使在通话之间交换也不起作用。并且删除一个电话也不起作用。 我正在使用 RTP 作为语音。
我尝试放置断点并检查AVAudioSession的类别和模式是否正确。
在控制台中,我可以在我的终端检查有多个电话的设备,停止发送声音包。
我在提供商的 reportNewIncomingCallWithUUID 和 CXStartCallAction 之前启用VOIP。
与GSM通话相同的情况。如果有一对一的VOIP通话,声音正常,一方收到GSM通话,用户选择保持和接听选项,GSM通话中的声音工作正常。但是,如果用户将VOIP呼叫作为活动状态并通过交换呼叫将GSM呼叫置于保持状态,则VOIP呼叫中没有声音。交换呼叫并使GSM呼叫处于活动状态,声音再次正常工作。但VOIP呼叫没有声音。
在这种情况下,我们将 AVAudioSessionInterruptionTypeBegan ,但永远不会调用 AVAudioSessionInterruptionTypeEnded 。即使在GSM通话结束后也是如此。
有没有人遇到过类似的问题?
答案 0 :(得分:1)
有同样的问题。如果我有1个活动呼叫,则新呼叫即将进入,我点击保持和接受。新的呼叫有效,但在CallKit中使用Swap后,音频停止工作。
经过长时间的调试,找到了实际上音频通过CallKit本地接口进行交换调用的地方 - 这是来自provider:performSetHeldCallAction:
协议的CXProviderDelegate
方法。
在我的情况下,我使用[audioController deactivateAudioSession]
方法进行了OnHold的调用。
但是我发现当通过CallKit点击provider:performSetHeldCallAction:
按钮时,同样的方法Swap
被激活用于其他被激活的呼叫(来自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提供程序委托的类中。