segundo plus plano pantalla multiventana escuchar dividida como aplicaciones iphone objective-c ios4 uikit uilocalnotification

plano - pantalla dividida iphone 7 plus



Determinar si UILocalNotification se disparó con la aplicación en primer plano o en segundo plano (3)

En didReceiveLocalNotification puede verificar el estado de la aplicación:

[UIApplication shareApplication].applicationState

Si es igual a UIApplicationStateInactive usted sabe que la aplicación estaba en segundo plano y el usuario la abrió con la alerta de notificación local.

Si es UIApplicationStateActive es posible que desee mostrar su propia alerta al usuario.

Al recibir una UILocalNotification

  1. La application:DidReceiveLocalNotification método application:DidReceiveLocalNotification se llama cuando la aplicación está en primer plano.
  2. Cuando la aplicación está en segundo plano, abre la aplicación y luego llama a la application:DidReceiveLocalNotification .

¿Cómo puedo determinar cuál de estos escenarios está teniendo lugar? Me gustaría tratarlos de manera diferente.

Si la aplicación estaba en segundo plano, el usuario indicó que desea ver el evento. Así que en application:DidReceiveLocalNotification No quiero preguntarles otra vez, solo quiero llevarlos al evento.

Pero si la aplicación está en primer plano cuando la notificación se application:DidReceiveLocalNotification y llama a la application:DidReceiveLocalNotification , quiero preguntar al usuario si desea ver el evento.

En esencia tendría:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { if (appLauncedFromBackground) // go to event else // ask if user wants to view event }

Pensé en escribir un valor bool en un NSUserDefault dentro de applicationWillEnterForeground:application luego leerlo y restablecerlo dentro de la application:DidReceiveLocalNotification . Pero pensé que si había una manera de probar, esa sería una ruta mucho mejor.

Gracias mark

EDITAR * ** * ** * ** * ** * ** * ** * ** * ** * ** * **

Gracias xuzhe pero eso no va a funcionar en esta situación. Aquí hay un poco más de detalles que pueden explicar por qué no funciona y tal vez ayuden a alguien a responder esto por mí:

La UILocalNotification que estoy configurando aquí es un evento como un evento de calendario que está programado para activarse a una hora seleccionada por el usuario, por lo que al programar la notificación no tendré idea de lo que el usuario va a hacer cuando se active la notificación. Estoy utilizando la información de usuario de la notificación para almacenar datos sobre el evento que está programado, pero establecer un valor como inBackground como sugerido no funciona.

Sé que será una de las dos situaciones si el usuario decide que quiere "ver" el evento. (todo esto supondrá que la aplicación está en segundo plano o en primer plano y NO se cerrará).

1 - Si se dispara mientras la aplicación no se está utilizando && la aplicación está en segundo plano y no se cierra, iOS notificará al usuario que ha ocurrido un evento y brindará una opción para acceder a la aplicación responsable (que es la mía en este caso) ). En ese momento, suponiendo que el usuario diga "sí, llévame a esta aplicación genial", abrirá la aplicación desde el fondo y llamará a la aplicación: DidReceiveLocalNotification donde puedo obtener toda la información del usuario de la notificación.

2 - El usuario, por casualidad, está en mi aplicación cuando tiene lugar el evento programado. En ese punto, se llama nuevamente al método de aplicación: DidReceiveLocalNotification, donde puedo obtener toda la notificación de información del usuario.

Pero es en este punto que quiero saber cuál de los dos escenarios acaba de ocurrir 1 o 2.

Espero que este detalle adicional sobre mi uso de UILocalNotification ayude a responder esta pregunta. Gracias de antemano - marca

EDICIÓN FINAL * ** * ** * ** * ** * ** * ** * ** * ** * ***


Esto es lo que agregué a los cuerpos de estas funciones ... application didFinishLaunchingWithOptions :

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; if (localNotif) { //launched from notification [userDefaults setBool:YES forKey:@"deactivate in-app notification"]; [userDefaults synchronize]; } else{ [userDefaults setBool:NO forKey:@"deactivate in-app notification"]; [userDefaults synchronize]; }

En applicationDidEnterBackground :

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; [userDefaults setBool:YES forKey:@"deactivate in-app notification"]; [userDefaults synchronize];

En applicationWillEnterForeground :

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; [userDefaults setBool:YES forKey:@"deactivate in-app notification"]; [userDefaults synchronize];

applicationDidBecomeActive :

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; [userDefaults setBool:NO forKey:@"deactivate in-app notification"]; [userDefaults synchronize];

didReceiveLocalNotification :

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; if(![userDefaults boolForKey:@"deactivate in-app notification"]){ UIAlertView* alert= [[UIAlertView alloc]initWithTitle:@"My App" message:notif.alertBody delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; [alert release]; NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults]; [userDefaults setBool:NO forKey:@"deactivate in-app notification"]; [userDefaults synchronize]; }

Ahora las dos notificaciones han desaparecido (especialmente la que aparece cuando la aplicación está en segundo plano y la abre desde la alerta de notificación.


Quizás la forma más fácil es cuando su aplicación está en primer plano, no envíe una notificación local, solo lleve a sus usuarios al evento.

Pero si insiste en hacerlo utilizando LocalNotification, aquí hay una manera fácil de detectar cuál es el estado de su aplicación cuando se activa UILocalNotification.

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { //[super application:application didReceiveLocalNotification:notification]; // In most case, you don''t need this line UIApplicationState state = [application applicationState]; if (state == UIApplicationStateInactive) { // Application was in the background when notification was delivered. } else { } }