2009-12-13 3 views
9

Je peux détecter que l'iPhone s'est mis en veille et est revenu du mode veille en utilisant applicationWillResignActive et applicationDidBecomeActive. Mais comment puis-je savoir quel genre d'interruption c'était. Je fais une application de lecteur audio, et j'ai besoin de garder la lecture audio lorsque l'iPhone se met en veille (que je sais comment faire). Mais j'ai besoin d'interrompre l'audio quand un message, une alarme ou une interruption de batterie faible se produit. Aussi j'ai besoin de reprendre l'audio quand l'événement est fini.Détection du type d'interruption de l'iPhone

Alors, comment différencier ces différentes interruptions?

Répondre

5

Cette information n'est probablement pas disponible pour votre application, mais voici quelques choses à essayer.

  1. En applicationWillResignActive:, vérifiez l'objet et les propriétés UserInfo du NSNotification pour voir s'il y a des conseils là.

  2. Inscrivez-vous pour recevoir toutes les notifications affichées au centre de notification par défaut:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveNotification:) name:nil object:nil]; 
    

Votre méthode sera appelée lorsque tout est affiché. Enregistrez l'objet de notification et le dictionnaire userInfo et vous verrez peut-être une notification utile en cours de publication. Si vous en trouvez un, vous pouvez vous inscrire juste pour cela. Ceci est le plus hacky, mais vous pourriez être en mesure d'accéder à l'alerte qui est affichée s'il s'agit d'un message ou d'un avertissement de batterie. Les alertes sont affichées dans une UIWindow sur l'UIWindow principale de votre application. Vous pouvez vous inscrire à UIWindowDidBecomeVisibleNotification, puis regarder les sous-vues de la fenêtre pour voir si vous pouvez trouver une alerte ou un autre indice utile. Toutes les méthodes ci-dessus s'appuieraient sur un comportement non documenté pour fonctionner, et pourraient éventuellement obtenir votre soumission rejetée de l'App Store. Aucun d'entre eux n'implique des appels de méthodes privées, bien que vous puissiez argumenter que l'observation d'un nom de notification non documenté compte comme une API privée. Au final, l'opinion d'Apple est la seule qui compte.

Personnellement, je l'essayerais, en m'assurant que le code échoue gracieusement si et quand le système change.

+1

Essayé A et B, mais il est venu tout vide. Aucune paire Description ou valeur-clé dans l'info-utilisateur. Rien dans l'objet non plus. C'est étrange comment Apple a manqué de mettre dans une telle fonctionnalité simple. N'a pas essayé C, car il semble trop hacky, même pour moi. – Prashant

+1

Vous pourriez vouloir reconsidérer C: si vous supposez simplement qu'une alerte * any * est affichée sur votre application est une raison de mettre en pause la musique, vous ne ferez rien non documenté. Il ne fait que fouiller dans la hiérarchie de vue pour lire le texte d'alerte qui serait hacky. – benzado

Questions connexes