2012-01-10 26 views
9

Ho implementato UILocalNotifications in due diverse app ora. Uno usa i servizi di localizzazione, il che significa che se viene ucciso, viene (di solito) riavviato (quindi non è un grosso problema). Tuttavia, in un'altra app, pianifico uno UILocalNotification in base al tempo. In questo caso, sto avendo un grosso problema.UILocalNotification - Come gestire quando l'applicazione NON è in esecuzione?

Se pianifico una notifica, l'app viene uccisa, ha spinto la memoria, il telefono è spento e riacceso, non posso visualizzare automaticamente le notifiche precedenti all'apertura dell'app.

Ecco il flusso di lavoro che funziona (app in esecuzione in background):

  1. lancio app; notifica delle pianificazioni delle app; app vicina; l'app è ora in esecuzione sullo sfondo
  2. Ricevi notifica locale; ignoralo all'inizio; tira il menu a tendina dall'alto (barra di stato); tocca la notifica per avviare l'app
  3. Risultati: l'app visualizza correttamente le informazioni nella notifica.

Ecco il flusso di lavoro che fa non lavoro (app non è più in esecuzione in background):

  1. lancio app; notifica delle pianificazioni delle app; app vicina; l'app è ora in esecuzione sullo sfondo
  2. Uccidere manualmente l'app (per simulare la mia situazione)
  3. Ancora ricevere notifiche locali; ignoralo all'inizio; tira il menu a tendina dall'alto (barra di stato); tocca la notifica per avviare l'app
  4. Risultati: l'app viene avviata, ma il metodo didReceiveLocalNotification non viene chiamato. L'utente pensa che l'app non funzioni.
    Nota: Non riesco nemmeno a forzare manualmente le informazioni, perché se hanno ricevuto più di una notifica, non posso dire quale hanno toccato per sapere quale visualizzare.

C'è un modo per sapere che la notifica hanno toccato quando l'applicazione è non in esecuzione in background (e quindi non eseguire il didReceiveLocalNotification method)?

risposta

15

Nel secondo caso, l'utente ha chiuso (o ucciso) l'app, quindi quando l'utente tocca la notifica verrà avviata l'app.

Questo può essere gestito nel metodo di AppDelegate di seguito menzionato

didFinishLaunchingWithOptions invocato quando si lancia un'applicazione, quindi basta controllare se l'applicazione è stata in realtà lanciato perché l'utente ha toccato la notifica (codice qui sotto):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    UILocalNotification *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; 

    if (notification) 
    { 
     NSLog(@"notification caused app to launch, alert body = %@", notification.alertBody); 
     // do what ever action you want to do 
     // you could just copy the code from "didReceiveLocalNotification" and paste it here 
    } 

    return YES; 
} 
+1

ciao, questo funzionerà, solo quando dopo aver ucciso l'app, l'utente fa clic sulla notifica, cosa succede se fa clic direttamente sull'icona dell'app, guardando il distintivo, come possiamo mostrargli, il VC desiderato. – Ranjit

+0

@ user1046037 Questo non funziona per me. Sai perché potrebbe essere?Il metodo '' 'didReceiveLocalNotification''' funziona (ma questo è il momento in cui l'app è in esecuzione). Non riesco a farlo funzionare. http://stackoverflow.com/questions/36246104/uiapplicationlaunchoptionslocalnotificationkey-always-null-ios – Supertecnoboff

2

@Ranjit, questo funzionerà quando l'utente tocca l'icona dell'app perché è un metodo di delega dell'app. Ricevi chiamate ogni volta che l'app ha terminato il lancio. (Non posso commentare perché la mia mancanza di reputazione ...;))

+0

no williams non funzionerà – Ranjit

+0

UIApplicationLaunchOptionsLocalNotificationKey è nil quando l'app viene lanciata dall'icona tap. Deve essere toccato sulla notifica stessa. –

+0

Qualcuno ha trovato una soluzione per questo? –

Problemi correlati