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

Mar*_*ews 30 iphone objective-c uikit ios4 uilocalnotification

收到时 UILocalNotification

  1. application:DidReceiveLocalNotification当应用程序位于Foreground时,将调用此方法.
  2. 当应用程序在后台时,它会打开应用程序然后调用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

}
Run Code Online (Sandbox Code Playgroud)

我曾想过将一个bool值写入一个NSUserDefault里面applicationWillEnterForeground:application,然后在里面读取并重置它application:DidReceiveLocalNotification.但我想如果有办法测试,这将是一个更好的路线.

谢谢,马克

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

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

UILocalNotification,我坐在这里就像是被安排在用户选择的时间安排通知我不知道用户会做时通报火灾,所以当火日历事件的事件.我正在使用通知的userInfo来存储有关已调度事件的数据,但是如建议的那样设置像inBackground这样的值将不起作用.

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

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

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

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

希望这个关于我使用的更多细节UILocalNotification将有助于回答这个问题.提前谢谢 - 马克

结束编辑****************************

xuz*_*zhe 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 {

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我编辑了这个问题以帮助更好地解释.谢谢,@ xuzhe,但这对我不起作用.我没有设置LocalNotification,它是一个UILocalNotification,已经安排在某个日期关闭.因此,我无法确定用户当时将做什么. (2认同)
  • 例如,区分由于来电而导致的背景返回与当前暂停的情况如何?我们是否必须在applicationDidEnterBackground/applicationWillEnterForeground中设置标志,还是有更好的方法? (2认同)