2011-02-24 14 views
45

Tengo algo bastante simple que quiero hacer. Adjunto una pieza personalizada de los datos de algunas notificaciones push que manejo enCómo responder a la notificación de inserción ver si la aplicación ya se está ejecutando en segundo plano

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

busco la UIApplicationLaunchOptionsRemoteNotificationKey y ¡listo ahí está.

Este método solo recibe una llamada si mi aplicación se inicia por primera vez. ¿Cómo leo la misma clave si mi aplicación se está ejecutando en segundo plano cuando la notificación entra y el usuario presiona el botón "Ver" en la notificación? Quiero enviarlos a un controlador de vista particular con los datos abiertos en él, lo mismo que hago si la aplicación se lanza por primera vez desde la notificación.

Respuesta

107

Consulte application:didReceiveRemoteNotification:fetchCompletionHandler: en iOS 7 y posterior.


El método se llama application:didReceiveRemoteNotification: si su aplicación se está ejecutando en primer plano. También se invoca si su aplicación se ejecuta en segundo plano y el usuario interactúa con su notificación automática (lo que hace que su aplicación esté activa).

Por lo tanto, la verdadera pregunta es cómo determinar si la aplicación estaba en primer plano o si el usuario la activó para interactuar con su notificación de inserción.

Parece que this answer a la pregunta didReceiveRemoteNotification when in background tiene la clave:

Puede saber si su aplicación se acaba de traer al primer plano o no en application:didReceiveRemoteNotification: utilizando este fragmento de código:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 
    if (application.applicationState == UIApplicationStateActive) 
     // app was already in the foreground 
    else 
     // app was just brought from background to foreground 
    ... 
} 
+13

en realidad no es exacto decir el método 'application: didReceiveRemoteNotification' se llama si la aplicación se ejecuta en segundo plano. Más exactamente: si la aplicación está en segundo plano, el método se llama solo después de que el usuario se comprometa con la notificación de inserción para ponerlo en primer plano. Si el usuario cancela/descarta la notificación de inserción, no se llamará al método delegado. –

+2

Cuando se llama a didRecieveRemoteNotification cuando el dispositivo recibe una notificación (desbloqueado), y cuando el usuario hace clic en la vista de notificación, resulta difícil (si yo lo sé) averiguar si el usuario realmente hizo clic en la notificación o la aplicación acaba de recibirla. Y verificar el estado de la aplicación no le dice nada, excepto su estado, no si el usuario hizo clic en la notificación (en mi experiencia). – Hrafn

+0

@ MartijnThé Buen punto. He aclarado la respuesta. – gerry3

-3

Para detectar si la aplicación se activa mediante Notificaciones por control remoto, intente esto:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; 
    if (userInfo == NULL) 
    { 
     NSLog(@"didFinishLaunchingWithOptions user startup userinfo: %@", userInfo); 
    } 
    else 
    { 
     NSLog(@"didFinishLaunchingWithOptions notification startup userinfo: %@", userInfo); 
    } 
} 
+1

Esto no tiene en cuenta el estado donde se inicia la aplicación, pero en el fondo. De eso es de lo que realmente se pregunta la pregunta. –

Cuestiones relacionadas