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;
}
Спасибо всем за вашу помощь!!!!
Ответы
Ответ 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, чтобы исключить эту возможность, Поскольку часть кода, который используется для создания локального уведомления, нам не отображается в этом потоке, это затрудняет оценку того, действительно ли инстанцирование вашего локального уведомления является правильным. Это может быть так же просто, как что-то не так с датой огня или чем-то еще в уведомлении, которое не настроено правильно.