2011-02-08 1 views
10

J'ai une application, qui gardera une trace de tout ce que fait l'utilisateur dans l'application iPod. Pour ce faire, j'ai ajouté quelques observateurs à NSNotificationCenter, comme MPMusicPlayerControllerNowPlayingItemDidChangeNotification. Mais mon problème est, je reçois seulement ces notifications quand mon application est au premier plan, si c'est en arrière-plan, le système ajoute la notification à une file d'attente, et la prochaine fois que mon application devient active, elle me la livre. Je n'ai aucun intérêt dans cette file d'attente, puisque je veux recevoir des notifications en temps réel.Recevoir des notifications avec l'application en mode d'arrière-plan

Y at-il un moyen pour moi d'obtenir ces notifications même si mon application est en état suspendu? Je veux exécuter seulement 3 lignes de code chaque fois que je reçois ces notifications NowPlayingItemDidChange par exemple.

Voici où j'ajoute l'observateur.

MPMusicPlayerController *iPodMediaPlayer = [MPMusicPlayerController iPodMusicPlayer]; 



NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 

    [notificationCenter addObserver: self selector: @selector(handle_NowPlayingItemChanged:) name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification 

            object:iPodMediaPlayer]; 


[iPodMediaPlayer beginGeneratingPlaybackNotifications]; 

De plus, si j'ajoute un autre type d'objet à l'observateur au lieu de iPodMediaPlayer, l'observateur ne sera pas appeler la méthode.

Merci beaucoup,

Abras

Répondre

6

applications iOS sont suspendues quand ils ne sont pas au premier plan. Il y a trois exceptions à cette règle. Vous pouvez exécuter le code en arrière-plan si votre application est

a) Lecture audio. Cela signifie que l'application elle-même génère de l'audio. Ma compréhension est que l'objet MPMediaPlayerController iPodMusicPlayer contrôle uniquement la lecture du processus iPod externe, plutôt que de jouer de l'audio à partir de l'application elle-même. Peut-être que vous pourriez avoir un certain succès si vous avez appelé applicationMusicPlayer au lieu de iPodMusicPlayer et définir les drapeaux d'arrière-plan appropriés dans vos applications Info.plist. Cela semble être le moyen le plus légitime de faire fonctionner votre application, mais vous ne pourrez pas contrôler la lecture de l'iPod à partir de l'application iPod, uniquement de votre application et des commandes audio du système.

b) Obtenez votre application pour surveiller l'emplacement. Si l'application utilise le GPS, elle peut continuer à s'exécuter en arrière-plan. Inconvénient à cela est que le GPS va vider la batterie, et les utilisateurs pourraient être effrayés que vous demandez leur emplacement.

c) Demandez à UIApplication de gagner du temps. Si vous utilisez la méthode beginBackgroundTask de UIApplication, votre application continuera à s'exécuter pendant un certain temps en arrière-plan. Si vos utilisateurs viennent dans votre application une fois toutes les dix minutes environ, cela pourrait également fonctionner.

Espérons que ça aide.

+0

Oui, je sais qu'il n'y a que trois options. Mais je pensais peut-être qu'il existe un moyen d'enregistrer la notification dans le système, puis votre application entrerait en mode de fond normalement. Si l'utilisateur fait quelque chose qui déclenche la notification, le centre de notifications réveillera votre application pour qu'elle puisse répondre à la notification. Après avoir répondu, il reviendrait en mode d'arrière-plan comme d'habitude. – Abras

+0

@Abras: Avez-vous découvert comment faire? J'ai une application audio. Et je veux qu'il reçoive des notifications (quand d'autres applications audio apparaissent) lorsqu'il est en arrière-plan. Comment fait-on ça? – Namratha

+0

@Abras Avez-vous déjà découvert cela? – WMios

0

Le multitâche dans iOS est actuellement très restreint. Vous pouvez démarrer une tâche d'arrière-plan en utilisant la méthode beginBackgroundTaskWithExpirationHandler: (d'un objet UIApplication), mais il est prévu de terminer une tâche de longueur finie avant d'être suspendue. Toutes les tâches d'arrière-plan peuvent expirer (et se terminer) avant la fin de son travail. Vous pouvez vérifier combien de temps votre application peut s'exécuter en vérifiant la propriété backgroundTimeRemaining de l'objet application.

+0

Oui, mais ce n'est pas ce que je veux. Je souhaite que mon application soit appelée chaque fois que l'utilisateur déclenche la notification. – Abras

+0

Exactement. Je dis qu'il n'y a aucun moyen de le faire, eh bien, autant que je sache. – MHC

+0

Oui, merci pour le conseil. Je pense que mon option sera d'implémenter mon propre iPod et de le construire dans mon application. Ce ne sera pas facile à utiliser, mais au moins je peux réaliser ce que je veux. – Abras

0

Comme je l'ai expliqué ici iOS receive Media Player Notifications when app is in background, il ne semble pas possible d'obtenir des notifications de iPodMusicPlayer.

A propos réponse Omar Raul Qazi:

a) i essayé et je pas eu de succès. La musique continuait à baisser en appuyant sur le bouton d'accueil. Je pense que cet indicateur d'arrière-plan ne fonctionne que pour les AudioSessions normales et pas pour MPMusicPlayer ...

b) Je ne suis pas sûr que cela fonctionnerait et je ne pense pas que Apple voudrait quand la recherche d'approbation

c) Vous pouvez exécuter en arrière-plan seule tâche synchrone. Vous ne pouvez pas attendre là pour une notification. Ai-je tort?

Questions connexes