XCode: ¿por qué launchOptions en didFinishLaunchingWithOptions siempre es nula?

Quiero que mi aplicación haga cosas específicas cuando la aplicación se inicia con un clic en una notificación. Quiero hacer estas cosas específicas cuando la aplicación ya se está ejecutando en segundo plano PERO TAMBIÉN cuando se inicia la aplicación DESDE SCRATCH (no se ejecuta en segundo plano) haciendo clic en la notificación.

Cuando la aplicación se inicia desde el background con un clic en la notificación, recibo la notificación a través de:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 

=> ¡SIN PROBLEMAS!

Cuando la aplicación se inicia desde cero con un clic en la notificación, me gustaría recibir la notificación a través de:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; } 

¡Pero launchOptions es siempre nulo! Es nula cuando la aplicación se inicia desde cero haciendo clic en el icono de la aplicación (normal), pero también cuando la aplicación se inicia desde cero con un clic en una notificación (no normal).

¿Alguien sabe cómo resolver este problema?

Gracias !!!

EDITAR 1

Así es como se crean mis notifications (pregunta de Joe):

  NSDictionary *userInfo = [NSDictionary dictionaryWithObjects: [NSArray arrayWithObjects:notifText,latitudeString,longitudeString,nil] forKeys:[NSArray arrayWithObjects:@"notifText",@"latitude",@"longitude", nil]]; UILocalNotification *localNotif = [[UILocalNotification alloc] init]; localNotif.fireDate = itemDate; localNotif.timeZone = [NSTimeZone defaultTimeZone]; localNotif.alertBody =msg; localNotif.alertAction = @"Ok"; localNotif.soundName = UILocalNotificationDefaultSoundName; localNotif.applicationIconBadgeNumber = 1; localNotif.userInfo = userInfo; [[UIApplication shanetworkingApplication] scheduleLocalNotification:localNotif]; [localNotif release]; 

EDIT 2 (RESPONDER A MI PREGUNTA! :))

Aquí está el procedimiento que utilicé para depurar mi aplicación pero … ¡este procedimiento es incorrecto!

  1. Configuré mi depurador con la opción "Wait for MyApp.app to launch" en el menu "Editar esquema"
  2. Inicié mi aplicación con XCode por primera vez (inicia desde cero) XCode muestra el post "Esperando que mi MyApp se inicie" => HAGO CLIC EN MI ICONO DE LA APLICACIÓN para iniciar la aplicación
  3. La aplicación se lanza => Hice clic en el button de inicio => se muestra la notificación
  4. Hice clic en el button detener en XCode para cerrar la aplicación. Lo relanzé con XCode => XCode muestra nuevamente el post "Esperando que mi MyApp se inicie" => HAGO CLIC EN LA NOTIFICACIÓN en la barra de estado para iniciar la aplicación
  5. => launchOptions es nil!

launchOptions igual a nil se debe al hecho de que el relanzamiento de la aplicación con XCode (en este caso con la opción "Esperando mi aplicación para iniciar") elimina las notifications incluso si aún se muestra en la barra de estado …

Para poder depurar comprobar cuál es el contenido de launchOptions después de un relanzamiento de la aplicación desde el principio con un clic en una notificación, parece que la única forma es mostrar este contenido en un UIAlert como se menciona en la respuesta de Tammo Freese. Por lo tanto, use lo siguiente para depurar en este caso específico:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"options" message:[launchOptions[UIApplicationLaunchOptionsLocalNotificationKey] description] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; return YES; } 

Gracias a todos por su ayuda !!!!

No pude encontrar un error en el código que compartiste. Normalmente esto debería funcionar tanto en el simulador como en el dispositivo. Aquí hay un ejemplo que funcionó para mí: primero genere una nueva aplicación para iPhone de Vista única (ARC y Storyboards en). Luego, cambia dos methods en AppDelegate siguiente manera:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"options" message:[launchOptions[UIApplicationLaunchOptionsLocalNotificationKey] description] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; return YES; } - (void)applicationDidEnterBackground:(UIApplication *)application { [[UIApplication shanetworkingApplication] cancelAllLocalNotifications]; UILocalNotification *localNotif = [[UILocalNotification alloc] init]; localNotif.fireDate = [NSDate dateWithTimeInterval:10.0 sinceDate:[NSDate date]]; localNotif.timeZone = [NSTimeZone defaultTimeZone]; localNotif.alertBody = @"Just some text"; localNotif.alertAction = @"OK"; localNotif.soundName = UILocalNotificationDefaultSoundName; localNotif.applicationIconBadgeNumber = 1; localNotif.userInfo = @{@"test": @YES}; [[UIApplication shanetworkingApplication] scheduleLocalNotification:localNotif]; } 

A continuación, inicie esta aplicación, presione el button de inicio y luego detenga la aplicación. Si toca la notificación local que aparece en 10 segundos después de presionar el button de inicio, debería ver algo como esto, que muestra que la notificación local se ha pasado a -application:didFinishLaunchingWithOptions: ::

captura de pantalla del iPhone Simulator que muestra una vista de alerta que muestra una notificación local

Mi consejo es: primero obtenga el ejemplo que publiqué anteriormente para trabajar y asegurarse de que nada haya salido mal con su configuration, luego verifique lo que está haciendo de manera diferente en su código.

Editar

Esto se aplica a Editar 2 de la pregunta: las notifications locales también parecen funcionar para mí cuando se espera que la aplicación se inicie (en el simulador, no en el dispositivo). Prueba esto:

  1. Instale la aplicación de ejemplo descrita anteriormente e inicie con "Espere a que MyApp.app se inicie" deshabilitado.
  2. Haga clic en el button de inicio, luego detenga la aplicación a través de Xcode o a través de la barra de tareas.
  3. Habilite "Esperar a que MyApp.app se inicie".
  4. Si ahora toca la notificación en el centro de notifications, se muestra en la vista de alerta.

No sé si esto es lo que estás buscando, pero ¿te estás perdiendo 'return YES;'? Porque uso esto para realizar una segue a una nueva vista desde una notificación y funciona bien

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UINavigationController *navigation = (UINavigationController *) self.window.rootViewController; [navigation.visibleViewController performSegueWithIdentifier:@"Ident" sender:nil]; return YES; } 

Mi conclusión y sugerencia si puede ayudar a cualquiera, consulte más abajo

Cada vez que tenga una compilation nueva para probar su aplicación, debe probar las acciones de clics de notificación con las notifications generadas por la última aplicación. Si continúa probando las acciones de clic con las notifications anteriores generadas por la compilation anterior, se comportará de forma inesperada (significa que de alguna manera es capaz de iniciar la aplicación, pero no le devolverá ninguna información válida en didFinishLaunchingWithOptions 🙂

Por favor, perdóneme, todavía soy nuevo cuando se trata del service de notificación de notifications de Apple, pero hice un poco de lectura a través de su documentation y supongo que puede haber algo en la creación de su notificación local que esté causando el problema.

Volveré a verificar cómo estás creando tu notificación local con el Ejemplo de Apple como se muestra aquí en el Listado 2-1 solo para descartar esa posibilidad. Dado que parte del código que se utiliza para crear su notificación local no se nos muestra en este hilo, dificulta evaluar si la instanciación de su notificación local es realmente correcta. Podría terminar siendo tan simple como que algo esté mal con la date de disparo o con otra cosa en la notificación que no se haya configurado correctamente.