Определение того, запускается ли UILocalNotification с помощью приложения на переднем плане или в фоновом режиме
При приеме UILocalNotification
- Метод
application:DidReceiveLocalNotification
вызывается, когда приложение находится в Foreground.
- Когда приложение находится в фоновом режиме, оно открывает приложение, а затем вызывает
application:DidReceiveLocalNotification
.
Как определить, какой из этих сценариев имеет место? Я хотел бы относиться к ним по-другому.
Если приложение было в фоновом режиме, пользователь указал, что хочет посмотреть событие. Поэтому в application:DidReceiveLocalNotification
я не хочу снова спрашивать их, я просто хочу принять их на мероприятие.
Но если приложение находится в Foreground, когда уведомление срабатывает и вызывает application:DidReceiveLocalNotification
, я хочу спросить пользователя, хотят ли они просмотреть событие.
В сущности я бы:
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
if (appLauncedFromBackground)
// go to event
else
// ask if user wants to view event
}
Я подумывал написать значение bool для NSUserDefault внутри applicationWillEnterForeground:application
, а затем прочитать и перезагрузить его внутри application:DidReceiveLocalNotification
. Но я думал, что если бы был способ проверить, это был бы намного лучший маршрут.
Спасибо, Марк
EDIT ******************************
Спасибо xuzhe, но это не сработает в этой ситуации. Вот несколько подробностей, которые могут объяснить, почему это не работает и может помочь кому-то в ответе на это для меня:
UILocalNotification
, который я устанавливаю здесь, - это событие, подобное событию календаря, которое планируется запустить в выбранное пользователем время, поэтому при планировании уведомления я не буду знать, что пользователь будет делать, когда уведомление пожары. Я использую userInfo уведомления для хранения данных о запланированном событии, но устанавливая значение, подобное inBackground, как предполагалось, не работает.
Я знаю, что это будет одна из двух ситуаций, если пользователь решит, что хочет "просмотреть" событие. (это все предположит, что приложение находится либо в фоновом режиме, либо переднем плане и НЕ уходит).
1 - если он срабатывает, когда приложение не используется && & приложение находится в фоновом режиме и не перестает работать, iOS уведомит пользователя о том, что произошло событие, и предоставит возможность перейти к ответственному приложению (которое в этом случае принадлежит мне). В этот момент, предполагая, что пользователь говорит "да, возьмите меня в это классное приложение", он откроет приложение из фона и вызовет приложение: DidReceiveLocalNotification, где я могу получить все уведомления userInfo.
2 - Пользователь случайно попадает в мое приложение, когда происходит запланированное событие. В этот момент снова применяется приложение: метод DidReceiveLocalNotification, где я могу получить все уведомления userInfo.
Но именно в этот момент я хочу знать, какой из двух сценариев произошел только 1 или 2.
Надеюсь, что эта дополнительная информация о моем использовании UILocalNotification
поможет ответить на этот вопрос. Спасибо заранее - отметьте
END EDIT ****************************
Ответы
Ответ 1
Возможно, самый простой способ - когда ваше приложение находится в Foreground, не отправляйте LocalNotification, а просто отправляйте своих пользователей на мероприятие.
Но если вы настаиваете на том, чтобы делать это с помощью LocalNotification, вот простой способ определить, что ваш статус приложения при запуске 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 {
}
}
Ответ 2
Это то, что я добавил в тела этих функций...
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];
}
В applicationDidEnterBackground
:
NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults];
[userDefaults setBool:YES forKey:@"deactivate in-app notification"];
[userDefaults synchronize];
В 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];
}
Теперь два уведомления исчезли (особенно тот, который появляется, когда приложение находится в фоновом режиме, и вы открываете его из предупреждения уведомления.
Ответ 3
В didReceiveLocalNotification
вы можете проверить состояние приложения:
[UIApplication shareApplication].applicationState
Если он равен UIApplicationStateInactive
, вы знаете, что приложение было в фоновом режиме, и пользователь открыл его с уведомлением о локальном уведомлении.
если он UIApplicationStateActive
, вы можете отобразить собственное оповещение пользователю.