我的代码在我的程序委托的

    application:didReceiveLocalNotification:

方法,以显示一个 UIAlertView 对,当地的通知,每当我的程序是在前景。

如果我的程序是内的背景当局通知到达的用户得到提交的通知并能够启动的程序通过选择它。在这种情况下我的应用程序来的前景,我的应用程序委托的

    applicationWillEnterForeground:

被称为。之后,虽然我 didReceiveLocalNotification 方法是再次呼吁,引起一个 UIAlertView 来再次出现。但是,真正的用户已经有这样的警告,而该应用程序的背景,所以理想的是我想不显示该警报。

我可以看到,如果应用程序启动时由于当地的通知,然后在

    application:didFinishLaunchingWithOptions:

方法可以检测推出选择的一个关键

    UIApplicationLaunchOptionsLocalNotificationKey

知道是否或者不当地通知引起你的应用程序的启动,但似乎没有这样的方法为发现这个的时候,你只是带回前景的用户相互作用,与当地的通知。

检查是否或者不是我的 applicationWillEnterForeground 方法已经被称为最近似乎是一个哈克的方式,围绕这一问题,或者类似的东西来给出的答案在这个问题"iOS如何判断应用程序正在运行的前景或背景吗?"将允许我检查

    [UIApplication sharedApplication].applicationState

从我的

    application:didReceiveLocalNotification:

法。我们希望它将收到足够早的,我applicationState会仍然没有被设定为 UIApplicationStateActive 在这种情况。

或是否有任何更好地解决这个吗?

欢呼

有帮助吗?

解决方案

在如,你可以检查状态应用程序时,应用程序收到的通知

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

  if(state ==UIApplicationStateBackground ){

    }

}

其他提示

只想说,我只是注意到该建议的答复的检查applicationState有一点点的不良副作用,它将停止任何事情发生,同时通知中心,是开放和顶部的应用程序。我个人不想让这停止,我的提醒景正在创建的,因此我想到了一种替代方法。

基本上我只是记录的该日期时,我的应用程序最后启动或景化,然后每次测试我的通知的日期我比较它们的fireDate与appLastStarted日期和只显示的通知如果它发生了因为我的应用程序已经在前景。这个修正的问题在开放的应用程序从一个通知,但也允许警报显示,当应用程序不是活动(ie。后面通知中心)。

我还没有遇到任何问题,这种做法,但无可否认,我只是想它从今天起,所以它没有大量的测试。

只是以为我会记录,除非其他任何人也有类似的要求。

Swift4解决方案:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
{
   if UIApplication.shared.applicationState == .background {
   //enter code here
   }
completionHandler()
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top