3

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

    application:didReceiveLocalNotification:

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

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

    applicationWillEnterForeground:

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

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

    application:didFinishLaunchingWithOptions:

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

    UIApplicationLaunchOptionsLocalNotificationKey

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

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

    [UIApplication sharedApplication].applicationState

从我的内部

    application:didReceiveLocalNotification:

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

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

干杯

4

3 回答 3

6

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

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

  if(state ==UIApplicationStateBackground ){

    }

}
于 2014-04-11T10:07:39.713 回答
0

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

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

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

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

于 2014-09-30T21:17:16.110 回答
0

斯威夫特 4 解决方案:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
{
   if UIApplication.shared.applicationState == .background {
   //enter code here
   }
completionHandler()
}
于 2018-06-22T07:00:18.167 回答