我们的项目使用WebRTC进行VOIP调用,它在访问CallKit框架之前工作正常。但是当我试图访问CallKit框架时,有一种情况是双方都无法听到对方的讲话。当我删除CallKit时,一切都恢复正常。
CallKit的答案按钮与项目中的原始答案按钮功能相同。
让我感到惊讶的是没有必要听到没有声音。有时一切都很正常,但有时会出现问题。那么,问题的可能性更大。
我发现了以下流程图,我怀疑问题在于函数调用的顺序。但我不知道WebRTC如何与图中的功能相对应。
另外,我很好奇套接字不稳定是否会导致CallKit框架异常工作
请原谅我英文不好,但这个问题已困扰了我好几天,我不知道究竟哪里出了问题,是不是与CallKit框架发生冲突的地方?
希望你能帮助我,非常感谢你!
最后,我解决了这个问题,但我仍然不明白为什么可以解决。我的解决方案是:
首先,我将“履行”的呼叫延迟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];
}];
});
这样,我的问题就解决了。
如果你知道为什么这可以解决这个问题,请评论我,谢谢!
要以正确的方式连接webrtc和callkit,需要采取以下措施:首先,您必须使用RTCAudioTrack并添加RTCAudioSession来处理音频。旧的遗留RTCAudioSession直接添加到RTCPeerConnection工作,但它不是一种方法来做到这一点。第二件事是使用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