iOS - 如何判断本地通知是不是导致我的应用程序进入前台?
Posted
技术标签:
【中文标题】iOS - 如何判断本地通知是不是导致我的应用程序进入前台?【英文标题】: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。
或者有没有更好的解决方案?
干杯
【问题讨论】:
看看这个:***.com/questions/4136333/… 谢谢。我稍后会尝试修复.. 干杯。 对于那些对 Swift 是如何做到这一点感到好奇的人,可以看看这里,captaindanko.blogspot.com.au/2014/12/… 【参考方案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 )
【讨论】:
谢谢。稍后我会试试这个..这一切都在慢慢地但肯定地融合在一起。干杯以上是关于iOS - 如何判断本地通知是不是导致我的应用程序进入前台?的主要内容,如果未能解决你的问题,请参考以下文章