我的应用程序代理的中有代码
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()
}