manejo

2012-04-12 11 views
37

notificación de inserción estoy leyendo documentos de Apple enmanejo

Handling Local and Remote Notifications

y parece a mí para tener declaraciones contradictorias. ¿Alguien puede aclarar estos puntos de confusión? Hablemos estrictamente de notificación remota (en lugar de local) por ahora.

Los documentos dicen que si se pulsa el botón de acción relativo a la comunicación, llama a la aplicación: didFinishLaunchingWithOptions y pasa en la carga útil de notificación. Más tarde dice que si la aplicación se ejecuta en primer plano, entrega la notificación a través de la aplicación: didReceiveRemoteNotification :. Esto implica para mí que cuando la aplicación está en segundo plano o no se está ejecutando, entonces se llama a la aplicación: didFinishLaunchingWithOptions. De lo contrario, se llama a la aplicación: didReceiveRemoteNotification:

Más tarde, hay una nota iOS diciendo lo siguiente:

"IOS Nota: En iOS, se puede determinar si una aplicación se inicia como consecuencia de que el usuario pulsando el botón de acción o si la notificación fue entregada a la aplicación ya se encuentra corriendo examinando el estado de la aplicación en la implementación del delegado de la aplicación:. didReceiveRemoteNotification: o aplicación: didReceiveLocalNotification:. método, obtener el valor de la propiedad applicationState y evaluarla Si el valor es UIApplicationStateInactive, el usuario tocó la botón de acción; si el valor es UIApplicationStateActive, la aplicación estaba en primer plano cuando recibió la notificación ".

Esto me implica a esa aplicación: didReceiveRemoteNotification: se llama tanto cuando la aplicación ya está en primer plano como si el usuario presiona el botón de acción (o desliza el control deslizante de acción en iOS 5) para poner en primer plano/iniciar la aplicación. El origen de mi confusión podría ser la primera parte donde los documentos implican que la carga de notificación se envía con la aplicación: didFinishLaunchingWithOptions: método o con un malentendido de lo que es una aplicación "en ejecución" (se considera una aplicación secundaria). corriendo"?). La documentación para la aplicación: didReceiveRemoteNotification: indica que se llama para aplicaciones "en ejecución".

tanto, para resumir, podría obtener aclaraciones sobre: ​​

1) ¿Es de aplicación: didReceiveRemoteNotification: siempre se llama cuando la aplicación está en primer plano o cuando el usuario selecciona a "actuar" en la notificación? De lo contrario, ¿cómo damos sentido a la nota de iOS sobre la determinación del estado de la aplicación que está activo o inactivo?

2) Es una aplicación en segundo plano "en marcha", al menos en el sentido de los documentos que afirman aplicación: didReceiveRemoteNotification se llama para el funcionamiento de las aplicaciones?

3) Para finalizar, es un UIApplicationStateInactive aplicación en segundo plano o Active?

+19

¿Puedo obtener una marca de verificación? – ch3rryc0ke

Respuesta

91

El texto aquí es confuso, especialmente alrededor de la palabra backgrounding.

Cuando la aplicación es realmente no está cargado en la memoria (e, g cuando se lanza que la pantalla de presentación aparece etc.), A continuación de la aplicación: didFinishLaunchingWithOptions se llama, y ​​se puede obtener la notificación de inserción de la siguiente manera:

NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; 

if(remoteNotif) 
{ 
    //Handle remote notification 
} 

Si la aplicación está cargada en la memoria y está ACTIVA (por ejemplo, la aplicación está actualmente abierta en el dispositivo) entonces se llama a application:didReceiveRemoteNotification:.

Si la aplicación está cargada en memoria pero no está ACTIVA y NO EN FONDO (p. Ej., Inició la aplicación, presionó el botón de inicio y esperó 10 segundos) y luego hace clic en el botón de acción en una notificación de inserción. solo se llama a didReceiveRemoteNotification.

Puede capturar este caso de la siguiente manera:

-(void)application:(UIApplication *)app didReceiveRemoteNotification:(NSDictionary *)userInfo 
{ 
    if([app applicationState] == UIApplicationStateInactive) 
    { 
     //If the application state was inactive, this means the user pressed an action button 
     // from a notification. 

    //Handle notification 
    } 
} 
+2

¿Se ha llamado 'didReceiveRemoteNotification' en el primer caso que explicó? ¿Es suficiente implementar mi código en ambos métodos que has escrito? ¿No se ejecutará el código dos veces? Gracias. –

+1

esto es incorrecto: si tiene el centro de notificaciones visible o el centro de control, por ejemplo, la aplicación se considera inactiva. ¿Tiene alguna sugerencia sobre cómo determinar el tipo "activarse desde el fondo"? – dvkch

+0

también tenga en cuenta que el mismo comportamiento está relacionado con didReceiveRemoteNotification: (NSDictionary *) userInfo fetchCompletionHandler: (void (^) (UIBackgroundFetchResult result)) completionHandler NS_AVAILABLE_IOS (7_0); – valvoline

2

De acuerdo con iOS 9.1 escenario que he probado notificación de inserción en el modo de muertes en mi aplicación no se está ejecutando en cualquier modo en ese momento si hago tapping en la notificación de inserción que el sistema llamará en primer lugar,

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

//your code execution will here. 

} 

Y segunda llamada al método serán,

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

//Your initial code execution. 

} 

Este escenario lo he probado en mi aplicación.

+0

¿Cómo ha probado este escenario, por favor explique? – Nico

+0

Nico, he imprimido el archivo de directorio del documento de inicio de sesión para verificar, a qué método se llamará en el modo de cancelación de la notificación de inserción. –