iOS – 如何知道本地通知是否导致我的应用程序进入前景?

我有我的应用程序委托的代码

application:didReceiveLocalNotification: 

方法来显示一个UIAlertView的本地通知,每当我的应用程序在前台。

如果我的应用程序在本地通知到达后的背景中,则用户会看到通知,并可以通过select该应用程序来启动应用程序。 在这种情况下,我的应用程序来到我的应用程序委托的前台

  applicationWillEnterForeground: 

叫做。 之后,虽然我的didReceiveLocalNotification方法再次被调用,导致一个UIAlertView再次出现。 但实际上用户已经有了这个警报,而应用程序在后台,所以理想情况下,我不想再次显示此警报。

我可以看到,如果一个应用程序是由于本地通知,然后在内部启动

  application:didFinishLaunchingWithOptions: 

方法可以检查一个键的启动选项

  UIApplicationLaunchOptionsLocalNotificationKey 

要知道本地通知是否导致您的应用程序启动,但似乎没有这样的方法,当您通过与本地通知进行交互的用户刚回到前台时,找不到这种方法。

检查我的applicationWillEnterForeground方法是否最近被调用似乎是一个hacky方式解决这个问题,或者可能类似于这个问题的答案“ iOS如何判断应用程序正在运行的前景或背景? ”将允许我检查

  [UIApplication sharedApplication].applicationState 

从我的内部

  application:didReceiveLocalNotification: 

方法。 希望它会被收到足够早,我的applicationState仍然不会被设置为UIApplicationStateActive在这种情况下。

或者有没有更好的解决scheme呢?

干杯

在AppDelegate中,您可以在应用程序收到通知时检查应用程序的状态

 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { UIApplicationState state = [application applicationState]; // check state here if(state ==UIApplicationStateBackground ){ } } 

只是想说,我只是注意到检查applicationState的build议答案有一个坏的副作用,它会阻止任何事情发生,而通知中心是开放的,并在您的应用程序的顶部。 就我个人而言,我不想阻止我创build的警报视图,所以我想出了一个替代scheme。

基本上我只logging了我的应用程序上次启动或预测的date,然后每当testing我的通知date时,我将它们的fireDate与appLastStarteddate进行比较,如果自从我的应用程序处于前台,则只会显示通知。 这可以解决从通知中打开应用程序的问题,还可以在应用程序未处于活动状态(即通知中心后面)时显示警报。

我还没有遇到这种方法的任何问题,虽然承认我只是从今天开始尝试,所以没有进行大量的testing。

只是以为我会logging下来,除非有其他人有类似的要求。