Определение срабатывания UILocalNotification с приложением на переднем или заднем плане - PullRequest
29 голосов
/ 24 августа 2011

При получении UILocalNotification

  1. Метод application:DidReceiveLocalNotification вызывается, когда приложение находится на переднем плане.
  2. Когда приложение находится в фоновом режиме, оно открывает приложение и затем вызывает application:DidReceiveLocalNotification.

Как я могу определить, какой из этих сценариев происходит? Я хотел бы относиться к ним по-другому.

Если приложение было в фоновом режиме, то пользователь указал, что хочет посмотреть на событие. Так что в application:DidReceiveLocalNotification я не хочу спрашивать их снова, я просто хочу взять их на мероприятие.

Но если приложение находится на переднем плане, когда уведомление запускается и вызывает 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. Но я подумал, что если есть способ проверить, это будет гораздо лучший маршрут.

Спасибо, Марк

РЕДАКТИРОВАТЬ ************* *****************

Спасибо, xuzhe, но это не сработает в этой ситуации. Вот немного больше деталей, которые могут объяснить, почему это не сработает, и, возможно, помочь кому-то ответить на этот вопрос для меня:

UILocalNotification, который я задаю здесь, - это событие, похожее на событие календаря, которое планируется запустить в выбранное пользователем время, поэтому при планировании уведомления у меня не будет представления о том, что будет делать пользователь, когда уведомление пожары. Я использую userInfo уведомления для хранения данных о запланированном событии, но установка значения, такого как inBackground, как предложено, не будет работать.

Я знаю, что это будет одна из двух ситуаций, если пользователь решит, что он хочет "просмотреть" событие. (все это будет предполагать, что приложение находится либо в фоновом режиме, либо на переднем плане и НЕ закрывается).

1 - Если оно срабатывает, когда приложение не используется && приложение находится в фоновом режиме и не закрывается, iOS уведомит пользователя о том, что произошло событие, и предоставит возможность перейти к ответственному приложению (которое принадлежит мне). в этом случае). В этот момент, если пользователь скажет «да, возьмите меня в это классное приложение», он откроет приложение из фона и вызовет приложение: DidReceiveLocalNotification, где я смогу получить все уведомления userInfo.

2 - пользователь случайно оказался в моем приложении, когда происходит запланированное событие. В этот момент приложение: метод DidReceiveLocalNotification вызывается снова, где я могу получить все уведомления userInfo.

Но именно в этот момент я хочу знать, какой из двух сценариев только что произошел 1 или 2.

Надеюсь, эта дополнительная информация о моем использовании UILocalNotification поможет ответить на этот вопрос. Заранее спасибо - оценка

КОНЕЦ РЕДАКТИРОВАНИЯ ****************************

Ответы [ 3 ]

46 голосов
/ 24 августа 2011

Возможно, самый простой способ - это когда ваше приложение находится на переднем плане, не отправляйте 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 {

    }
}
1 голос
/ 26 мая 2013

В didReceiveLocalNotification вы можете проверить состояние приложения:

[UIApplication shareApplication].applicationState

Если оно равно UIApplicationStateInactive, вы знаете, что приложение было в фоновом режиме и пользователь открыл егос уведомлением о локальном уведомлении.

, если это UIApplicationStateActive, вы можете захотеть показать свое собственное предупреждение пользователю.

1 голос
/ 11 января 2013

Это то, что я добавил в тела этих функций ... 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];
}

Теперь два уведомления исчезли (особенно то, которое появляется, когда приложение находится в фоновом режиме, и вы открываете его из уведомления об уведомлении.

...