para pantalla original movimiento imagen fondos fondo didreceiveremotenotification ajustar iphone ios4 apple-push-notifications

iphone - pantalla - didReceiveRemoteNotification cuando en el fondo



fondos de pantalla iphone hd (6)

Este tipo de pregunta ha sido formulada varias veces, pero tengo una situación específica en curso.

Cuando mi aplicación está activa y recibo un mensaje PUSH, puedo analizar las cargas útiles personalizadas y demás.

Sin embargo, cuando mi aplicación está en segundo plano y llega el PUSH, el usuario tiene que hacer clic en el botón ''Ver / Abrir'' para obtener la didReceiveRemoteNotification llamada a la didFinishLaunchingWithOptions didReceiveRemoteNotification y didFinishLaunchingWithOptions se llama a la didFinishLaunchingWithOptions la didFinishLaunchingWithOptions .

Necesito que mi aplicación decida si deben avisarle al usuario con un UIAlert cuando está en segundo plano o suprimir el mensaje push en función de algunas configuraciones locales.

Cualquier ayuda sería apreciada,


A partir del reciente iOS, creo que 8, si tienes notificaciones remotas habilitadas como modo de fondo, un truco es rastrear si estás ingresando al primer plano como una bandera.

@interface AppDelegate () @property (assign, atomic, getter=isEnteringForeground) BOOL enteringForeground; @end - (void) applicationWillEnterForeground: (UIApplication *) application { self.enteringForeground = YES; } - (void) applicationDidBecomeActive: (UIApplication *) application { self.enteringForeground = NO; } - (void) application: (UIApplication *) application didReceiveRemoteNotification: (NSDictionary *) userInfo fetchCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler { const BOOL launchedFromBackground = !(application.applicationState == UIApplicationStateActive); const BOOL enteringForeground = self.enteringForeground; if (launchedFromBackground && enteringForeground) { // The user clicked a push while the app was in the BG } }


Pase content-available = 1 con su carga e invocará a didReceiveRemoteNotification incluso en segundo plano. p.ej

{ "alert" : "", "badge" : "0", "content-available" : "1", "sound" : "" }


Su aplicación necesita manejar todos los posibles estados de entrega de notificaciones automáticas:

  • Tu aplicación acaba de lanzarse

  • Su aplicación fue traída de fondo a primer plano

