Ios 调用工具包不会回调didActivate

Ios 调用工具包不会回调didActivate,ios,swift,voip,pjsip,callkit,Ios,Swift,Voip,Pjsip,Callkit,我正在将新的CallKit API与我的VOIP应用程序集成 如示例应用程序所示: 我正在配置音频会话: - (void) configureAudioSession { // Configure the audio session AVAudioSession *sessionInstance = [AVAudioSession sharedInstance]; // we are going to play and record so we pick that ca

我正在将新的CallKit API与我的VOIP应用程序集成

如示例应用程序所示:

我正在配置音频会话:

- (void) configureAudioSession
{
    // Configure the audio session
    AVAudioSession *sessionInstance = [AVAudioSession sharedInstance];

    // we are going to play and record so we pick that category
    NSError *error = nil;
    [sessionInstance setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
    if (error) {
        NSLog(@"error setting audio category %@",error);
    }

    // set the mode to voice chat
    [sessionInstance setMode:AVAudioSessionModeVoiceChat error:&error];
    if (error) {
        NSLog(@"error setting audio mode %@",error);
    }

    NSLog(@"setupAudioSession");

    return;
}
在我的CXAnswerCallAction中:

  func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
        print("Provider - CXAnswerCallAction")

        // get the active call
        guard let call = self.softphone.getCallForCallId(self.currentCallId) else {
            action.fail()
            return
        }

        /*
         Configure the audio session, but do not start call audio here, since it must be done once
         the audio session has been activated by the system after having its priority elevated.
         */
        self.softphone.configureAudioSession()

        // Trigger the call to be answered via the underlying network service.
        call.answer()

        // Signal to the system that the action has been successfully performed.
        action.fulfill()
    }
根据文档,呼叫套件应回调didActivate:

func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
    print("Provider - Received \(#function)")

    // Start call audio media, now that the audio session has been activated after having its priority boosted.
}
由于某些原因,它在第一次VOIP呼叫后不会被回拨。随后的调用似乎收到了回调,并且工作正常


如何解决此问题?

我已通过先设置call audio,然后调用“reportNewIncomingCall”方法解决了此问题。示例代码如下所示:

func reportIncomingCall(uuid: UUID, handle: String, hasVideo: Bool = false, completion: ((NSError?) -> Void)? = nil) {
    let update = CXCallUpdate()
    update.remoteHandle = CXHandle(type: .phoneNumber, value: handle)
    update.hasVideo = hasVideo


    DispatchQueue.global().sync {
        _ = try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, with: AVAudioSessionCategoryOptions.mixWithOthers)
        _ = try? AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.none)
        if hasVideo == true {
            _ = try? AVAudioSession.sharedInstance().setMode(AVAudioSessionModeVideoChat)
        } else {
            _ = try? AVAudioSession.sharedInstance().setMode(AVAudioSessionModeVoiceChat)
        }


        do {
            _ = try AVAudioSession.sharedInstance().setActive(true)
        } catch (let error){
            print("audio session error: \(error)")
        }
    }

    provider.reportNewIncomingCall(with: uuid, update: update) { error in

        if error == nil {

        }

        completion?(error as? NSError)
    }
}