7
votes

xcode - mpnowplayingInfocenter Info n'est pas affiché sur iOS 8

Je développe une application musicale, qui devrait jouer de la musique à l'arrière-plan.

J'utilise le mpmovieplayController pour jouer à la musique. Mon code pour initier le mpmovieplayercontroller : xxx

quand j'exécute [jeu de jeu auto.player]; La musique commence. Mais je veux aussi afficher le nom de la chanson, le nom de l'album et l'œuvre d'album dans le Lockscreen et le ControlCenter. J'utilise le code suivant: xxx

mais rien ne s'affiche dans le Lockcreen. Il n'est pas affiché dans le ControlCenter non plus.

Comment puis-je résoudre mon problème? Je n'ai rien trouvé sur Internet.

Merci d'avance, Fabian.


7 commentaires

Votre code est-il réellement exécuté?


Oui, [[[MPNOWPlayingInfocenterfaultCenter] .NOWPlayingInfo ObjectForKey: MmeMediAtEmProperTytiTle] renvoie la bonne chanson.


Aha! C'est vraiment une bonne nouvelle. Donc, pas seulement votre code est exécuté, mais il définit réellement le NowplayingInfo avec succès. Alors laissez-moi vous demander cela - êtes-vous un premier répondeur, de sorte que vous recevez avec succès les événements de contrôle à distance de l'écran de verrouillage et du centre de contrôle?


Les télécommandes ne sont effectivement pas affichées dans l'écran de verrouillage et je ne pense pas, mon application devient le premier répondant.


Je pense que c'est le problème, alors. Vous ne pouvez pas influencer l'écran de verrouillage à moins que vous soyez le premier répondeur.


Ok, et comment je peux résoudre le problème?


Vous devez être le premier répondeur. Et il y a aussi d'autres exigences. Voir ma réponse ci-dessous, avec le matériel lié.


4 Réponses :


29
votes

Le problème est que vous ne satisfaisez pas aux exigences de devenir maître de l'écran de verrouillage et du centre de contrôle, comme ​​i Expliquez dans mon livre . Vous devriez voir l'équivalent moderne (iOS 8) de ceci:

Entrez la description de l'image ici

Le fait que vous ne voyez pas cela suggère que vous omettez une ou plusieurs des exigences, que je liste (citant directement de mon livre ici):

  • Votre application doit contenir un upondeur dans sa chaîne de répondeur qui retourne oui à partir de CanbecomefirSpeter , et ce répondant doit effectivement être le premier répondeur.
  • Quelqu'un de l'upondeur dans la chaîne du répondeur, à ou au-dessus du premier répondant, doit mettre en œuvre RemoteControlReceedVenteVente: .
  • Votre application doit appeler l'uapour Méthode d'instance BeginReceiveceRemotecontrolvents .
  • Audio de votre application La politique de la session doit être la lecture.
  • Votre application doit émettre du son.

    Je ne sais pas lequel de ceux que vous omettez; Cela pourrait être plus d'un. Vous voudrez peut-être comparer votre code avec un exemple de travail, ici:

    https://github.com /mattneub/programming-ios-Book-Examples/blob/master/IOS7bookeXamples/bk2ch14P653backgroundPlayerandinterRUpter/backgrounder/backgrounder/viewcontroller.m


6 commentaires

Oui, c'est la solution. Merci beaucoup pour votre aide!


Vous êtes très bienvenu. C'est beaucoup d'exigences! Omettre l'un d'entre eux est facile, puis les choses ne fonctionnent pas mystérieusement. :(


Avez-vous de la chance pour que cela fonctionne lorsque vous jouez via un WKWebView? Je peux obtenir d'autres sources pour changer maintenant, tout au long de la lecture d'un WKWebView.


Est-ce possible dans AvenuePlayer? Signifie que je puisse ajouter NSMutabledictionner en externe à Avplayer pour définir l'oeuvre ..etc


@matt ce poste était vraiment utile pour moi et résolu mon problème, merci!


J'ai vérifié que mon application fait tout dans la liste, mais les commandes d'écran de verrouillage et les informations n'apparaissent pas lorsque je démarre l'application et lisez le flux la première fois. Je dois arrêter et redémarrer le flux (ICECAST), puis sur la deuxième tentative des contrôles d'écran de verrouillage et des informations apparaissent. Les étapes de la première tentative et de la deuxième tentative sont exactement les mêmes (c'est-à-dire pas de conditions de race filetage ou asynchrones). Je ne sais donc pas pourquoi l'écran de verrouillage ne fonctionne pas correctement à la première tentative.



11
votes

Vouloir développer @ Matt's Réponse - Réglage NowplayingInfo est inutile lorsque vous utilisez AvaudiosessionCategoryOptionMixWithothers Option.


1 commentaires

Est venu ici pour ajouter ceci - si vous ajoutez .mixwithothers Vous ne pourrez pas définir les détails du centre de contrôle comme prévu.



0
votes

Développer plus loin sur la réponse de @ Matt, il est nécessaire que vous appeliez endreceiviveurremotecontrolevents et résigneurfiresponder lorsque l'application revient au premier plan ( ApplicationDidbecomeactive ) . Sinon, le système d'exploitation suppose que vous êtes un mauvais acteur (ou que vous avez oublié de les éteindre) et désactive votre capacité à afficher entièrement les commandes de sommeil, même après avoir appelé BeginReceivivemotecontrolevents . J'ai ajouté ces appels et maintenant les contrôles de sommeil montrent toujours quand ils le devraient.


0 commentaires

0
votes

Voulez-vous expliquer la réponse de @ Zakhej - Que se passe-t-il lors de la définition d'AvaudiosessionCategoryOptionMixWithothers.

  1. mpnowplayinginfocenter est un singleton, ce qui signifie qu'une seule application le définit.
  2. Avudiosession est partagé avec d'autres applications, chaque application peut la définir.

    Alors. Lorsque vous définissez la catégorie AvudiosessionCategoryambient, AvaudiosessionCategoryplayLayRecord et mélangez avec d'autres, AvaudiosessionCategoryPlayBack et mélangez avec d'autres, définir Mpnowplayinginfocenter's NowplayingInfo est inutile.


0 commentaires