ver recuperar pantalla notificaciones historial funciona como centro borradas bloqueada antiguas iphone push-notification apple-push-notifications

recuperar - ver notificaciones antiguas iphone



Manejo de notificaciones push cuando la aplicación NO se está ejecutando (8)

Aunque esto ha sido respondido, ninguna de las respuestas proporcionadas funcionó correctamente. Aquí está mi implementación que pude trabajar.

Este código va en la application:didFinishLaunchingWithOptions:

Rápido:

if let options = launchOptions, notification = options[UIApplicationLaunchOptionsRemoteNotificationKey] as? [NSObject : AnyObject] { // NOTE: (Kyle Begeman) May 19, 2016 - There is an issue with iOS instantiating the UIWindow object. Making this call without // a delay will cause window to be nil, thus preventing us from constructing the application and assigning it to the window. Quark.runAfterDelay(seconds: 0.001, after: { self.application(application, didReceiveRemoteNotification: notification) }) }

C objetivo:

if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) { [self application:application didReceiveRemoteNotification:launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]]; }

Un par de notas:

  • Posiblemente, debido a la forma en que iOS UIApplication.sharedApplication().window asignaciones, el objeto de la UIApplication.sharedApplication().window Raíz es nulo cuando se inicia la aplicación después de ser cancelado. La adición de un retraso de 1 milisegundo solucionó este problema. No probé esto en Objective-C

  • Se requería enviar a [NSObject: AnyObject] para evitar tener conflictos de tipo, pero no experimenté mucho con esto; Manténgalo en su mente cuando lo implemente en su propio proyecto. Objective-C no requiere esto.

  • Quark es solo una pequeña biblioteca divertida que uso en todos mis proyectos que contiene extensiones y métodos útiles y de uso común. Simplemente use cualquier forma de demora que se ajuste a sus necesidades de aplicación.

Cuando mi aplicación no se está ejecutando y recibe una notificación de inserción, si hago clic en esa notificación, la aplicación se inicia, pero luego no solicita al usuario la vista de alerta que configuré, preguntándoles si desean ver el Contenido de la notificación o no. Simplemente se lanza, y se sienta allí.

Las notificaciones automáticas funcionan perfectamente cuando la aplicación se está ejecutando, ya sea como la aplicación activa o en segundo plano, pero nada funciona correctamente cuando la aplicación no se está ejecutando.

Intenté desconectar el launchOptions NSDictionary en la application: didFinishLaunchingWithOptions: para ver qué carga está trayendo, pero aparece como "(null)". Entonces, básicamente, no contiene nada, lo que no tiene sentido porque no debería contener la carga de la Notificación.

¿Alguien tiene alguna idea de cómo hacer que las notificaciones automáticas funcionen cuando llegan mientras la aplicación NO se estaba ejecutando?

EDIT: aquí está el código que estoy usando en la application: didReceiveRemoteNotification solo para ver qué es qué:

if (UIApplicationStateBackground) { NSLog(@"==========================="); NSLog(@"App was in BACKGROUND..."); } else if (UIApplicationStateActive == TRUE) { NSLog(@"==========================="); NSLog(@"App was ACTIVE"); } else { [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 99]; UIAlertView *BOOM = [[UIAlertView alloc] initWithTitle:@"BOOM" message:@"app was INACTIVE" delegate:self cancelButtonTitle:@"a-ha!" otherButtonTitles:nil]; [BOOM show]; NSLog(@"App was NOT ACTIVE"); }

Entonces, se supone que esto se encarga de todos los estados de la aplicación, pero no lo es. Las notificaciones push solo funcionan cuando la aplicación se está ejecutando, ya sea en segundo plano o en primer plano ...

================================================

ACTUALIZACIÓN / EDICIÓN # 2: según la sugerencia de "@dianz" (a continuación), modifiqué el código de mi application: didFinishLaunchingWithOptions para incluir lo siguiente:

UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if (localNotif) { NSString *json = [localNotif valueForKey:@"data"]; UIAlertView *bam = [[UIAlertView alloc] initWithTitle:@"appDidFinishWithOptions" message:json delegate:self cancelButtonTitle:@"cool" otherButtonTitles:nil]; [bam show]; }

