2012-04-12 14 views
37

notifica Sto leggendo documenti di Apple suspinta movimentazione

Handling Local and Remote Notifications

e sembra a me per avere dichiarazioni contrastanti. Qualcuno può chiarire questi punti di confusione? Parliamo rigorosamente di notifica remota (rispetto a locale) per ora.

I documenti dicono che se viene premuto il pulsante di azione sulla notifica, richiama l'applicazione: didFinishLaunchingWithOptions e passa nel carico utile della notifica. Più avanti dice che se l'app è in esecuzione in primo piano, invia la notifica tramite l'applicazione: didReceiveRemoteNotification :. Ciò implica che quando l'app è in background o non è in esecuzione, viene chiamata l'applicazione: didFinishLaunchingWithOptions. Altrimenti, l'applicazione: didReceiveRemoteNotification: viene chiamata.

Più tardi, c'è un iOS Nota dicendo quanto segue:

"iOS Nota: In iOS, è possibile determinare se un'applicazione viene avviata a seguito del l'utente toccando il pulsante di azione o se la notifica è stata consegnata all'applicazione già in esecuzione esaminando lo stato dell'applicazione Nell'applicazione del delegato dell'applicazione: didReceiveRemoteNotification: o application: didReceiveLocalNotification: metodo, ottenere il valore della proprietà applicationState e valutarlo.Se il valore è UIApplicationStateInactive, l'utente ha toccato il pulsante di azione; se il valore è UIApplicationStateActive, l'applicazione era in primo piano quando ha ricevuto la notifica. "

Questo implica che l'applicazione: didReceiveRemoteNotification: viene chiamata sia quando l'app è già in primo piano, sia se l'utente preme il pulsante di azione (o fa scorrere il cursore di azione in iOS 5) in primo piano/avvia l'app.

L'origine della mia confusione potrebbe essere con la prima parte in cui i documenti implicano che il carico utile di notifica viene inviato con l'applicazione: didFinishLaunchingWithOptions: metodo o con un fraintendimento di un'applicazione "in esecuzione" (è un'app in background considerata " in esecuzione"?). La documentazione per l'applicazione: didReceiveRemoteNotification: afferma che è chiamato per le applicazioni "in esecuzione".

Quindi, per riassumere, potrei avere chiarimenti su:

1) è l'applicazione: didReceiveRemoteNotification: sempre chiamato quando l'applicazione è in foreground o quando l'utente sceglie di "agire" sulla notifica? In caso negativo, come possiamo dare un senso alla nota iOS sulla determinazione dello stato dell'applicazione attivo o inattivo?

2) Un'app in background è "in esecuzione", almeno nel senso dei documenti che richiedono l'applicazione: didReceiveRemoteNotification viene chiamato per l'esecuzione di app?

3) Per il completamento, è un'applicazione in background UIApplicationStateInactive o Active?

+19

Posso ottenere un segno di spunta? – ch3rryc0ke

risposta

91

La dicitura qui è confusa, in particolare intorno alla parola sfondo.

Quando l'applicazione non è veramente caricato in memoria (e, g quando si avvia è la schermata iniziale presenta, ecc.), Quindi di applicazione: didFinishLaunchingWithOptions si chiama, e si può ottenere la notifica push come segue:

NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; 

if(remoteNotif) 
{ 
    //Handle remote notification 
} 

Se l'app è caricata in memoria ed è ATTIVA (ad esempio l'app è attualmente aperta sul dispositivo), viene chiamato solo application:didReceiveRemoteNotification:.

Se l'app è caricata in memoria ma non è ATTIVA e NON IN PRIORITÀ (ad esempio, è stata lanciata l'app, quindi si è premuto il tasto home e si è aspettato 10 secondi), quindi si fa clic sul pulsante di azione su una notifica push, viene chiamato soloRecezioneRemotaNotifica.

È possibile acquisire questo caso come segue:

-(void)application:(UIApplication *)app didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 
    if([app applicationState] == UIApplicationStateInactive) 
    { 
     //If the application state was inactive, this means the user pressed an action button 
     // from a notification. 

    //Handle notification 
    } 
} 
+2

Viene chiamato 'didReceiveRemoteNotification' nel primo caso che hai spiegato? È sufficiente implementare il mio codice in entrambi i metodi che hai scritto? Il codice non verrà eseguito due volte? Grazie. –

+1

questo in errato: se avete il centro di notifica visibile o il centro di controllo per esempio, l'app è considerata inattiva. hai qualche suggerimento su come determinare il tipo di "diventare attivo dallo sfondo"? – dvkch

+0

notate anche che lo stesso comportamento è correlato a didReceiveRemoteNotification: (NSDictionary *) userInfo fetchCompletionHandler: (void (^) (risultato UIBackgroundFetchResult)) completionHandler NS_AVAILABLE_IOS (7_0); – valvoline

2

Come per iOS 9.1 scenario Ho testato notifica push in modalità Uccidi dove la mia applicazione non è in esecuzione in qualsiasi modalità in quel momento, se si tocca sulla notifica push rispetto al sistema chiamerà prima,

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ 

//your code execution will here. 

} 

E seconda chiamata metodo sarà,

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

//Your initial code execution. 

} 

Questo scenario è stato testato nella mia applicazione.

+0

Come hai testato questo scenario, per favore spieghi? – Nico

+0

Nico, ho stampato il file di log in document file da controllare, quale metodo verrà chiamato in modalità kill della notifica push. –