iOS avaudiosession interruption notification ne fonctionne pas comme prévu

je veux savoir quand mon AVAudioRecorder est inaccessible(E. g lorsque la musique commence à jouer).

audioRecorderEndInterruption sera déprécié avec iOS 9 je me concentre sur AVAudioSession'interruption de notification (mais ni fonctionne comme prévu).

le problème est que la notification d'interruption n'est jamais appelée si l'application était et reste au premier plan lorsque l'interruption se produit.

par exemple: l'utilisateur commence et arrête de jouer de la musique sans déplacer l'application dans fond.

Pour détecter les éventuelles interruptions j'utilise:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionWasInterrupted:) name:AVAudioSessionInterruptionNotification object:nil];
...
- (void)audioSessionWasInterrupted:(NSNotification *)notification {
    if ([notification.name isEqualToString:AVAudioSessionInterruptionNotification]) {
        NSLog(@"Interruption notification");

        if ([[notification.userInfo valueForKey:AVAudioSessionInterruptionTypeKey] isEqualToNumber:[NSNumber numberWithInt:AVAudioSessionInterruptionTypeBegan]]) {
            NSLog(@"InterruptionTypeBegan");
        } else {
            NSLog(@"InterruptionTypeEnded");
        }
    }
}

je InterruptionTypeBegan comme prévu, mais InterruptionTypeEnded n'est pas appelée si l'application est toujours au premier plan (ce qui signifie qu'il ne sera pas appelé jusqu'à ce que l'application est mise en arrière-plan et d'arrière en avant).

Comment puis-je recevoir InterruptionTypeEnded notification lors de l'interruption se produit alors que l'application est au premier plan?

16
demandé sur Aleksander Azizi 2015-08-04 12:56:37

3 réponses

il s'agit d'un problème répandu affectant toute application utilisant AV composants de framework (idem pour les applications natives iOS).

Comme expliqué dans la documentation au sujet des interruptions audio, le InterruptionTypeEnded devrait en fait être appliqué dans le scénario mentionné:

Si l'utilisateur ferme l'interruption ... le système appelle la méthode de rappel, indiquant que l'interruption est terminée.

cependant, il indique également que le InterruptionTypeEnded pourrait ne pas être appelé à à tous:

Il n'y a aucune garantie que commencer interruption de fin de l'interruption.

par conséquent, une approche différente est nécessaire dans le scénario évoqué.


quand il s'agit de gérer les interruptions de musique, le problème ne sera pas là pour longtemps. iOS 9 empêche efficacement l'utilisation de sources audio externes pendant que le gestionnaire audio de l'application est invoquer.

Une façon de gérer la question précise de médias d'interruption pour écouter MPMusicPlayerControllerplaybackState, comme le montre la question sur le débordement des piles:Détecter si la musique est en cours de lecture?.


d'Une manière plus directe pour gérer la question des interruptions serait:

bloquez complètement les interruptions audio externes en réinventant votre composant audio au moment de InterruptionTypeBegan.

ou en donnant une indication que une source médiatique extérieure a interrompu la session audio (par exemple en montrant un microphone inactif).


Espérons-le,  va trouver une meilleure solution au problème, mais en attendant, cela devrait vous donner quelques options pour résoudre l'interruption de l'émission.

5
répondu Aleksander Azizi 2017-05-23 12:32:26

si vous ne l'avez pas déjà fait, essayez de définir votre AVCaptureSessionpropriété usesApplicationAudioSession NO.

question & réponse peut être une bonne référence si vous cherchez plus de détails.

-1
répondu ChrisHaze 2017-05-23 12:17:24

j'essaie ceci et je trouve que InterruptionTypeEnded may a appelé après une pause musicale dans une application, mais d'autres n'ont pas appelé lors d'une pause.

ma solution est de mettre à jour L'interface utilisateur pour faire savoir à l'utilisateur que l'enregistrement s'est arrêté et d'effectuer des travaux connexes tels que l'exploitation de fichiers. Lorsque l'interruption prend fin, AVAudioSession active,si n'a pas d'erreur, démarrer un nouvel enregistrement.

Si vous voulez vous joindre le fichier avant et après l'interruption, la réponse à cette question: AVAudioRecorder enregistre uniquement l'audio après l'interruption peut vous être utile.

-1
répondu NSDeveloper 2017-05-23 12:01:59