2010-01-04 9 views
29

Envío notificaciones automáticas a mi aplicación de iPhone, y me gustaría tener un conjunto diferente de instrucciones para ejecutar dependiendo de si la aplicación ya está iniciada o no. Soy nuevo en el desarrollo de iPhone, y aunque sospecho que UIApplication o la clase AppDelegate de mi proyecto tiene la solución, no he encontrado una buena respuesta. ¿Hay alguna manera fácil de verificar esto?¿Cómo puedo saber si mi aplicación para iPhone se está ejecutando cuando se recibe una notificación push?

Respuesta

18

El UIApplication delegado tiene el método

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 

el que es necesario implementar. Esto recibe la notificación cuando la aplicación se está ejecutando.

Si su aplicación no se está ejecutando actualmente y una notificación es recibida a continuación, su aplicación puede ser lanzado con

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

con los detalles de la notificación realizada en el diccionario launchOptions. si el diccionario es nulo, el usuario toca el ícono de la aplicación como siempre.

2

La documentación de Apple para las notificaciones push explica esto:

Sin embargo, hay dos situaciones en las que applicationDidFinishLaunching: no es un sitio de aplicación adecuado:

  • La aplicación se ejecuta cuando llega la notificación.
  • La carga de notificación contiene datos personalizados que la aplicación puede usar.

En el primer caso, en que la aplicación se ejecuta cuando el iPhone OS recibe una notificación remota, se debe implementar la aplicación: didReceiveRemoteNotification: Forma de UIApplicationDelegate si desea descargar los datos inmediatamente. Después de la descarga, asegúrese de quitar la insignia del icono de la aplicación. (Si su aplicación comprueba con frecuencia con su proveedor para obtener nuevos datos, la aplicación de este método podría no ser necesario.)

Esto significa que si su aplicación: didReceiveRemoteNotification: método delegado se llama, su aplicación se está ejecutando.

76

Esta es la forma más adecuada de manejar el estado activo/inactivo de la aplicación.

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
     // check for the app state 
     UIApplicationState state = [application applicationState]; 

     if (state == UIApplicationStateActive) { 
      //the app is in the foreground, so here you do your stuff since the OS does not do it for you 
      //navigate the "aps" dictionary looking for "loc-args" and "loc-key", for example, or your personal payload) 
     } 

    application.applicationIconBadgeNumber = 0; 
} 

didReceiveRemoteNotification: se llama cuando la aplicación se está ejecutando, sí, pero cuando se suspende, el iOS se encarga de la colocación de la tarjeta de identificación, etc. Si la aplicación está en primer plano, el sistema operativo no hace nada y solo llama al didReceiveRemoteNotification:.

6

Si va a comprobar applicationState en IOS menos de 4, tendrá que comprobar que applicationState es compatible:

if ([application respondsToSelector:@selector(applicationState)]){ 
    // Safe to check applicationState 
    UIApplicationState state = [application applicationState]; 
} 
26

Dependiendo de qué quiere decir con "marcha", que están ya sea buscando :

  • respuesta de Kevin anterior (diferencia entre puso en marcha o no lanzado)
  • o esto (diferencia entre suspendido o activa, pero ya en marcha):

Utilice un indicador que se establece como verdadero cuando la aplicación se activa y falso cuando la aplicación no está activa.

bandera (en el archivo de cabecera [.h]):

BOOL applicationIsActive; 

de código (en el archivo de implementación [.m]):

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    applicationIsActive = YES; 
} 

- (void)applicationWillResignActive:(UIApplication *)application { 
    applicationIsActive = NO; 
} 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 
    if (applicationIsActive) { 
     // Handle notification in app active state here 
    } 
    else { 
     // Handle notification in app suspended state here 
    } 

Esto funciona porque cuando se suspende la aplicación, la El SO llama a "applicationDidReceiveRemoteNotification" antes de llamar a "applicationDidBecomeActive" durante el proceso de "activación".

La respuesta "completa" es en realidad la respuesta de Kevin más esta respuesta.

Espero que esto ayude.

+0

Esta es una gd. Gracias –

Cuestiones relacionadas