iOS - Как я могу узнать, вызвало ли локальное уведомление мое приложение для выхода на передний план?
У меня есть код в делегате моего приложения
application:didReceiveLocalNotification:
метод для отображения UIAlertView для этого локального уведомления, когда мое приложение находится на переднем плане.
Если мое приложение находится в фоновом режиме, когда приходит локальное уведомление, пользователь получает уведомление с уведомлением и может запустить приложение, выбрав его. В этом случае мое приложение выходит на передний план моего приложения делегата
applicationWillEnterForeground:
называется. Впоследствии, хотя мой метод didReceiveLocalNotification вызывается снова, вызывается повторное появление UIAlertView. Но на самом деле, у пользователя уже было это предупреждение, пока приложение находилось в фоновом режиме, поэтому в идеале я бы не хотел снова отображать это предупреждение.
Я вижу, что если приложение запускается из-за локального уведомления, то внутри
application:didFinishLaunchingWithOptions:
Метод, который вы можете проверить параметры запуска для ключа
UIApplicationLaunchOptionsLocalNotificationKey
чтобы узнать, вызвало ли ваше локальное уведомление запуск вашего приложения, но, похоже, не существует такого способа выяснить это, когда вы просто возвращаетесь на передний план пользователем, взаимодействующим с локальным уведомлением.
Проверка того, был ли недавно вызван мой метод applicationWillEnterForeground, может показаться хакерским способом обойти эту проблему, или, возможно, что-то похожее на ответы, приведенные в этом вопросе " iOS, как судить, приложение работает на переднем или на заднем плане?", Позволит мне проверить
[UIApplication sharedApplication].applicationState
изнутри моего
application:didReceiveLocalNotification:
метод. Надеюсь, он будет получен достаточно рано, чтобы в этом случае мой applicationState все равно не был установлен в UIApplicationStateActive.
Или есть лучшие решения для этого?
ура
3 ответа
В AppDelegate вы можете проверить состояние приложения, когда приложение получает уведомление
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
UIApplicationState state = [application applicationState];
// check state here
if(state ==UIApplicationStateBackground ){
}
}
Просто хотел сказать, что я только что заметил, что предлагаемый ответ проверки на applicationState имеет некоторый плохой побочный эффект, что он остановит все, что происходит, пока центр уведомлений открыт и находится поверх вашего приложения. Лично я не хотел, чтобы это мешало созданию моих предупреждений, поэтому я предложил альтернативу.
По сути, я просто записываю дату, когда мое приложение было в последний раз запущено или предварительно установлено, а затем, когда проверяю даты моего уведомления, я сравниваю их fireDate с датой appLastStarted и отображаю уведомление только в том случае, если оно произошло, поскольку мое приложение находилось на переднем плане. Это устраняет проблему с открытием приложения из уведомления, но также позволяет оповещениям показывать, когда приложение не активно (т. Е. За центром уведомлений).
Мне еще не приходилось сталкиваться с какими-либо проблемами с этим подходом, хотя, по общему признанию, я пробовал его только с сегодняшнего дня, поэтому у него не было много испытаний.
Просто думал, что запишу это, если у кого-то еще не было подобных требований.
Решение Swift 4:
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
{
if UIApplication.shared.applicationState == .background {
//enter code here
}
completionHandler()
}