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



我的应用程序代理的中有代码

    application:didReceiveLocalNotification:

方法显示本地通知的UIAlertView,无论何时我的应用程序在前台。

如果本地通知到达时我的应用程序在后台,则用户会收到通知,并可以通过选择它来启动应用程序。在这种情况下,我的应用会出现在前台,我的app Delegate的

    applicationWillEnterForeground:

被调用。之后,尽管再次调用了我的didReceiveLocalNotification方法,导致再次出现UIAlertView。但实际上,当应用程序处于后台时,用户已经收到了该警报,所以理想情况下,我不想再次显示该警报。

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

    application:didFinishLaunchingWithOptions:

方法,您可以检查关键的启动选项

    UIApplicationLaunchOptionsLocalNotificationKey

了解本地通知是否导致您的应用程序启动,但当用户与本地通知交互时,似乎没有这样的方法可以发现这一点。

检查我的应用程序WillEnterForeground方法最近是否被调用似乎是解决这个问题的一种方法,或者可能类似于这个问题中给出的答案"iOS如何判断应用程序正在前台或后台运行?"将允许我检查

    [UIApplication sharedApplication].applicationState

来自我的

    application:didReceiveLocalNotification:

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

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

干杯

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

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

我只是想说,我刚刚注意到在应用程序上检查的建议答案State有一点坏的副作用,即当通知中心打开并在应用程序顶部时,它会阻止任何事情的发生。就我个人而言,我不希望这阻止我的警报视图的创建,所以我想出了一个替代方案。

基本上,我只记录我的应用程序上次启动或前景的日期,然后每当测试我的通知日期时,我都会将它们的fireDate与appLastStarted日期进行比较,只有在我的应用处于前景后才显示通知。这解决了从通知中打开应用程序的问题,但也允许在应用程序不活动时显示警报(即在通知中心后面)。

我还没有遇到这种方法的任何问题,尽管无可否认,我只是从今天开始尝试它,所以它没有经过大量的测试。

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

Swift 4解决方案:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
{
   if UIApplication.shared.applicationState == .background {
   //enter code here
   }
completionHandler()
}

相关内容

  • 没有找到相关文章

最新更新