2011-08-24 7 views
29

Al recibir una UILocalNotificationDeterminar si UILocalNotification disparó con la aplicación en primer plano o de fondo

  1. El método application:DidReceiveLocalNotification se llama cuando la aplicación está en primer plano.
  2. Cuando la aplicación está en segundo plano, abre la aplicación y luego llama al application:DidReceiveLocalNotification.

¿Cómo puedo determinar cuál de estos escenarios está teniendo lugar? Me gustaría tratarlos de manera diferente.

Si la aplicación estaba en segundo plano, el usuario indicó que deseaba ver el evento. Entonces, en application:DidReceiveLocalNotification no quiero volver a preguntar, solo quiero llevarlos al evento.

Pero si la aplicación está en primer plano cuando se activa la notificación y llama al application:DidReceiveLocalNotification, quiero preguntarle al usuario si desea ver el evento.

En esencia Tendría:

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

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

} 

he pensado en escribir un valor booleano a una NSUserDefault dentro applicationWillEnterForeground:application y luego leer y reponer dentro application:DidReceiveLocalNotification. Pero pensé que si había una forma de probarla, esa sería una ruta mucho mejor.

Gracias, Mark

EDITAR * ** * ** * ** * ** * ** * ** * ** * ** * ** * **

Gracias xuzhe, pero eso no va a funcionar en esta situación. Aquí hay un poco más de detalle que puede explicar por qué no funciona y tal vez ayudar a alguien a responder esto por mí:

El UILocalNotification que estoy configurando aquí es un evento como un evento de calendario que está programado para disparar a un usuario seleccionado Por lo tanto, al programar la notificación, no tendré idea de qué hará el usuario cuando se active la notificación. Estoy utilizando el userInfo de la notificación para almacenar datos sobre el evento que está programado pero establecer un valor como inBackground como se sugiere no funcionará.

Sé que será una de las dos situaciones si el usuario decide que quiere "ver" el evento. (Todo esto supondrá que la aplicación está en segundo plano o en primer plano y NO se cierra).

1 - Si se dispara mientras que la aplicación no se está utilizando & & la aplicación está en el fondo y no dejar de fumar, el IOS notificará al usuario de que ha ocurrido un evento y proporcionar una opción de ir a la aplicación responsable (que es mío en este caso). En ese momento, suponiendo que el usuario diga "sí, llévame a esta aplicación genial", se abrirá la aplicación desde un segundo plano y se llamará a la aplicación: DidReceiveLocalNotification donde puedo obtener toda la notificación userInfo.

2 - El usuario, por casualidad, está en mi aplicación cuando ocurre el evento programado. En ese punto, se vuelve a llamar a la aplicación: método DidReceiveLocalNotification, donde puedo obtener toda la notificación userInfo.

Pero es en este punto que me gustaría saber cuál de los dos escenarios acaba de tener lugar 1 ó 2.

Esperanza este detalle adicional sobre mi uso de la UILocalNotification ayudará a la hora de responder a esta pregunta. Gracias de antemano - marca

FIN EDITAR * ** * ** * ** * ** * ** * ** * ** * ** * ***

Respuesta

46

Quizás la forma más fácil es cuando su aplicación está en primer plano, no envíe una LocalNotification pero solo lleva a tus usuarios al evento.

Pero si insiste en hacerlo utilizando LocalNotification, aquí hay una manera fácil de detectar cuál es el estado de su Aplicación cuando se dispara UILocalNotification.

- (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 { 

    } 
} 
+2

He editado la pregunta para ayudar a explicar mejor. Y gracias, @xuzhe, pero esto no funcionará para mí. No estoy activando LocalNotification, es una UILocalNotification que se programó para que se active en alguna fecha. Por lo tanto, no puedo determinar qué hará el usuario en ese momento. –

+0

Editó la respuesta nuevamente. Puede verificar fácilmente el estado de su Aplicación utilizando la propiedad UIApplicationState. – xuzhe

+0

Muy, muy agradable. Solucionado un problema que tuve durante bastante tiempo. –

1

Esto es lo que he añadido a los cuerpos de estas funciones ... 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]; 
} 

Ahora las dos notificaciones se han ido (en particular la que aparece cuando la aplicación está en segundo plano y que lo abra desde la notificación de alerta.

1

En didReceiveLocalNotification se puede comprobar el estado de la aplicación:

[UIApplication shareApplication].applicationState

Si es igual a UIApplicationStateInactive sabe que la aplicación estaba en el fondo y el usuario abrió con la notificación de alerta local.

si es UIApplicationStateActive es posible que desee mostrar su propia alerta para el usuario.

Cuestiones relacionadas