Подтвердить что ты не робот

XCode: почему launchOptions in didFinishLaunchingWithOptions всегда нуль?

Я хочу, чтобы мое приложение выполняло определенные действия, когда приложение запускается щелчком по уведомлению. Я хочу делать эти конкретные вещи, когда приложение уже работает в фоновом режиме, НО ТАКЖЕ, когда приложение запускается из SCRATCH (не работает в фоновом режиме) щелчком по уведомлению.

Когда приложение запускается из фона щелчком по уведомлению, я получаю уведомление через:

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

= > НЕ ПРОБЛЕМА!

Когда приложение запускается с нуля с помощью щелчка на уведомлении, я хотел бы получить уведомление через:

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

     UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];

}

Но launchOptions всегда нуль!! Нуль, когда приложение запускается с нуля с помощью щелчка на значке приложения (обычно), но также, когда приложение запускается с нуля с помощью щелчка уведомления (не нормально).

Кто-нибудь знает, как решить эту проблему?

Спасибо!!!

ИЗМЕНИТЬ 1

Вот как мои уведомления создаются (вопрос Джо):

  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 sharedApplication] scheduleLocalNotification:localNotif];
    [localNotif release];

ИЗМЕНИТЬ 2 (ОТВЕТ НА МОЙ ВОПРОС!:))

Вот процедура, которую я использовал для отладки моего приложения, но... эта процедура неверна!

  • Я настроил свой отладчик с параметром "Подождите, пока MyApp.app для запуска" в меню "Редактировать схему"
  • Я впервые запустил приложение с XCode (запуск с нуля). XCode отображает сообщение "Ожидание запуска MyApp" = > Я НАЖМИТЕ НА МОЕЙ APP ICON, чтобы запустить приложение.
  • Запущено приложение = > Я нажал на кнопку home = > отображается уведомление
  • Я нажал кнопку остановки в XCode, чтобы закрыть приложение, которое я перезапустил с помощью XCode = > XCode снова отображает сообщение "Ожидание моего сообщения MyApp" = > Я НАЖМИТЕ НА УВЕДОМЛЕНИЕ в строке состояния для запуска приложения
  • = > launchOptions - это nil!

launchOptions, равный nil, связан с тем, что перезапуск приложения с XCode (в этом случае с параметром "Ожидание моего MyApp для запуска" ) удаляет уведомления, даже если он все еще отображается в строке состояния...

Чтобы иметь возможность отлаживать информацию о том, что является содержимым launchOptions после перезапуска приложения с нуля, щелкнув по уведомлению, кажется, что единственный способ показать этот контент в UIAlert, как указано в ответе Tammo Фриз. Итак, используйте следующее для отладки в этом конкретном случае:

- (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;
}

Спасибо всем за вашу помощь!!!!

4b9b3361

Ответ 1

Я не смог найти ошибку в коде, который вы поделили. Обычно это должно работать как в симуляторе, так и на устройстве. Вот пример, который сработал у меня: сначала создайте новое приложение для iPhone с одним взглядом (ARC и Storyboards on). Затем измените два метода в AppDelegate следующим образом:

- (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 sharedApplication] 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 sharedApplication] scheduleLocalNotification:localNotif];
}

Затем запустите это приложение, нажмите кнопку "Домой", а затем остановите приложение. Если вы нажмете на локальное уведомление, которое появится через 10 секунд после нажатия кнопки "домой", вы увидите что-то вроде этого, которое показывает, что локальное уведомление было отправлено на -application:didFinishLaunchingWithOptions::

screenshot of the iPhone Simulator showing an alert view that displays a local notification

Мой совет: сначала приведи пример, который я написал выше, чтобы убедиться, что с вашей настройкой ничего не получилось, затем проверьте, что вы делаете по-другому в своем коде.

Edit

Это относится к редактору 2 вопроса: локальные уведомления также работают для меня, ожидая запуска приложения (в симуляторе, а не на устройстве). Попробуйте следующее:

  • Установите пример приложения, описанного выше, и запустите его с отключенным "Подождите, пока MyApp.app для запуска".
  • Нажмите кнопку "домой", затем остановите приложение через Xcode или через панель задач.
  • Включить "Подождите, пока MyApp.app не запустится".
  • Если вы сейчас нажмете уведомление в центре уведомлений, оно отображается в представлении оповещения.

Ответ 2

Не знаю, если это то, что вы ищете, но вы пропускаете "return YES"? Поскольку я использую это для выполнения segue для нового представления из уведомления, и он отлично работает

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UINavigationController *navigation = (UINavigationController *) self.window.rootViewController;

    [navigation.visibleViewController performSegueWithIdentifier:@"Ident" sender:nil];

    return YES;
}

Ответ 3

Мой вывод и предложение, если он может помочь кому-либо, см. ниже

Каждый раз, когда у вас есть новая сборка для тестирования вашего приложения, вы должны протестировать действия с уведомлением об уведомлениях с помощью уведомлений, созданных последним приложением. Если вы продолжаете тестировать действия кликов со старыми уведомлениями, сгенерированными старой сборкой, то он будет вести себя неожиданно (значит, как-то его можно запустить приложение, но оно не вернет вам какую-либо достоверную информацию в файле didFinishLaunchingWithOptions:)

Ответ 4

Пожалуйста, простите меня, я все еще новичок, когда дело доходит до службы Apple Push Notification, но я кое-что прочитал в своей документации, и я предполагаю, что может быть что-то в создании вашего локального уведомления, которое вызывает проблему.

Я бы дважды проверял, как вы создаете локальное уведомление с примером Apple, как показано здесь в листинге 2-1, чтобы исключить эту возможность, Поскольку часть кода, который используется для создания локального уведомления, нам не отображается в этом потоке, это затрудняет оценку того, действительно ли инстанцирование вашего локального уведомления является правильным. Это может быть так же просто, как что-то не так с датой огня или чем-то еще в уведомлении, которое не настроено правильно.