AVplayer reprend après appel entrant

J'utilise AVPlayer pour la lecture de musique. Mon problème est qu'après un appel entrant, le lecteur ne reprendra pas. Comment est-ce que je gère ceci quand un appel entrant vient?

À partir d'iOS 6, vous devez gérer AVAudioSessionInterruptionNotification et AVAudioSessionMediaServicesWereResetNotification , avant que vous deviez utiliser des methods de délégation.

Vous devez d'abord appeler le singleton AVAudioSession et le configurer pour l'utilisation souhaitée.

Par exemple:

 AVAudioSession *aSession = [AVAudioSession sharedInstance]; [aSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:&error]; [aSession setMode:AVAudioSessionModeDefault error:&error]; [aSession setActive: YES error: &error]; 

Ensuite, vous devez implémenter deux methods, pour les notifications que l'AVAudioSession appelle:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAudioSessionInterruption:) name:AVAudioSessionInterruptionNotification object:aSession]; 

Le premier concerne toute interruption qui serait appelée en raison d'un appel entrant, d'un réveil, etc.

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMediaServicesReset) name:AVAudioSessionMediaServicesWereResetNotification object:aSession]; 

La deuxième si le server de médias est réinitialisé pour une raison quelconque, vous devez gérer cette notification pour reconfigurer l'audio ou effectuer un entretien. D'ailleurs, le dictionary de notification ne contiendra aucun object.

Voici un exemple pour gérer l'interruption de lecture:

 - (void)handleAudioSessionInterruption:(NSNotification*)notification { NSNumber *interruptionType = [[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey]; NSNumber *interruptionOption = [[notification userInfo] objectForKey:AVAudioSessionInterruptionOptionKey]; switch (interruptionType.unsignedIntegerValue) { case AVAudioSessionInterruptionTypeBegan:{ // • Audio has stopped, already inactive // • Change state of UI, etc., to reflect non-playing state } break; case AVAudioSessionInterruptionTypeEnded:{ // • Make session active // • Update user interface // • AVAudioSessionInterruptionOptionShouldResume option if (interruptionOption.unsignedIntegerValue == AVAudioSessionInterruptionOptionShouldResume) { // Here you should continue playback. [player play]; } } break; default: break; } } 

Notez que vous devez reprendre la lecture lorsque la valeur facultative est AVAudioSessionInterruptionOptionShouldResume

Et pour l'autre notification, vous devez prendre soin de ce qui suit:

 - (void)handleMediaServicesReset { // • No userInfo dictionary for this notification // • Audio streaming objects are invalidated (zombies) // • Handle this notification by fully reconfiguring audio } 

Cordialement.

AVAudioSession enverra une notification lorsqu'une interruption commence et se termine. Voir Gestion des interruptions audio

 - (id)init { if (self = [super init]) { [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center addObserver:self selector:@selector(audioSessionInterrupted:) name:AVAudioSessionInterruptionNotification object:nil]; } } - (void)audioSessionInterrupted:(NSNotification *)notification { int interruptionType = [notification.userInfo[AVAudioSessionInterruptionTypeKey] intValue]; if (interruptionType == AVAudioSessionInterruptionTypeBegan) { if (_state == GBPlayerStateBuffering || _state == GBPlayerStatePlaying) { NSLog(@"Pausing for audio session interruption"); pausedForAudioSessionInterruption = YES; [self pause]; } } else if (interruptionType == AVAudioSessionInterruptionTypeEnded) { if ([notification.userInfo[AVAudioSessionInterruptionOptionKey] intValue] == AVAudioSessionInterruptionOptionShouldResume) { if (pausedForAudioSessionInterruption) { NSLog(@"Resuming after audio session interruption"); [self play]; } } pausedForAudioSessionInterruption = NO; } } 

Dans certains cas, mon AVPlayer ne reprend pas la lecture même si j'appelle play() . Seul le lecteur de recharge m'aide à résoudre le problème:

  func interruptionNotification(_ notification: Notification) { guard let type = notification.userInfo?[AVAudioSessionInterruptionTypeKey] as? UInt, let interruption = AVAudioSessionInterruptionType(rawValue: type) else { return } if interruption == .ended && playerWasPlayingBeforeInterruption { player.replaceCurrentItem(with: AVPlayerItem(url: radioStation.url)) play() } }