  • Tu aplicación ya se estaba ejecutando en primer plano

No puede elegir en el momento de la entrega qué método de presentación se utiliza para presentar la notificación automática, que está codificada en la notificación en sí (alerta opcional, número de placa, sonido). Pero dado que presumiblemente tiene el control tanto de la aplicación como de la carga de la notificación de inserción, puede especificar en la carga útil si ya se presentó o no una vista de alerta y un mensaje al usuario. Solo en el caso de que la aplicación ya se esté ejecutando en primer plano, usted sabe que el usuario no acaba de ejecutar su aplicación a través de una alerta o regularmente desde la pantalla de inicio.

Puedes saber si tu aplicación acaba de llegar al primer plano o no en didReceiveRemoteNotification usando este pequeño 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 ... }


Tienes que hacer varias cosas para administrar la notificación push recibida cuando la aplicación está en segundo plano.

Primero, en su lado del servidor, debe configurar {"aps": {"content-available": 1 ... / $ body [''aps''] [''content-available''] = 1; en la carga útil de notificación de inserción.

En segundo lugar, en su proyecto de Xcode, debe habilitar las "notificaciones remotas". Se realiza yendo al objetivo del proyecto -> capacidades, luego habilita el interruptor de capacidades y verifica la casilla de verificación de notificaciones remotas.

En tercer lugar, en lugar de utilizar didReceiveRemoteNotification, debe llamar a la aplicación: didReceiveRemoteNotification: fetchCompletionHandler :, esto le permitirá realizar las tareas que desee en el fondo, en el momento de recibir la notificación:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { if(application.applicationState == UIApplicationStateInactive) { NSLog(@"Inactive - the user has tapped in the notification when app was closed or in background"); //do some tasks [self manageRemoteNotification:userInfo]; completionHandler(UIBackgroundFetchResultNewData); } else if (application.applicationState == UIApplicationStateBackground) { NSLog(@"application Background - notification has arrived when app was in background"); NSString* contentAvailable = [NSString stringWithFormat:@"%@", [[userInfo valueForKey:@"aps"] valueForKey:@"content-available"]]; if([contentAvailable isEqualToString:@"1"]) { // do tasks [self manageRemoteNotification:userInfo]; NSLog(@"content-available is equal to 1"); completionHandler(UIBackgroundFetchResultNewData); } } else { NSLog(@"application Active - notication has arrived while app was opened"); //Show an in-app banner //do tasks [self manageRemoteNotification:userInfo]; completionHandler(UIBackgroundFetchResultNewData); } }

Finalmente, debe agregar este tipo de notificación: UIRemoteNotificationTypeNewsstandContentAvailability a la configuración de notificaciones cuando la configura.

Aparte de esto, si tu aplicación se cerró cuando llegó la notificación, debes administrar esto en didFinishLaunchingWithOptions, y solo si el usuario toca la notificación push: La forma de hacerlo es:

if (launchOptions != nil) { NSDictionary *dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if (dictionary != nil) { NSLog(@"Launched from push notification: %@", dictionary); [self manageRemoteNotification:dictionary]; } }

¡launchOptions es! = nil cuando inicias la aplicación tocando en la notificación push, si accedes presionando el ícono, launchOptions será == nil.

Espero que sea útil. Aquí: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html es explicado por Apple.


Una cosa a tener en cuenta es que cuando su mensaje llegue al iPhone del usuario y haga clic en "cancelar", excepto el número de la insignia del icono (el sistema operativo se ocupará de ellos), no habría forma de que su la aplicación de fondo para saber sobre este evento push y tomar cualquier acción adicional.


Palabra de advertencia

Creo que la lógica de tu aplicación es basar el comportamiento en datos personalizados en tu notificación push. Esto no es para lo que se diseñan las notificaciones push. Lo que debe hacer alternativamente si su aplicación está didbecomeactive , es preguntarle a su servidor por los datos que necesita y que estaba enviando como carga útil de todos modos, y confíe en eso en lugar de en su carga útil.

Porque la documentación también establece que, como mejor práctica. Porque Apple no garantiza que su notificación push se reciba el 100% de las veces de todos modos.

Importante: la entrega de notificaciones es un "mejor esfuerzo", no está garantizado. No está destinado a entregar datos a su aplicación, solo para notificar al usuario que hay nuevos datos disponibles.

Sin embargo, si desea tener alguna indicación de si, por ejemplo, la insignia se ha cambiado sin depender de que un usuario abra la aplicación haciendo clic en la insignia, podría hacer algo como esto:

A. agrega un número de credencial (correcto) a la carga de la notificación de inserción enviada por su servidor. Por ejemplo, podría verse así:

{ "aps" : { "alert" : "You got your emails.", "badge" : 9 } }

B. llevas un registro de ese número de placa de manera persistente en tu aplicación, por ejemplo, guardándolo en NSUserDefaults .

Luego, en applicationDidBecomeActive puede comparar la propiedad applicationIconBadgeNumber de UIApplication con su recuento de distintivos almacenado previamente y ver si se ha aumentado o disminuido y hacer algunas actualizaciones en función de eso.

- (void)applicationDidBecomeActive:(UIApplication *)application { NSNumber *badgecount = [[NSUserDefaults standardUserDefaults] objectForKey:@"badgecount"]; if (!badgecount) badgecount = @(0); if ([UIApplication sharedApplication].applicationIconBadgeNumber != [badgecount integerValue]) { //store the new badge count badgecount = [NSNumber numberWithInteger:[UIApplication sharedApplication].applicationIconBadgeNumber]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:badgecount forKey:@"badgecount"]; [defaults synchronize]; // do some stuff here because it''s different } }