1

我正在将 callkit 框架添加到我的 Obj-C VoIP 应用程序中。但是拨出电话有一些问题。Callkit无法识别拨出电话的连接信息。

细节

  1. 我的应用程序使用 [provider 报告了连接信息,reportOutgoingCallWithUUID:uuid connectedAtDate:nil];,但 Callkit 没有收到该信息。
  2. 第一次拨出电话,已报告已连接信息,并且 callkit 系统的本机屏幕正确显示时间信息(已连接)。
  3. 但是两次以上之后,就一点消息都没有了。
  4. 当然我已经设置了委托方法。
  5. 使用 始终正确报告连接信息[provider reportOutgoingCallWithUUID:uuid startedConnectingAtDate:nil];

有什么建议或信息吗?

4

1 回答 1

2

/您需要在音频会话激活后调用正在连接和连接状态更改。您可以通过使用块来做到这一点。在 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();
    }
}
于 2017-02-07T09:32:10.257 回答