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

jim*_*buk 3 application-state background-foreground ios uilocalnotification

我的应用代表中有代码

    application:didReceiveLocalNotification:
Run Code Online (Sandbox Code Playgroud)

每当我的应用程序在前台时,显示该本地通知的UIAlertView的方法.

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

    applicationWillEnterForeground:
Run Code Online (Sandbox Code Playgroud)

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

我可以看到,如果一个应用程序是由于本地通知而启动的话

    application:didFinishLaunchingWithOptions:
Run Code Online (Sandbox Code Playgroud)

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

    UIApplicationLaunchOptionsLocalNotificationKey
Run Code Online (Sandbox Code Playgroud)

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

检查我的applicationWillEnterForeground方法是否最近被调用似乎是一个讨厌这个问题的方法,或者类似于这个问题中给出的答案" iOS如何判断应用程序是运行前景还是后台? "将允许我检查

    [UIApplication sharedApplication].applicationState
Run Code Online (Sandbox Code Playgroud)

从我的内心

    application:didReceiveLocalNotification:
Run Code Online (Sandbox Code Playgroud)

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

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

干杯

Muh*_*nan 6

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

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

  if(state ==UIApplicationStateBackground ){

    }

}
Run Code Online (Sandbox Code Playgroud)