Esto hace que aparezca el cuadro AlertView, pero parece que no hay carga útil: el título de AlertView aparece ("appDidFinishWithOptions"), pero el json NSString aparece VACÍO ... Seguirá haciendo ajustes ...

======================

EDITAR # 3 - ahora está funcionando casi al 100%
Así, en didFinishLaunchingWithOptions :

UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if (localNotif) { // Grab the pushKey: pushKey = [localNotif valueForKey:@"pushKey"]; // "pushKey" is an NSString declared globally // The "pushKey" in the "valueForKey" statement is part of my custom JSON Push Notification pay-load. // The value of pushKey will always be a String, which will be the name of the // screen I want the App to navigate to. So when a Notification arrives, I go // through an IF statement and say "if pushKey=''specials'' then push the // specialsViewController on, etc. // Here, I parse the "alert" portion of my JSON Push-Notification: NSDictionary *tempDict = [localNotif valueForKey:@"aps"]; NSString *pushMessage = [tempDict valueForKey:@"alert"]; // Finally, ask user if they wanna see the Push Notification or Cancel it: UIAlertView *bam = [[UIAlertView alloc] initWithTitle:@"(from appDidFinishWithOptions)" message:pushMessage delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"View Info", nil]; [bam show]; }

A continuación, implemento el método alertView: clickedButtonAtIndex para ver qué eligió el usuario en AlertView y proceder en consecuencia.

Esto, junto con la lógica didReceiveRemoteNotification funciona perfectamente.

SIN EMBARGO ... cuando la aplicación NO se está ejecutando, y le envío una Notificación de inserción, si NO hago clic en la alerta de Notificación de inserción tan pronto como llega y en lugar de eso espero a que desaparezca (lo que ocurre después de un período de 3 a 3). 4 segundos), y luego hago clic en el ícono de la aplicación, que ahora tiene una MALA de 1, la aplicación se inicia, pero no recibo la alerta de Notificación Push cuando se inicia. Simplemente se sienta allí.

Supongo que necesito averiguar esa permutación a continuación ...


Cuando su aplicación no se está ejecutando o está inactiva y toca la notificación de inserción, esta función se activará;

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

así que deberías manejarlo así

UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if (localNotif) { NSString *json = [localNotif valueForKey:@"data"]; // Parse your string to dictionary }


Intente ir al método didReceiveRemoteNotification y manejarlo allí. Allí puede verificar los estados de la aplicación haciendo condicionales para el estado de applicationState , por ejemplo, verificando si se trata de UIApplicationStateActive u otros.


Mejor sea si anulas didReceiveRemoteNotification Aquí tienes

NSDictionary * pushNotificationPayload = [launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if(pushNotificationPayload) { [self application:application didReceiveRemoteNotification:pushNotificationPayload]; }

Esto activará nuevamente el método didReceiveRemoteNotification y su código de push notification se ejecutará de la misma manera que se ejecuta durante el tiempo de ejecución de la aplicación.


Probé la respuesta de @Dianz. No me ha funcionado, pero la respuesta me ayudó.

En mi caso;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSDictionary *apnsBody = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if (apnsBody) { // Do your code with apnsBody }


Tuve el mismo problema, pero finalmente pude manejar la Notificación Push cuando está Inactivo (no se está ejecutando) usando Notification Service Extension. Esta solución fue recomendada por el Equipo de Soporte de Apple y es solo para iOS 10, la implementé y ¡funciona bien! Os dejo el enlace:

https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ModifyingNotifications.html

Este es el procedimiento:

  1. Cree una nueva extensión del servicio de notificación para su aplicación. Abra su proyecto y presione Archivo - Nuevo - Destino y seleccione en la sección iOS, la opción "Extensión del servicio de notificación". Ponga el nombre de la extensión y la información que se requiere. Después de eso, Xcode agregará dos archivos con lenguaje Objective C: el archivo .h y .m.

NOTA: Considere que usará tres identificadores: 1) Identificador de su aplicación (que ya tiene) 2) Identificador de su extensión (que creará) 3) Identificador de Grupo de aplicaciones. (usted creará)

  1. Es necesario para permitir que los Grupos de aplicaciones creen un recurso donde pueda guardar y leer información para su aplicación y la extensión. Haga clic en "Mostrar Project Navigator". En la lista de objetivos seleccione su proyecto principal. Luego, haga clic en "Capacidades" y active la opción llamada "Grupos de aplicaciones". Agregue el identificador para el Grupo de aplicaciones para identificar recursos compartidos. Debe hacer el mismo paso para el destino de la extensión que creó (Seleccionar destino de la extensión - Capacidades - Activar en "Grupos de aplicaciones" - Agregar el mismo identificador para el Grupo de aplicaciones)

  2. Debe agregar el Identificador de su extensión en el Sitio de desarrolladores de Apple para identificar la extensión del servicio de notificación, también debe crear nuevos perfiles provisionales (desarrollo, AdHoc y / o producción) y asociarlos con los nuevos perfiles provisionales.

  3. En ambos identificadores (Aplicación y Extensión) debe editarlos y habilitar el Servicio de "Grupos de Aplicaciones" en ambos. Debe agregar el identificador para el grupo de aplicaciones en los Servicios de grupos de aplicaciones.

