2015-12-04 15 views
14

In alcuni casi la mia applicazione iOS ha da innescare multipla UILocalNotification allo stesso tempo . Voglio decidere quale utente ha fatto clic su UILocalNotification. Quando un utente fa clic su un UILocalNotification l'applicazione era inattiva o in background. Il problema è che il metodoRilevare dalla quale UILocalNotification un'applicazione è stata aperta

func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) { 

viene chiamata per ogni innescato UILocalNotification. Quindi, quando l'applicazione diventa attiva, questo metodo viene chiamato più volte da quando ho ricevuto più UILocalNotification. C'è un modo per determinare quale UILocalNotification è stata la causa per l'apertura dell'app? Un controllo di applicationState non funziona poiché tutti gli UILocalNotification sono stati ricevuti quando l'applicazione era inattiva o in background.

Grazie mille!

Modifica: Modifica: Come esempio remoto: quando si riceve un messaggio di WhatsApp da due gruppi diversi A e B e si seleziona la notifica push dal gruppo A, questo verrà immediatamente visualizzato dopo l'apertura dell'applicazione. La differenza tra WhatsApp e il mio caso d'uso è che ho notifiche locali.

+1

Nella mia esperienza (e ho appena scritto un piccolo test app che gli orari tre UILocalNotifications con lo stesso fireDate quando l'applicazione è chiusa per testare questo), quando l'utente tocca un dato avviso nella loro schermata di notifica, in tal modo avviando l'app, l'unica UILocalNotification che viene passata al metodo didReceiveNotifications di UIApplication è quella che l'utente ha sfruttato. Quindi non sto capendo la tua domanda. – vaticRite

+0

Non risponde alla tua domanda, ma che dire di avere una sola notifica locale (ad esempio cancellando quelle precedenti). Se lo fai, puoi tenere traccia del dizionario userinfo della notifica per un consumo successivo quando l'app diventa attiva. Nel caso in cui hai ancora bisogno di più notifiche locali, sarebbe un'opzione per raggrupparlo in qualche modo in uno solo? Se sì, puoi preparare una specie di array di dizionari userInfo per il suo consumo quando l'app diventa attiva. – atxe

+0

Non puoi usare il dizionario utente per capire quale notifica è stata aperta e controllare in didRecieveLocalNotif, –

risposta

2

È possibile utilizzare launch options per ottenere l'accesso al dizionario che è stato passato con la notifica e da lì, a seconda di quali dati si fornisce la notifica locale durante la configurazione, è possibile controllare il dizionario e vedere quali notifica a cui il metodo sta rispondendo.

+0

Ciao pbush25, grazie per la tua risposta. Sfortunatamente, questo non mi aiuterà a scoprire quale UILocalNotification l'utente ha fatto clic dall'applicazione: didReceiveLocalNotification è chiamato per ogni UILocalNotification che l'utente ha ricevuto simultaneamente. –

+0

Inoltre, le opzioni di avvio vengono inviate solo quando l'applicazione viene avviata la prima volta, non quando viene attivata dallo sfondo. –

1

Solo una piccola aggiunta a @ pbush25, è possibile assegnare un oggetto dizionario alla proprietà notification.userInfo = [:] proprio così, quindi è possibile ottenerlo in questo modo e utilizzare comunque quello che ti piace!

8

Mentre si sheduling la notifica è possibile impostare l'id univoco per la notifica userinfo.

UILocalNotification *notif = [[UILocalNotification alloc] init]; 
    notif.fireDate = [NSDate dateWithTimeIntervalSinceNow:10]; 
    notif.timeZone = [NSTimeZone defaultTimeZone]; 

// set the your data with unique id 
    NSMutableDictionary *dict=[NSMutableDictionary new]; 
    [dict setObject:Id forKey:@"id"]; 

// assignt the dictionary to user info 
    notif.userInfo=dict; 


    notif.alertBody = @"test Notification"; 
    notif.soundName = UILocalNotificationDefaultSoundName; 


    [[UIApplication sharedApplication] scheduleLocalNotification:notif]; 

si può ottenere l'userinfo da didReceiveLocalNotification così

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
{ 
    if ([[notification.userInfo valueForKey:@"id"] isEqualToString:@"1"]) 
    { 
     NSLog(@"notification id %@",[notification.userInfo valueForKey:@"id"]); 
    } 
    else if ([[notification.userInfo valueForKey:@"id"] isEqualToString:@"2"]) 
    { 
     NSLog(@"notification id %@",[notification.userInfo valueForKey:@"id"]); 
    } 

    ////// or ///// 

    if ([notification.userInfo valueForKey:@"id"]) 
    { 
     NSLog(@"id of notification %@",[notification.userInfo valueForKey:@"id"]); 
    } 

} 

da didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 
    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]) 
    { 
     UILocalNotification *notif=[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; 
     NSLog(@"notif.userInfo %@",notif.userInfo); 

//  notif.userInfo { 
//   id = 2; 
//  } 

    } 


     return YES; 
} 
2

fornire alcune informazioni uniche come id o qualcosa nella proprietà userInfo UILocalNotification come NSDictionary durante la pianificazione tua notifica. E quando lo ricevi in ​​didFinishLaunchingWithOptions o didReceiveLocalNotification prendi il dizionario user info dall'istanza di notifica e fai il tuo lavoro di conseguenza.

2

Poiché utilizzi swift, capisco che la tua app sia probabilmente in esecuzione per iOS 8 e versioni successive.

Se si utilizza iOS8, è possibile fornire azioni alla notifica (facendo clic sulla notifica si intende un'azione stessa).

quindi dovrete questo metodi attivati ​​attraverso il UIApplicationDelegate:

application(_:handleActionWithIdentifier:forLocalNotification:completionHandler:)

E

application(_:handleActionWithIdentifier:forLocalNotification:withResponseInfo:completionHandler:)

Entrambi questi metodi che si invia un UILocalNotification che contains a userInfo property che si può riempire quando si crea una notifica e poi inserisci una sorta di identificatore per farti sapere quale è quale.

0

In Swift 3.x utilizzare il seguente codice nel metodo didFinishLaunchingWithOptions di AppDelegate.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     // See if the application was launched from a local notification. 
     if let options = launchOptions { 
      if let notification = options[UIApplicationLaunchOptionsKey.localNotification] as? UILocalNotification { 
       print(notification.userInfo ?? "No info attached.") 
      } 
     } 
     return true 
} 
Problemi correlati