DidActivate not called by CallKit

I am integrating the new CallKit API with my VOIP application.

As shown in the sample application: https://developer.apple.com/library/content/samplecode/Speakerbox/Introduction/Intro.html

I am setting up an audio session:

- (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; } 

in my 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() } 

According to the documentation, didActivate should be called by callkit:

 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. } 

For some reason, it does not call back after the first VOIP call. Subsequent calls seem to receive a callback, and they work just fine.

How to fix it?

+5
source share
1 answer

I fixed this problem by setting the call sound first and then calling the reportNewIncomingCall method. An example code is given below:

 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) } } 
0
source

Source: https://habr.com/ru/post/1261070/


All Articles