2012-02-06 10 views
22

Sto tentando di ricevere informazioni sulla traccia attualmente riprodotta in un'app per iOS. Funziona piuttosto bene mentre l'iPhone è non collegato a un accessorio. Se lo collego alla mia auto (Opel Astra, presa iPhone), il seguente codice si ferma a lavorare as described in the documentation:C'è un modo per accedere alla traccia attualmente riprodotta mentre l'iPhone è collegato a un accessorio?

Se si crea un lettore musicale iPod e l'utente gioca un elemento da un'altra libreria utilizzando Condivisione in famiglia, il il valore di questa proprietà è nil.

Codice:

// nil while connected to an accessory 
MPMediaItem *nowPlayingMediaItem = 
       [[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem]; 

// Works while not connected to an accessory 
NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle]; 

Ho anche provato roba "hacky", come per accedere alle proprietà "privati" (original code):

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 per chiamare i metodi privati:

// 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]; 

E 'anche no soluzione per accedere al nuovo MPNowPlayingInfoCenter, il suo nil tutto il tempo.

[MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo 

mia macchina riproduce la mia musica direttamente senza utilizzare un applicazione per iPhone e sembra che il mio iPhone sa quello che la macchina è attualmente in riproduzione perché mostra l'icona del titolo, l'artista e la copertura sulla schermata di blocco (e solo lì). Anche il numero di giochi interno aumenta.

Se controllo lo stato di riproduzione, restituisce anche YES se l'auto suona musica:

[[MPMusicPlayerController iPodMusicPlayer] playbackState] == MPMusicPlaybackStatePlaying 

Quindi, c'è qualche modo (può essere attraverso chiamando i metodi privati) per accedere al brano, l'auto è attualmente giocando?

+11

OT: ho dovuto sorridere quando ho letto che vedi la tua auto come accessorio per il tuo telefono e non il contrario :-) – Matthias

+0

Puoi spiegare se stai collegando tramite il jack per cuffie o il jack per iPhone? Suppongo anche che la tua macchina stia riproducendo musica dal tuo iPhone? Se l'iPhone sta visualizzando la canzone, suppongo che l'iPhone sia effettivamente quello che suona la musica anziché l'auto. Vuoi riprodurre la musica attraverso la tua app mentre è connessa alla macchina in modo che venga fuori dagli altoparlanti dell'auto? – Bot

+0

Collego l'iPhone tramite il jack iPhone. Non so chi interpreti effettivamente la musica, ma sono in grado di selezionare la musica dal display informativo nella mia auto. Voglio solo sapere in un'app di terze parti quale canzone è attualmente riprodotta. (Per riprodurre musica con un'app di terze parti è anche possibile, ma i controlli dell'auto car funzionano solo con la vera app "music") –

risposta

2

Apple ha "riparato" in iOS 6.1 dopo averlo segnalato come un bug. Il seguente codice ora funziona mentre il mio iPhone è collegato alla mia macchina:

MPMediaItem *nowPlayingMediaItem = [iPod nowPlayingItem]; 

NSString *title = [nowPlayingMediaItem valueForProperty:MPMediaItemPropertyTitle]; 

NSLog(@"Playing title: %@", title); 

E, quello che mi piace molto: E 'anche possibile cambiare la traccia in riproduzione utilizzando l'applicazione iPod - l'applicazione appare come ci si aspetta, invece del grande schermo bianco "connesso ad un accessorio". Quindi questo può anche funzionare in modo programmatico.

+0

Buono a sapersi .. Grazie per l'aggiornamento :) – Bot

2

Stai utilizzando thread? Se è così, esegui il codice sul thread principale. In caso contrario, registrarsi per le notifiche MPMusicPlayerController per item change. In questo modo, quando la canzone cambia, la tua app saprà qual è la nuova canzone. Assicurati anche che funzioni su main thread as well.

Se lo stato di riproduzione si aggiorna durante la connessione ma il tuo nowPlayingItem non lo è, ciò confermerebbe che si tratta di un bug. Vorrei inviare un bug report per questo problema.

MODIFICA: Visita https://developer.apple.com/support/resources/bug-reporting.html e scorri verso il basso. L'ultima domanda dice che puoi contattare TSI per risolvere il problema. Ricevi 2 richieste TSI per diventare uno sviluppatore gratuitamente, quindi puoi usare una di queste per chiedere loro se hanno un problema con l'uso di una libreria privata finché il bug non viene corretto.

+0

Come accedere alle informazioni sulla canzone riprodotta? Come dice la documentazione, non esiste un dizionario userInfo quindi devo ancora usare [[MPMusicPlayerController iPodMusicPlayer] nowPlayingItem] che cosa è tutto il tempo? –

+0

@Blauesocke stai usando i thread? – Bot

+0

No, non penso che questo sia importante :-) –

0

Sono abbastanza sicuro che la risposta è no, non è possibile con qualsiasi pubblico API almeno, ma si dovrebbe aprire un nuovo bug mela per due motivi:

Il motivo MPNowPlayingInfoCenter non ti dà le informazioni è perché deve essere implementato in modo specifico dall'app che suona la musica, se l'app di Apple dovesse funzionare, dovrebbe essere implementata in modo tale da creare un bug.

Ora, se si dice [[MPMusicPlayerController iPodMusicPlayer] playbackState] riflette le modifiche di riproduzione, quindi iPodMusicPlayer è ancora l'app responsabile della riproduzione, quindi è necessario segnalare a apple come MP un errore per MPMediaItemPropertyTitle.

Inoltre, le informazioni non pubbliche sull'argomento sono probabilmente coperte dallo MFi NDA e nessuno rischierà il suo asino.

0

In realtà non otterrai alcun MPMediaItem perché il tuo iPhone non sta riproducendo i brani ma l'accessorio della tua auto collegato all'iPhone sta accedendo al catalogo multimediale. In tal modo, è responsabile di aggiornare tutti i metadati degli oggetti a cui si accede (brani), in particolare incrementando il conteggio del gioco e aggiornando l'ultima data di accesso del brano. Memorizza anche alcune informazioni su dove si trova nella canzone (posizione) nella libreria di iTunes.

Questa informazione viene letta dalla schermata di blocco per aggiornare il coperchio. Questo è anche ciò che aiuta l'app iPod a continuare dove è rimasto l'accessorio della tua auto.

Quindi toccare nella libreria e ottenere le ultime informazioni da lì. Dai un'occhiata al progetto di esempio TopSongs per iniziare.

+0

Questo non è corretto. Affermò che Music.app stava di fatto suonando la musica. – Bot

+1

Sì, sono abbastanza sicuro che il music.app stia riproducendo la musica. Ho segnalato questo come un bug poche settimane fa. –

Problemi correlati