iOS - 如何判断本地通知是否导致我的应用程序进入前台?

时间:2014-04-11 09:56:56

标签: ios uilocalnotification background-foreground application-state

我的应用代表中有代码

    application:didReceiveLocalNotification:

每当我的应用位于前台时,为该本地通知显示 UIAlertView 的方法。

如果本地通知到达时我的应用程序在后台,则会向用户显示通知,并且可以通过选择启动应用程序。在这种情况下,我的应用程序来到我的App代表

的前台
    applicationWillEnterForeground:

被调用。然后再次调用 didReceiveLocalNotification 方法,导致再次出现 UIAlertView 。但实际上,当应用程序处于后台时,用户已经有了警报,所以理想情况下我不希望再次显示此警报。

我可以看到,如果某个应用由于本地通知而启动,则在

    application:didFinishLaunchingWithOptions:

方法可以检查密钥的启动选项

    UIApplicationLaunchOptionsLocalNotificationKey

知道本地通知是否导致您的应用程序启动,但是当用户与本地通知进行交互而被带回到前台时,似乎没有找到此方法的方法。

检查我的 applicationWillEnterForeground 方法是否最近被调用似乎是一种解决此问题的方法,或者类似于此问题中给出的答案" iOS how to judge application is running foreground or background? "将允许我检查

    [UIApplication sharedApplication].applicationState

来自我的

    application:didReceiveLocalNotification:

方法。希望我们能尽早收到,在这种情况下我的applicationState仍然不会设置为 UIApplicationStateActive

或者有更好的解决方案吗?

干杯

3 个答案:

答案 0 :(得分:6)

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

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

  if(state ==UIApplicationStateBackground ){

    }

}

答案 1 :(得分:0)

我只是想说,我刚刚注意到,检查applicationState的建议答案有一个不好的副作用,它会在通知中心打开并且超出应用程序顶部时停止发生任何事情。就个人而言,我并不希望这会阻止我的警报视图被创建,所以我想出了另一种选择。

基本上我只记录我的应用程序上次启动或预定的日期,然后每当测试我的通知日期时,我将他们的fireDate与appLastStarted日期进行比较,并且仅在我的应用程序发生以后才显示通知。一直在前台。这解决了从通知中打开应用程序的问题,但也允许警报显示应用程序何时处于非活动状态(即通知中心后面)。

我还没有遇到过这种方法的任何问题,虽然我从今天开始只尝试过它,所以它没有经过大量的测试。

只是想我会记录它,除非其他人有类似的要求。

答案 2 :(得分:0)

Swift 4解决方案:

AND course_chapter.course_id = <desired_id>