remote - push notifications ios swift tutorial
manejo de notificación de inserción (2)
Estoy leyendo los documentos de Apple en
Manejo de notificaciones locales y remotas
y me parece 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 presiona el botón de acción en la notificación, llama a la aplicación: didFinishLaunchingWithOptions y pasa en la carga 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 de iOS que dice lo siguiente:
"iOS Nota: en iOS, puede determinar si una aplicación se inicia como resultado de que el usuario toque el botón de acción o si la notificación se entregó a la aplicación en ejecución examinando el estado de la aplicación. En la implementación del delegado de la aplicación : didReceiveRemoteNotification: o application: didReceiveLocalNotification: method, obtener el valor de la propiedad applicationState y evaluarlo. 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 me implica a mí esa aplicación: didReceiveRemoteNotification: se llama cuando la aplicación ya está activa y 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 el método de aplicación: didFinishLaunchingWithOptions: o con un malentendido de lo que es una aplicación "en ejecución" (¿se considera "ejecutada" una aplicación secundaria?) . La documentación para la aplicación: didReceiveRemoteNotification: indica que se llama para aplicaciones "en ejecución".
Entonces, para resumir, ¿podría obtener una aclaración sobre:
1) ¿Es la aplicación: didReceiveRemoteNotification: siempre se llama cuando la aplicación está en primer plano o cuando el usuario selecciona "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) ¿Se está ejecutando una aplicación de fondo, al menos en el sentido de la aplicación de reclamo de documentos: se requiere didReceiveRemoteNotification para ejecutar aplicaciones?
3) Para completar, ¿hay una aplicación de fondo UIApplicationStateInactive o Active?
La redacción aquí es confusa, especialmente alrededor de la palabra fondo.
Cuando la aplicación realmente no está cargada en la memoria (p. Ej., Cuando la ejecuta, aparece la pantalla inicial, etc.), se invoca la aplicación: didFinishLaunchingWithOptions, y puede recibir la notificación push de la siguiente manera:
NSDictionary *remoteNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(remoteNotif)
{
//Handle remote notification
}
Si la aplicación se carga en la memoria y está activa (por ejemplo, la aplicación está actualmente abierta en el dispositivo), entonces solo se llama a la application:didReceiveRemoteNotification:
.
Si la aplicación está cargada en la memoria pero no está ACTIVA y NO EN EL FONDO (p. Ej., Lanzó 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 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
}
}
Según el escenario de iOS 9.1, he probado la notificación de inserción en el modo de muerte donde mi aplicación no se está ejecutando en ningún modo en ese momento si presiono la notificación de inserción de lo que el sistema llamará primero,
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
//your code execution will here.
}
Y la segunda llamada al método será,
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//Your initial code execution.
}
Este escenario lo he probado en mi aplicación.