/您需要在音频会话激活后调用正在连接和连接状态更改。您可以通过使用块来做到这一点。在 sip 呼叫模型中创建块并在启用音频会话后分配块执行代码。在 sip 呼叫状态事件上调用此块。/
/*配置音频会话,但不要在此处启动呼叫音频,因为必须在音频会话在其优先级提升后由系统激活后完成。*/
- (void)provider:(CXProvider *)provider performStartCallAction:(CXStartCallAction *)action {
_outgoingCallId = action.callUUID;
_outgoingCallHandler = action.handle.value;
_destinationURI = action.contactIdentifier;
[[AudioManager sharedManager] configureAudioSession];
[action fulfill];
}
/* 为调用生命周期中的重要事件设置回调块,以便更新 CXProvider 以反映更新后的状态。*/
- (void)provider:(CXProvider *)provider didActivateAudioSession:(AVAudioSession *)audioSession {
SIPCall *call = [[[SIPUserAgent sharedUserAgent] account]makeCallToURI:_destinationURI];
call.connectingBlock = ^{
NSLog(@"----- connecting block -----");
[_provider reportOutgoingCallWithUUID:_outgoingCallId startedConnectingAtDate:nil];
};
call.connectedBlock = ^{
NSLog(@"----- connected block -----");
[_provider reportOutgoingCallWithUUID:_outgoingCallId connectedAtDate:nil];
};
}
//从 sip 调用事件中调用 Block
- (void)SIPCallConnecting:(NSNotification *)notification {
SIPCall *call = [notification object];
if (call.connectingBlock) {
call.connectingBlock();
}
}
- (void)SIPCallDidConfirm:(NSNotification *)notification {
SIPCall *call = [notification object];
[self setCallStartTime:[NSDate timeIntervalSinceReferenceDate]];
[actv startCallTimer];
if (call.connectedBlock) {
call.connectedBlock();
}
}