NOTA: el identificador de la aplicación y el identificador de la extensión DEBEN TENER EL MISMO IDENTIFICADOR PARA EL GRUPO DE APLICACIONES.

  1. Descargue el nuevo perfil provisional en Xcode y asócielo con su extensión del servicio de notificación. Por favor, asegúrese de que todo está bien con ellos.

  2. Después de eso, en "Capacidades" de su aplicación y extensión, abra la sección "Grupos de aplicaciones" y actualícelas. Los tres pasos: 1) Agregar los derechos de Grupos de aplicaciones a su archivo de derechos, 2) Aplicación de la función Grupos de aplicaciones a su ID de aplicación y 3) Agregar Grupos de aplicaciones a su ID de aplicación: debe marcarse.

  3. Vuelva al navegador de proyectos y seleccione la carpeta de su extensión. Abra el archivo .m. Verá un método llamado didReceiveNotificationRequest: (UNNotificationRequest *) request. En este método, creará un NSUserDefaults diferente con SuiteName exactamente igual al identificador para el grupo de aplicaciones como este:

    NSUserDefaults * defaultsGroup = [[NSUserDefaults alloc] initWithSuiteName: @ "identificador para grupo de aplicaciones"];

  4. En este mismo método, obtenga el cuerpo de la notificación y guárdelo en un NSMutableArray, luego guárdelo en los recursos compartidos. Me gusta esto:

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler{ self.contentHandler = contentHandler; self.bestAttemptContent = [request.content mutableCopy]; NSMutableArray *notifications = [NSMutableArray new]; NSUserDefaults *defaultsGroup = [[NSUserDefaults alloc] initWithSuiteName: @"Identifier for app group"]; notifications = [[defaultsGroup objectForKey:@"notifications"] mutableCopy]; if (notifications != nil){ [notifications addObject:self.bestAttemptContent.userInfo]; }else{ notifications = [NSMutableArray new]; [notifications addObject:self.bestAttemptContent.userInfo]; } [defaultsGroup setObject:notifications forKey:@"notifications"]; }

  1. Finalmente, en el Delegado de aplicaciones de su proyecto principal, en su método didFinishLaunchingWithOptions, recupere la matriz en los recursos compartidos con este código:

NSUserDefaults *defaultsGroup = [[NSUserDefaults alloc] initWithSuiteName: @"Identifier for app group"]; NSMutableArray *notifications = [[defaultsGroup objectForKey:@"notifications"] mutableCopy];

  1. ¡Disfrútala!

Espero ser claro con cada paso. Voy a escribir un post para implementar esta solución con imágenes en mi página. Otro punto que debe tener en cuenta es que no funciona con la Notificación de inserción silenciosa.


prueba esto

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; //register notifications if([application respondsToSelector:@selector(registerUserNotificationSettings:)]) // ios 8 { [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]]; [application registerForRemoteNotifications]; } else // ios 7 { [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge]; } // open app from a notification NSDictionary *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if (notification) { //your alert should be here } // Set icon badge number to zero application.applicationIconBadgeNumber = 0; return YES; }


Swift 3 y xCode 8.3.2 :

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // your code here // Check if app was not running in background and user taps on Push Notification // This will perform your code in didReceiveRemoteNotification where you should handle different application states if let options = launchOptions, let notification = options[UIApplicationLaunchOptionsKey.remoteNotification] as? [NSObject : AnyObject] { self.application(application, didReceiveRemoteNotification: notification) } return true }