ios - los - ¿Hay alguna forma de acceder a la pista actualmente reproducida mientras el iPhone está conectado a un accesorio?
nfc iphone 7 como activar (4)
¿Estás utilizando hilos? Si es así ejecuta el código en el hilo principal. Si no es así, regístrese para las notificaciones de MPMusicPlayerController para el cambio de artículo . De esa manera, cuando la canción cambie, tu aplicación sabrá cuál es la nueva canción. También asegúrese de que esto se ejecuta en el hilo principal también .
Si su estado de reproducción se está actualizando mientras está conectado pero su NowPlayingItem no lo está, esto confirmaría que se trata de un error. Yo enviaría un informe de error para este problema.
EDITAR: visite https://developer.apple.com/support/resources/bug-reporting.html y desplácese hasta la parte inferior. La última pregunta dice que puede ponerse en contacto con TSI para solucionar problemas. Obtienes 2 solicitudes TSI por ser un desarrollador de forma gratuita, por lo que puedes usar una de ellas para preguntarles si tienen algún trabajo para usar una biblioteca privada hasta que se solucione el error.
Estoy tratando de recibir información sobre la pista actualmente reproducida en una aplicación de iOS. Esto funciona bastante bien mientras el iPhone no está conectado a un accesorio. Si lo conecto a mi automóvil (Opel Astra, conector de iPhone), el siguiente código deja de funcionar como se describe en la documentación :
Si crea un reproductor de música iPod y el usuario reproduce un elemento de otra biblioteca utilizando Compartir en casa, el valor de esta propiedad es
nil
.
Código:
// nil while connected to an accessory
MPMediaItem *nowPlayingMediaItem =
[[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem];
// Works while not connected to an accessory
NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle];
Incluso intenté cosas "piratas" para acceder a propiedades "privadas" ( código original ):
MPMediaQuery *query=nil;
MPMediaItemCollection *collection=nil;
id internalPlayer=nil;
Ivar internalPlayeriVar = object_getInstanceVariable(iPod, "_internal", NULL);
internalPlayer = object_getIvar(iPod, internalPlayeriVar);
NSLog(@"internalPlayer: %@", internalPlayer);
Ivar queryIvar = object_getInstanceVariable(internalPlayer, "_query", NULL);
query = object_getIvar(internalPlayer, queryIvar); // nil everytime
Ivar collectionIvar = object_getInstanceVariable(internalPlayer,
"_itemCollection", NULL);
collection = object_getIvar(internalPlayer, collectionIvar); // nil everytime
o para llamar a métodos privados:
// Same behaviour like [iPod nowPlayingItem], works
// only while no accessory is connected
MPMediaItem *nowPlayingMediaItem =
[iPod nowPlayingItemAtIndex:[iPod indexOfNowPlayingItem]];
// Works while not connected to an accessory
NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle];
Tampoco es una solución para acceder al nuevo MPNowPlayingInfoCenter
, es nil
todo el tiempo.
[MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo
Mi auto reproduce mi música directamente sin usar una aplicación de iPhone y parece que mi iPhone sabe lo que el auto está jugando actualmente porque muestra el título, el artista y el ícono de la cubierta en la pantalla de bloqueo (y solo allí). También aumenta el conteo interno de juegos.
Si verifico el estado de reproducción, también devuelve YES
si el auto reproduce música:
[[MPMusicPlayerController iPodMusicPlayer] playbackState] == MPMusicPlaybackStatePlaying
Entonces, ¿hay alguna manera (puede ser a través de métodos privados de llamada) para acceder a la canción, el auto se está reproduciendo actualmente?
Apple simplemente "solucionó eso" en iOS 6.1 después de que lo reporté como un error. El siguiente código ahora funciona mientras mi iPhone está conectado a mi auto:
MPMediaItem *nowPlayingMediaItem = [iPod nowPlayingItem];
NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle];
NSLog(@"Playing title: %@", title);
Y, lo que realmente me gusta: también es posible cambiar la pista de reproducción usando la aplicación iPod: la aplicación aparece como se espera, en lugar de la gran pantalla blanca "conectada a un accesorio". Así que esto también puede funcionar programáticamente.
En realidad, no obtendrá ningún MPMediaItem porque su iPhone no reproduce las canciones, pero el accesorio de su automóvil conectado al iPhone está accediendo a la biblioteca multimedia. Al hacerlo, es responsable de actualizar todos los metadatos de los objetos accedidos (canciones), especialmente incrementando el recuento de reproducción y actualizando la última fecha de acceso de la canción. También almacena información de la ubicación de la canción (posición) en la biblioteca de iTunes.
Esta información es leída por la pantalla de bloqueo para actualizar la cubierta. Esto es también lo que ayuda a la aplicación de iPod a continuar donde el accesorio de su automóvil se fue.
Así que accede a la biblioteca y obtén la información más reciente desde allí. Echa un vistazo al proyecto de ejemplo TopSongs para comenzar.
Estoy bastante seguro de que la respuesta es no, no puedes con ningún API público al menos, pero debes presentar un error con Apple por dos razones:
La razón por la que MPNowPlayingInfoCenter no le da la información es porque tiene que ser implementada específicamente por la aplicación que reproduce la música, si la aplicación de Apple se está reproduciendo, entonces debería haberse implementado, por lo tanto, debe presentar un error.
Ahora, si dices que [[MPMusicPlayerController iPodMusicPlayer] playbackState] refleja los cambios en la reproducción, eso significaría que iPodMusicPlayer sigue siendo la aplicación a cargo de la reproducción, por lo que no tendrás ningún error para MPMediaItemPropertyTitle.
Además, la información no pública sobre el tema probablemente está cubierta por el MFi NDA y nadie va a arriesgar su culo.