确定UILocalNotification是否在前台或后台使用app触发

时间:2011-08-24 00:30:12

标签: iphone objective-c ios4 uikit uilocalnotification

收到UILocalNotification

  1. 当应用程序位于Foreground时,将调用方法application:DidReceiveLocalNotification
  2. 当应用程序位于后台时,它会打开应用程序,然后调用application:DidReceiveLocalNotification
  3. 如何确定这些方案中的哪一种正在发生?我想以不同的方式对待他们。

    如果应用程序在后台,则用户表示他们想要查看该事件。所以在application:DidReceiveLocalNotification中,我不想再问他们,我只想带他们参加活动。

    但是,如果通知触发并调用application:DidReceiveLocalNotification时应用程序位于Foreground中,我想询问用户是否要查看该事件。

    本质上我会:

    - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    
    if (appLauncedFromBackground)
      // go to event
    else
      // ask if user wants to view event
    
    }
    

    我曾考虑将bool值写入applicationWillEnterForeground:application内的NSUserDefault,然后在application:DidReceiveLocalNotification内读取并重置它。但我想如果有办法测试,那将是一条更好的路线。

    谢谢,Mark

    编辑 * ** * ** * ** * ** * ** * ** * ** * ** * ** * **

    谢谢xuzhe,但在这种情况下不会起作用。这里有一些细节可以解释为什么它不会起作用,也许可以帮助某人为我解答这个问题:

    我在这里设置的UILocalNotification是一个类似日历事件的事件,计划在用户选择的时间触发,因此在安排通知时我将不知道用户将要做什么时通知触发。我正在使用通知的userInfo来存储有关已调度事件的数据,但是如建议的那样设置像inBackground这样的值将不起作用。

    我知道如果用户决定要“查看”该事件,这将是两种情况之一。 (这一切都将假设应用程序在后台或前台而不是退出)。

    1 - 如果在没有使用应用程序时它会触发&&应用程序在后台并且不退出,iOS将通知用户已发生事件并提供进入负责任应用程序的选项(在本例中为我的)。在这一点上假设用户说“是的把我带到这个很酷的应用程序”,它将从后台打开应用程序并调用应用程序:DidReceiveLocalNotification我可以获得所有通知userInfo。

    2 - 当预定事件发生时,用户碰巧碰巧在我的应用程序中。此时应用程序:再次调用DidReceiveLocalNotification方法,然后我可以获取所有通知userInfo。

    但正是在这一点上,我想知道这两个场景中的哪一个刚刚发生了1或2。

    希望有关我使用UILocalNotification的更多详细信息将有助于回答此问题。提前致谢 - 标记

    结束编辑 * ** * ** * ** * ** * ** * ** * ** * ** * *** < /强>

3 个答案:

答案 0 :(得分:46)

也许最简单的方法是当你的应用程序位于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 {

    }
}

答案 1 :(得分:1)

这是我添加到这些功能的主体...... 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];
}

现在,这两个通知已经消失(特别是当应用程序处于后台并且您从通知警报中打开它时出现的通知。

答案 2 :(得分:1)

didReceiveLocalNotification中,您可以检查应用程序状态:

[UIApplication shareApplication].applicationState

如果它等于UIApplicationStateInactive,您就知道应用程序在后台,并且用户使用本地通知提醒打开了它。

如果是UIApplicationStateActive,您可能希望向用户显示您自己的提醒。