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

Определение того, запускается ли 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 ****************************

4b9b3361

Ответ 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, вы можете отобразить собственное оповещение пользователю.