Question

J'ai du code dans celui de mon délégué d'application

    application:didReceiveLocalNotification:

méthode pour afficher un UIAlertView pour cette notification locale, chaque fois que mon application est au premier plan.

Si mon application est en arrière-plan lorsque la notification locale arrive, l'utilisateur reçoit la notification et peut lancer l'application en la sélectionnant.Dans ce cas, mon application passe au premier plan.

    applicationWillEnterForeground:

est appelé.Après, bien que mon didReceiveLocalNotification la méthode est appelée à nouveau, provoquant un UIAlertView pour réapparaître.Mais en réalité, l'utilisateur a déjà reçu cette alerte alors que l'application était en arrière-plan, donc idéalement, j'aimerais ne plus afficher cette alerte.

Je peux voir que si une application est lancée en raison d'une notification locale, alors dans le

    application:didFinishLaunchingWithOptions:

méthode, vous pouvez inspecter les options de lancement d'une clé

    UIApplicationLaunchOptionsLocalNotificationKey

pour savoir si une notification locale a provoqué ou non le lancement de votre application, mais il ne semble pas exister de méthode de ce type pour le savoir lorsque vous êtes simplement ramené au premier plan par l'utilisateur interagissant avec une notification locale.

Vérifier si mon applicationWillEnterForeground La méthode a été appelée récemment semblerait être un moyen compliqué de contourner ce problème, ou peut-être quelque chose de similaire aux réponses données dans cette question "iOS, comment juger que l'application s'exécute au premier plan ou en arrière-plan ?" me permettra de vérifier le

    [UIApplication sharedApplication].applicationState

de l'intérieur de mon

    application:didReceiveLocalNotification:

méthode.J'espère qu'il sera reçu suffisamment tôt pour que mon applicationState ne soit toujours pas défini sur UIApplicationStateActive dans ce cas.

Ou existe-t-il de meilleures solutions pour cela ?

Acclamations

Était-ce utile?

La solution

dans AppDelegate, vous pouvez vérifier l'état de l'application lorsque l'application reçoit une notification

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

  if(state ==UIApplicationStateBackground ){

    }

}

Autres conseils

Je voulais juste dire que je viens de remarquer que la réponse suggérée consistant à vérifier l'état de l'application a un effet secondaire un peu négatif, à savoir qu'elle empêchera tout ce qui se passe pendant que le centre de notification est ouvert et au-dessus de votre application.Personnellement, je ne voulais pas que cela empêche la création de mes vues d'alerte, j'ai donc trouvé une alternative.

Fondamentalement, j'enregistre simplement la date à laquelle mon application a été lancée pour la dernière fois ou mise au premier plan, puis chaque fois que je teste mes dates de notification, je compare leur fireDate avec la date appLastStarted et n'affiche la notification que si elle s'est produite depuis que mon application est au premier plan.Cela résout le problème d'ouverture de l'application à partir d'une notification, mais permet également aux alertes de s'afficher lorsque l'application n'est pas active (c.-à-d.derrière le centre de notification).

Je n'ai pas encore rencontré de problèmes avec cette approche, même s'il est vrai que je ne l'ai essayé qu'à partir d'aujourd'hui, donc elle n'a pas fait l'objet de nombreux tests.

Je pensais juste que je l'enregistrerais à moins que quelqu'un d'autre n'ait les mêmes exigences.

Solution Swift4 :

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
{
   if UIApplication.shared.applicationState == .background {
   //enter code here
   }
completionHandler()
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top