AVAudioRecorder ne pas save en arrière-plan après la fin de l'interruption de la session audio

J'enregistre de l'audio dans mon application, à la fois au premier plan et en arrière-plan. Je gère également AVAudioSessionInterruptionNotification pour arrêter l'logging lorsque l'interruption commence et recommence à la fin. Bien qu'au premier plan cela fonctionne comme prévu, quand l'application enregistre en arrière-plan et que je reçois un appel, elle ne recommence pas à save après la fin de l'appel. Mon code est le suivant:

- (void)p_handleAudioSessionInterruptionNotification:(NSNotification *)notification { NSUInteger interruptionType = [[[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey] unsignedIntegerValue]; if (interruptionType == AVAudioSessionInterruptionTypeBegan) { if (self.isRecording && !self.interruptedWhileRecording) { [self.recorder stop]; self.interruptedWhileRecording = YES; return; } } if (interruptionType == AVAudioSessionInterruptionTypeEnded) { if (self.interruptedWhileRecording) { NSError *error = nil; [[AVAudioSession sharedInstance] setActive:YES error:&error]; NSDictionary *settings = @{ AVEncoderAudioQualityKey: @(AVAudioQualityMax), AVSampleRateKey: @8000, AVFormatIDKey: @(kAudioFormatLinearPCM), AVNumberOfChannelsKey: @1, AVLinearPCMBitDepthKey: @16, AVLinearPCMIsBigEndianKey: @NO, AVLinearPCMIsFloatKey: @NO }; _recorder = [[AVAudioRecorder alloc] initWithURL:fileURL settings:settings error:nil]; [self.recorder record]; self.interruptedWhileRecording = NO; return; } } } 

Notez que fileURL pointe vers un nouveau file caf dans un sous-directory NSDocumentDirectory. Le mode audio en arrière-plan est configuré. J'ai également essayé voip et jouer au silence, à la fois sans succès.

Le bloc NSError dans AVAudioSessionInterruptionTypeEnded est une erreur OSStatus 560557684 que je n'ai pas trouvé comment aborder.

Toute aide serait très appréciée.

L'erreur 560557684 est pour AVAudioSessionErrorCodeCannotInterruptOthers . Cela se produit lorsque votre application d'arrière-plan tente d'activer une session audio qui ne se mélange pas avec d'autres sessions audio. Les applications en arrière-plan ne peuvent pas démarrer des sessions audio qui ne se mélangent pas à la session audio de l'application de premier plan car cela interrompt l'audio de l'application actuellement utilisée par l'user.

Pour résoudre ce problème, assurez-vous de définir votre catégorie de session sur une catégorie pouvant être mélangée, telle que AVAudioSessionCategoryPlayback . Veillez également à définir l'option de catégorie AVAudioSessionCategoryOptionMixWithOthers (obligatoire) et AVAudioSessionCategoryOptionDuckOthers (facultatif). Par exemple:

 // background audio *must* mix with other sessions (or setActive will fail) NSError *sessionError = nil; [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDuckOthers error:&sessionError]; if (sessionError) { NSLog(@"ERROR: setCategory %@", [sessionError localizedDescription]); } 

Le code d'erreur 560557684 est en réalité 4 caractères ascii '! Int' dans un entier de 32 bits. Les codes d'erreur sont répertoriés dans le file AVAudioSession.h (voir aussi AVAudioSession ):

  @enum AVAudioSession error codes @abstract These are the error codes returned from the AVAudioSession API. ... @constant AVAudioSessionErrorCodeCannotInterruptOthers The app's audio session is non-mixable and trying to go active while in the background. This is allowed only when the app is the NowPlaying app. typedef NS_ENUM(NSInteger, AVAudioSessionErrorCode) { ... AVAudioSessionErrorCodeCannotInterruptOthers = '!int', /* 0x21696E74, 560557684 */ ... 

J'ai ajouté ce qui suit

 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 

avant de configurer AVAudioSession et cela a fonctionné. Je ne sais toujours pas quels bugs peuvent apparaître.