Domanda

Ho il codice all'interno della mia app Delegate

    application:didReceiveLocalNotification:
.

Metodo per visualizzare un UialertView per quella notifica locale, ogni volta che la mia app è in primo piano.

Se la mia app è in background quando arriva la notifica locale, l'utente viene presentato con la notifica ed è in grado di avviare l'app selezionandolo. In questo caso la mia app viene in primo piano la mia app delegate

    applicationWillEnterForeground:
.

è chiamato. Successivamente, anche se il mio metodo DidreceiLoCalnotificazione viene chiamato di nuovo, causando nuovamente un UialertView . Ma davvero l'utente ha già avuto quell'avviso mentre l'app era sullo sfondo, quindi idealmente vorrei non visualizzare di nuovo questo avviso.

Posso vedere che se un'app viene avviata a causa di una notifica locale, entro il

    application:didFinishLaunchingWithOptions:
.

Metodo È possibile ispezionare le opzioni di lancio per un tasto

    UIApplicationLaunchOptionsLocalNotificationKey
.

Per sapere se una notifica locale ha causato o meno la tua app per il lancio, ma non sembra esserci un metodo di questo tipo per averlo scoperto quando ti riportiamo in primo piano dall'utente che interagisce con una notifica locale. controllando se il mio metodo ApplicationWillenterForeground è stato chiamato recentemente sembrerebbe un modo hacky attorno a questo problema, o forse qualcosa di simile alle risposte fornite in questa domanda " "mi permetterà di Controlla

    [UIApplication sharedApplication].applicationState
.

Dall'interno del mio

    application:didReceiveLocalNotification:
.

Metodo. Speriamo che verrà ricevuto abbastanza presto che il mio applicationstate non sarà ancora impostato su UiaplicationStateActive in questo caso.

o ci sono soluzioni migliori per questo?

Cheers

È stato utile?

Soluzione

In AppDelegate è possibile controllare lo stato di app quando l'applicazione riceve la notifica

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    UIApplicationState state = [application applicationState];
     // check state here 

  if(state ==UIApplicationStateBackground ){

    }

}
.

Altri suggerimenti

Volevo solo dire che ho appena notato che la risposta suggerita di controllare l'applicationstate ha un po 'di un effetto indesiderato che interromperà qualcosa che accadrà mentre il centro di notifica è aperto e oltre la parte superiore della tua app. Personalmente non volevo che questo fermi le mie opinioni di avviso dall'essere creata, quindi ho trovato un'alternativa.

Fondamentalmente ho appena registrato la data in cui la mia app è stata lanciata o in primo piano e poi ogni volta che testare le mie date di notifica, confronto il loro infornamento con la data applaststated e visualizza solo la notifica se si è verificata dalla mia app in primo piano. Questo risolve il problema con l'apertura dell'app da una notifica, ma consente anche agli avvisi di mostrare quando l'app non è attiva (cioè dietro il centro di notifica).

Devo ancora sperimentare qualsiasi problema con questo approccio, anche se certamente lo provi solo da oggi, quindi non ha avuto una grande quantità di test.

Ho appena pensato di registrarlo a meno che nessun altro abbia requisiti simili.

Swift 4 Soluzione:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
{
   if UIApplication.shared.applicationState == .background {
   //enter code here
   }
completionHandler()
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top