30 votes

Déterminer si UILocalNotification s'est déclenché avec l'application en premier plan ou en arrière-plan

Lors de la réception d'un UILocalNotification

  1. La méthode application:DidReceiveLocalNotification est appelée lorsque l'application est en arrière plan.
  2. Lorsque l'application est en arrière-plan, il s'ouvre l'application, puis des appels application:DidReceiveLocalNotification.

Comment puis-je déterminer lequel de ces scénarios prennent place? Je tiens à les traiter différemment.

Si l'application est en arrière-plan, alors l'utilisateur a indiqué qu'ils veulent regarder lors de l'événement. Donc, en application:DidReceiveLocalNotification je ne veux pas leur demander à nouveau, j'ai juste envie de les prendre à l'événement.

Mais si l'application est au premier plan lors de la notification des incendies et des appels application:DidReceiveLocalNotification, je veux demander à l'utilisateur si elles veulent voir l'événement.

En essence, j'aurais:

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

if (appLauncedFromBackground)
  // go to event
else
  // ask if user wants to view event

}

J'ai pensé écrire une valeur booléenne d'une NSUserDefault à l'intérieur d' applicationWillEnterForeground:application puis lecture et remise à zéro à l'intérieur de application:DidReceiveLocalNotification. Mais j'ai pensé que si il y avait un moyen de les tester, ce serait beaucoup mieux la route.

Merci, Marc

EDIT ******************************

Grâce xuzhe mais qui n'est pas destiné à fonctionner dans cette situation. Voici un peu plus de détails qui peut expliquer pourquoi il l'habitude de travailler et peut-être aider quelqu'un à répondre à cela pour moi:

L' UILocalNotification que je suis en train de ici est un événement comme un événement de calendrier qui est prévue pour le feu à un temps sélectionné par l'utilisateur, de sorte lors de la planification de la notification je n'ai aucune idée de ce que l'utilisateur va être fait lors de la notification des incendies. Je suis l'aide de la userInfo de la notification de stocker des données sur l'événement qui est prévue, mais la définition de la valeur comme inBackground comme l'a suggéré l'habitude de travailler.

Je sais qu'il sera l'une des deux situations, si l'utilisateur décide de "voir" l'événement. (tout cela va supposer que l'application est dans l'arrière-plan ou au premier plan et ne PAS cesser de fumer).

1 - Si il se déclenche alors que l'application n'est pas utilisé && l'application est en arrière-plan et ne pas cesser de fumer, iOS va informer l'utilisateur qu'un événement s'est produit et fournir une option pour aller à la responsable de l'application (qui est le mien dans ce cas). À ce point, en supposant que l'utilisateur dit "oui, prends-moi pour ce soft cool" il va ouvrir l'application à partir de l'arrière-plan et l'appel de l'application:DidReceiveLocalNotification où je peux obtenir tous les notification userInfo.

2 - L'utilisateur, par hasard, se trouve être dans mon application après la date prévue de l'événement a lieu. À ce point de l'application:DidReceiveLocalNotification méthode est appelée de nouveau où je peux obtenir tous les notification userInfo.

Mais c'est à ce point que je veux savoir lequel des deux scénarios a juste pris place 1 ou 2.

Espérons que cela donne des détails supplémentaires sur mon utilisation de l' UILocalNotification aidera à répondre à cette question. Merci à l'avance de la marque de

FIN EDIT ****************************

46voto

xuzhe Points 3763

La manière la plus simple est peut-être lorsque votre application est au premier plan, n'envoyez pas de notification locale mais amenez simplement vos utilisateurs à l'événement.

Mais si vous insistez pour le faire en utilisant LocalNotification, voici un moyen facile de détecter le statut de votre application lorsque UILocalNotification est déclenché.

 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    //[super application:application didReceiveLocalNotification:notification]; // In most case, you don't need this line
    UIApplicationState state = [application applicationState];
    if (state == UIApplicationStateInactive) {
        // Application was in the background when notification was delivered.
    } else {

    }
}
 

1voto

Sufian Points 1380

C'est ce que j'ai ajouté pour le corps de ces fonctions... application didFinishLaunchingWithOptions:

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults];
UILocalNotification *localNotif =
[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (localNotif) {  //launched from notification
    [userDefaults setBool:YES forKey:@"deactivate in-app notification"];
    [userDefaults synchronize];
}
else{
    [userDefaults setBool:NO forKey:@"deactivate in-app notification"];
    [userDefaults synchronize];
}

En applicationDidEnterBackground:

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults];
[userDefaults setBool:YES forKey:@"deactivate in-app notification"];
[userDefaults synchronize];

En applicationWillEnterForeground:

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults];
[userDefaults setBool:YES forKey:@"deactivate in-app notification"];
[userDefaults synchronize];

applicationDidBecomeActive:

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults];
[userDefaults setBool:NO forKey:@"deactivate in-app notification"];
[userDefaults synchronize];

didReceiveLocalNotification:

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults];
if(![userDefaults boolForKey:@"deactivate in-app notification"]){
    UIAlertView* alert= [[UIAlertView alloc]initWithTitle:@"My App" message:notif.alertBody delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    [alert release];

    NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults];
    [userDefaults setBool:NO forKey:@"deactivate in-app notification"];
    [userDefaults synchronize];
}

Maintenant, les deux notifications sont partis (en particulier celui qui apparaît lorsque l'application est en arrière-plan et vous ouvrir à partir de la notification d'alerte.

1voto

Michael M. C Points 21

Dans didReceiveLocalNotification vous pouvez vérifier l'état de l'application:

[UIApplication shareApplication].applicationState

Si elle est égale à UIApplicationStateInactive vous savez que l'application était en arrière-plan et l'utilisateur l'a ouverte avec l'alerte de notification locale.

s'il s'agit de UIApplicationStateActive vous souhaiterez peut-être afficher votre propre alerte à l'utilisateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X