我们的项目使用WebRTC进行VOIP调用,它在访问CallKit框架之前工作正常。但是当我试图访问CallKit框架时,有一种情况是双方都无法听到对方的讲话。当我删除CallKit时,一切都恢复正常。
CallKit的答案按钮与项目中的原始答案按钮功能相同。
令我惊讶的是没有必要听到没有声音。有时一切都很正常,但有时会出现问题。嗯,问题的可能性更大。
我发现了以下流程图,我怀疑问题在于函数调用的顺序。但我不知道WebRTC如何与图中的功能相对应
此外,我很好奇套接字不稳定是否会导致CallKit框架异常工作
请原谅我英文不好,但是这个问题已经困扰了我好几天了,我不知道究竟哪里出了问题,是不是跟CallKit框架发生了冲突?希望你能帮助我,非常感谢你!
答案 0 :(得分:3)
最后,我解决了这个问题,但我仍然不明白为什么可以解决这个问题。下面是我的解决方案:
首先,我推迟了"履行" 1秒(请注意,此时间不能少于1秒)
- (void)provider:(CXProvider *)provider performAnswerCallAction:(CXAnswerCallAction *)action {
if (self.delegate && [self.delegate respondsToSelector:@selector(callKitManager:refreshCurrentCallStatus:)]) {
[self.delegate callKitManager:self refreshCurrentCallStatus:EUCCallKitStatusAnswerAccept];
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[action fulfill];
});}
其次,我还将网络请求延迟了一秒钟(此处比前一个更长)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.peerConnection offerForConstraints:[self offerConstraintsRestartIce:NO] completionHandler:^(RTCSessionDescription * _Nullable sdp, NSError * _Nullable error) {
[self peerConnection:self.peerConnection didCreateSessionDescription:sdp error:error];
}];
});
通过这种方式,我的问题得以解决。
如果您知道为什么这可以解决这个问题,请评论我,谢谢!
答案 1 :(得分:3)
以正确的方式连接webrtc和callkit的步骤很少: 首先,您必须使用RTCAudioTrack并添加RTCAudioSession来处理音频。直接添加到RTCPeerConnection的旧式RTCAudioSession可以正常工作,但是不希望这样做。 第二件事是使用manualAudio。启动应用程序后,您应该在RTCAudioSession上更改useManualAudio标志:
RTCAudioSession.sharedSession().useManaulAudio = true
这使您可以将音频推迟到CallKit通知已激活音频会话之前,因此在ProviderDelegate内部,您应该实现以下方法:
(void)provider:(CXProvider *)provider didActivateAudioSession:(AVAudioSession *)audioSession
RTCAudioSession.sharedSession().didActivecated(audioSession)
RTCAudioSession.sharedSession().isAudioEnabled = true
第二种音频委托方法请不要忘记添加:
(void)provider:(CXProvider *)provider didDeactivateAudioSession:(AVAudioSession *)audioSession
RTCAudioSession.sharedSession().didDeactivecated(audioSession)
RTCAudioSession.sharedSession().isAudioEnabled = false
答案 2 :(得分:0)
Apple建议我们等到Connection建立之后再执行performAnswerAction。以下是来源
Apple Suggestion for Call Kit Documentation
如果在应用程序与服务器建立连接之前,呼叫的接听者应答,则不要立即完成发送给委托的provider:performAnswerCallAction:方法的CXAnswerCallAction对象。而是要等到建立连接再实现该对象。在等待您的应用程序完成请求的过程中,来电界面使用户知道呼叫正在连接,但尚未准备就绪。
因此,我们需要等待一两秒钟,然后才能在 performAnswerCallAction
中完成操作