2015-10-06 15 views
7

Mostrare periodicamente la mia notifica locale come questa.Rileva utente tocca notifica locale

UILocalNotification *notification = [[UILocalNotification alloc]init]; 
[notification setAlertBody:@"Test test"]; 
[notification setUserInfo:@{@"test": @"test"}]; 
[[UIApplication sharedApplication] presentLocalNotificationNow:notification]; 

Devo rilevare questa notifica e ho intenzione di scrivere qui.

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 

Chiama sempre questa funzione se l'utente tocca la notifica o chiama automaticamente in primo piano.

Quindi, ho separato utilizzando questo.

if (application.applicationState == UIApplicationStateActive) 

Quando visualizzo il centro di notifica, diventa InActive. Ma chiama ancora didReceiveLocalNotification. Non riesco a distinguere se l'utente tocca la notifica dal centro notifiche o a causa della mia notifica di pubblicazione periodica.

Come posso davvero sapere che tocco la notifica (sia dallo stato InActive o dallo stato in background) in didReceiveLocalNotification?

+0

Cosa vuoi veramente? –

risposta

7

Supponendo di aver compreso correttamente il problema, sono incappato nello stesso ostacolo e non sono riuscito a trovare una soluzione super pulita.

Quindi la situazione in cui il seguente metodo

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 

è chiamato e applicationState è pari a UIApplicationStateInactive accade in due casi:

  1. l'applicazione è in primo piano e la notifica è stata appena licenziato
  2. la notifica è stata sparata qualche tempo fa, il centro di notifica è abbattuto e l'utente ha toccato la notifica

Un modo per distinguere questi due casi è quello di verificare fireDate della notifica:

notification.fireDate.timeIntervalSinceNow < 0.5 

Se questa espressione è vero, è molto probabile che il primo caso è accaduto. Se l'espressione è falsa, è molto probabile che sia successo il secondo caso.

Questa soluzione dipende dal sistema che invia la notifica senza indugio e/o l'utente non è abbastanza veloce da fare clic sulla notifica nel centro notifiche sotto 500 ms dal momento in cui l'avviso ha avuto luogo. Non sono sicuro di quanto sia probabile che si verifichi un ritardo di attivazione. Immagino sia possibile se il dispositivo è sotto un qualche tipo di carico di elaborazione.

Spero che ci sia una soluzione più pulita, si spera che qualcuno la condivida.

5

Prima di tutto, leggere questo da Apple Documentation:

l'utente tocca un pulsante di azione personalizzata in una notifica di iOS 8. In questo caso , iOS chiama sia application:handleActionWithIdentifier:forRemoteNotification:completionHandler: o application:handleActionWithIdentifier:forLocalNotification:completionHandler:. In entrambi i metodi, si ottiene l'identificativo dell'azione in modo che sia possibile stabilire quale pulsante l'utente ha toccato con . È inoltre possibile ottenere il telecomando o l'oggetto di notifica locale, in modo da poter recuperare qualsiasi informazione necessaria per gestire l'azione.

L'utente tocca il pulsante predefinito nell'avviso o tocca (o fa clic) l'icona dell'app . Toccando il pulsante di azione predefinito su un dispositivo con iOS, l'app chiama il metodo del delegato del proprio delegato, passando il carico utile della notifica (per le notifiche remote) o l'oggetto di notifica locale (per le notifiche locali). Anche se application:didFinishLaunchingWithOptions: non è il posto migliore per gestire la notifica, il carico utile a dà a l'opportunità di avviare il processo di aggiornamento prima che venga chiamato il metodo del gestore .

In secondo luogo, questo è come si può distinguere se didReceiveLocalNotification: è chiamato da stato attivo o inattivo:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
{ 
    UIApplicationState appState = UIApplicationStateActive; 
    if ([application respondsToSelector:@selector(applicationState)]) 
     appState = application.applicationState; 

    if (appState == UIApplicationStateActive) 
    { 
    } 
    else 
    { 
    } 
} 
-3

Usa KVO valore-chiave osservazione-sapere e fare qualcosa quando il pulsante viene toccato .

+0

Questo non è ciò che KVO è per. – kalafun

Problemi correlati