【问题标题】:iOS - How can I tell if a Local Notification caused my app to enter foreground?iOS - 如何判断本地通知是否导致我的应用程序进入前台?
【发布时间】:2014-05-25 10:01:23
【问题描述】:

我的应用委托中有代码

    application:didReceiveLocalNotification:

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

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

    applicationWillEnterForeground:

被调用。之后,虽然我的 didReceiveLocalNotification 方法再次被调用,导致 UIAlertView 再次出现。但实际上,当应用程序在后台运行时,用户已经收到了该警报,因此理想情况下我不想再次显示此警报。

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

    application:didFinishLaunchingWithOptions:

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

    UIApplicationLaunchOptionsLocalNotificationKey

要知道本地通知是否导致您的应用启动,但是当您刚刚被与本地通知交互的用户带回前台时,似乎没有这种方法可以找出这一点。

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

    [UIApplication sharedApplication].applicationState

来自我的

    application:didReceiveLocalNotification:

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

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

干杯

【问题讨论】:

标签: ios uilocalnotification background-foreground application-state


【解决方案1】:

Swift 4 解决方案:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 您也可以使用 UIApplicationStateInactive 和 UIApplicationStateActive 来检查通知中心是否打开。只有在应用程序打开并运行时,状态才会处于活动状态,但如果通知中心处于打开状态,则状态将处于非活动状态。
    【解决方案3】:

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

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

    【讨论】:

    • 谢谢。稍后我会试试这个..这一切都在慢慢地但肯定地融合在一起。干杯
    猜你喜欢
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多