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

3

我在我的应用程序代理中有一些代码

    application:didReceiveLocalNotification:

当我的应用程序在前台运行时,显示本地通知的方法是使用UIAlertView。如果我的应用程序在后台运行时收到本地通知,则用户将收到通知并可以通过选择它来启动应用程序。在这种情况下,我的应用程序将进入前台,并调用App Delegate。

    applicationWillEnterForeground:

这被称为“本地通知”。然后,我的 didReceiveLocalNotification 方法再次被调用,导致 UIAlertView 再次出现。但实际上,当应用程序在后台时,用户已经收到了该警报,因此最好不要再次显示此警报。

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

    application:didFinishLaunchingWithOptions:

使用该方法可以检查键的启动选项

    UIApplicationLaunchOptionsLocalNotificationKey

要知道本地通知是否导致了应用程序的启动,但当您只是通过与本地通知交互而被带回前台时,似乎没有找到这样的方法来查找它。检查我的applicationWillEnterForeground方法是否最近被调用似乎是解决这个问题的一个hacky方法,或者可能类似于在这个问题 "iOS如何判断应用程序在前台还是后台运行?"中给出的答案将允许我检查。
    [UIApplication sharedApplication].applicationState

在我的内部

    application:didReceiveLocalNotification:

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

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

干杯


请查看这个链接:https://dev59.com/y2855IYBdhLWcg3wz3vo - pankaj asudani
谢谢。我稍后会尝试修复。干杯。 - jimbobuk
3个回答

6

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

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

  if(state ==UIApplicationStateBackground ){

    }

}

谢谢。我稍后会尝试这个...一切正在慢慢地走向完美。祝好! - jimbobuk

0

Swift 4 解决方案:

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

0

我想说一下,我刚刚注意到建议检查applicationState的答案有一个不好的副作用,即当通知中心打开并覆盖您的应用程序时,它会停止任何操作。就个人而言,我不希望这会阻止我的警报视图被创建,因此我想出了一种替代方法。

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

我还没有遇到使用这种方法的任何问题,尽管我承认我今天才开始尝试,所以它没有经过太多的测试。

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


你也可以使用UIApplicationStateInactive和UIApplicationStateActive来检查通知中心是否打开。只有当应用程序正在运行时,状态才会处于活动状态,但如果通知中心打开,则状态将为非活动状态。 - plouh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接