2011-10-03 5 views
7

Estoy haciendo una aplicación que realiza un seguimiento de algunos recordatorios que se repite con un intervalo definido por el usuario.Detectar si la aplicación obtuvo el foco debido a UILocalNotification

Lo hice así cuando aparece la alerta, el título de la acción dice "Renovar". Cuando hace clic en esto, la aplicación se abre y aquí quiero crear el siguiente recordatorio, pero el problema es que no sé si la aplicación se abre porque se pulsó el botón de notificación o si se activó la notificación mientras se ejecutaba la aplicación.

¿Alguien tiene alguna idea?

Respuesta

13

La forma 'correcta' de hacerlo es examinar applicationState de su NSApplication propiedad en la aplicación: didReceiveRemoteNotification: método de su delegado.

Desde el documentation aplicable a las notificaciones locales:

iOS Nota: En iOS, se puede determinar si se inicia una aplicación como resultado de que el usuario pulsando el botón de acción o si la notificación fue entregado a la aplicación que ya se está ejecutando por examinando el estado de la aplicación. En la implementación del delegado de la aplicación: didReceiveRemoteNotification: o aplicación: didReceiveLocalNotification: método, obtenga el valor de la propiedad applicationState y evalúela. Si el valor es UIApplicationStateInactive, el usuario tocó el botón de acción; si el valor es UIApplicationStateActive, la aplicación estaba en primer plano cuando recibió la notificación.

Esto es similar a su solución utilizando los indicadores establecidos en applicationWillEnterForeground y applicationDidBecomeActive pero con compatibilidad con el sistema.

0

Usted está buscando

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

o

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

Documentation

+0

Hmm, no sé a qué te refieres. Eso solo se dispara la primera vez que abro la aplicación. Si la aplicación todavía está en segundo plano, eso nunca sucederá. – oskob

+0

ah, buen punto ... Leí mal la pregunta. Voy a editar – filipe

0

Busque el documentation de claves de opción de lanzamiento UIApplication. El último parámetro para su aplicación: didFinishLaunchingWithOptions: delegate method contiene la información que necesita.

Además, mira application:didReceiveLocalNotification.

+0

Eso no se activa si la aplicación está en segundo plano, que probablemente será. – oskob

+0

Además, didReceiveLocalNotification no dice si la aplicación ya estaba abierta o si fue abierta por la notificación – oskob

0

Si su aplicación ya se está ejecutando obtendrá este mensaje delegado en el delegado de la aplicación

application:didReceiveLocalNotification: 

Si no se estaba ejecutando tendrá que utilizar

application:didFinishLaunchingWithOptions: 

Es necesario responder de manera apropiada en ambos métodos para cubrir todos los casos

actualiza

Para detectar si el usuario activó el botón de acción requiere un poco más de complejidad. Podemos decir que application:didFinishLaunchingWithOptions: tendrá la notificación local como una opción de inicio, pero es más difícil con el application:didReceiveLocalNotification:.

Dado que la aplicación se activa después de que el usuario toque el botón, tenemos que diferir hasta que veamos ese mensaje (o no). Establezca NSTimer en application:didReceiveLocalNotification y cancélelo en didBecomeActive. Eso significa que el usuario presionó el botón de acción. Si el temporizador no se cancela, el usuario estaba dentro de la aplicación cuando disparó.

+0

Exactamente, y no puedo decir si la aplicación se abrió porque se activó el botón de acción de la notificación o si el evento se activó mientras la aplicación se estaba ejecutando – oskob

+0

Esto también funcionará, pero creo que mi solución es más limpia :) gracias a – oskob

+0

de acuerdo, usando un temporizador como este parece hacky :) –

13

No sé si mi pregunta era clara, pero parece que me dieron 4 respuestas diferentes que todos malinterpretado mi pregunta: P

Sin embargo, he descubierto que el didReceiveLocalNotivication sucede entre willEnterForeground y didBecomeActive, así que lo hice esto para determinar si la aplicación ya estaba abierta o no:

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
{ 
    NSLog(@"Opened from notification? %@", wasInactive ? @"yes!" : @"no!"); 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    wasInactive = YES; 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    wasInactive = NO; 

} 
+5

Más simple que esto, deseche las cosas en 'applicationWillEnterForeground:' y 'applicationDidBecomeActive:' por completo y simplemente compruebe 'application.applicationState' en' application: didReceiveLocalNotification: 'en su lugar. Si el estado de la aplicación es 'UIApplicationStateActive', recibiste la notificación mientras se ejecutaba la aplicación. Si es 'UIApplicationStateInactive' o' UIApplicationStateBackground', lo recibiste mientras se reanudaba la aplicación. Por cierto, sospecho que su versión actual fallará al volver a poner la aplicación en primer plano durante una tarea en segundo plano, aunque necesito probar eso. –

+0

¡De acuerdo con Mark! Esto hizo maravillas en AppDelegate.m ¡Gracias! –

0

en delegado de la aplicación de este método:

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

Usted h AVE a examinar los launchOptions mirando este clave:

UIApplicationLaunchOptionsLocalNotificationKey

Cuando ya está activa esta se llamará:

- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
Cuestiones relacionadas