2011-02-08 10 views
10

Ho un'app che terrà traccia di tutto ciò che l'utente fa nell'app iPod. Per fare questo, ho aggiunto pochi osservatori a NSNotificationCenter, come MPMusicPlayerControllerNowPlayingItemDidChangeNotification. Ma il mio problema è che ottengo solo quelle notifiche quando la mia app è in primo piano, se è in background, il sistema aggiunge la notifica a una coda, e poi la prossima volta che la mia app diventa attiva me la consegna. Non ho alcun interesse in questa coda, dal momento che voglio ricevere notifiche in tempo reale.Ricezione di notifiche con l'app in modalità background

C'è un modo per me per ottenere le notifiche, anche se la mia app è in stato di sospensione? Voglio eseguire solo 3 righe di codice ogni volta che ottengo le notifiche NowPlayingItemDidChange ad esempio.

Qui è dove aggiungo l'osservatore.

MPMusicPlayerController *iPodMediaPlayer = [MPMusicPlayerController iPodMusicPlayer]; 



NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 

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

            object:iPodMediaPlayer]; 


[iPodMediaPlayer beginGeneratingPlaybackNotifications]; 

Inoltre, se si aggiunge un altro tipo di oggetto all'osservatore anziché iPodMediaPlayer, l'osservatore non chiamare il metodo.

Grazie mille, applicazioni

Abras

risposta

6

iOS sono sospese quando non sono in primo piano. Ci sono tre eccezioni a questa regola. È possibile avere il codice eseguito in background se l'applicazione è

a) Riproduzione audio. Ciò significa che l'applicazione stessa sta effettivamente generando audio. La mia comprensione è che l'oggetto iPodMusicPlayer di MPMediaPlayerController controlla solo la riproduzione del processo iPod esterno, piuttosto che riprodurre l'audio dall'app stessa. Forse potresti avere un certo successo se chiami applicationMusicPlayer anziché iPodMusicPlayer e imposta i flag di sfondo appropriati nelle tue applicazioni Info.plist. Questo sembra il modo più legittimo per far funzionare la tua applicazione, ma non sarai in grado di controllare la riproduzione dell'iPod dall'app iPod, solo la tua app e i controlli audio del sistema.

b) Ottieni la tua app per monitorare la posizione. Se l'app utilizza il GPS, può continuare a essere eseguita in background. Il lato negativo di questo è che il GPS scaricherà la batteria, e gli utenti potrebbero essere spaventati che stai richiedendo la loro posizione.

c) Chiedi UIApplication per tempo supplementare. Se si utilizza il metodo beginBackgroundTask di UIApplication, l'applicazione continuerà a funzionare per un tempo limitato in background. Se i tuoi utenti arriveranno nella tua applicazione una volta ogni dieci minuti, anche questo potrebbe funzionare.

Spero che questo aiuti.

+0

Sì, so che ci sono solo queste tre opzioni. Ma ho pensato che forse c'è un modo per registrare la notifica nel sistema, quindi la tua app entrerà normalmente in modalità background. Se l'utente fa qualcosa che fa scattare la notifica, il Centro di notifica dovrebbe riattivare la tua app solo per poter rispondere alla notifica. Dopo aver risposto, tornerebbe alla modalità background normalmente. – Abras

+0

@Abras: hai scoperto come farlo? Ho un'app audio. E voglio che esso riceva le notifiche (quando arrivano altre app audio) quando è in background. Come lo faccio? – Namratha

+0

@Abras Lo hai mai capito? – WMios

0

multitasking in iOS è attualmente molto ristretta uno. È possibile avviare un'attività in background utilizzando il metodo beginBackgroundTaskWithExpirationHandler: (di un oggetto UIApplication), ma è inteso per terminare un'attività a lunghezza finita prima di andare in sospensione. Tutte le attività in background possono scadere (e essere interrotte) prima che finisca il suo lavoro. È possibile verificare per quanto tempo l'applicazione può essere eseguita controllando la proprietà backgroundTimeRemaining dell'oggetto applicazione.

+0

Sì, ma non è quello che voglio. Voglio che la mia app venga chiamata ogni volta che l'utente attiva la notifica. – Abras

+0

Esattamente. Sto dicendo che non c'è modo di farlo, bene, per quanto posso dire. – MHC

+0

Sì, grazie per il consiglio. Penso che la mia opzione sarà implementare il mio iPod e compilarlo nella mia app. Non sarà facile da usare, ma almeno posso ottenere ciò che voglio. – Abras

0

Come ho spiegato qui iOS receive Media Player Notifications when app is in background, non sembra esserci modo di ricevere le notifiche da iPodMusicPlayer.

A proposito di Omar Raul Qazi risposta:

a) ho provato e non ho avuto successo. La musica continuava a scendere quando si preme il tasto home. Penso che questo flag di sfondo funzioni solo per normali AudioSessions e non per MPMusicPlayer ...

b) Io non sono sicuro che questo avrebbe funzionato e non credo che Apple avrebbe piace quando alla ricerca di approvazione

c) È possibile eseguire in background unico compito sincrona. Non puoi aspettare lì per una notifica. Ho sbagliato?

Problemi correlati