iOS如何判断应用程序是在前台还是后台运行?

28

众所周知,如果iOS应用程序在前台运行,则当收到移除通知时,应用程序不会通知用户。现在,在我的应用程序中,我想显示警报以通知用户远程通知已到达。如何判断应用程序是在前台还是后台运行?我已经找到了文档并搜索了stackoverflow.com,但没有找到有关这方面的任何信息。 谢谢。


抱歉我的拼写错误。 - Smeegol
2个回答

78

[UIApplication sharedApplication].applicationState会返回当前状态,请检查可能的值,并在可以使用系统功能时不要创建不必要的标志。

您可能需要考虑的值:

  • UIApplicationStateActive
  • UIApplicationStateInactive
  • UIApplicationStateBackground

例如:

+(BOOL) runningInBackground
{
    UIApplicationState state = [UIApplication sharedApplication].applicationState;
    return state == UIApplicationStateBackground;
}

+(BOOL) runningInForeground
{
    UIApplicationState state = [UIApplication sharedApplication].applicationState;
    return state == UIApplicationStateActive;
}

太棒了,你的回答非常好! - Smeegol
不知道那个属性 - 很方便! - Nick Lockwood
2
可能的值包括:UIApplicationStateActiveUIApplicationStateInactiveUIApplicationStateBackground - Thomas C. G. de Vilhena
并且,UIApplicationStateActive - Brad Parks

6
有时候检查状态不起作用。我碰到了这样一个情况:如果您尝试使用BT并且它被禁用,iOS将弹出一个对话框,询问用户是否要打开BT。当发生这种情况时,应用程序状态不是确定您的应用程序是否在前台的可靠方法。
首先,您将获得两个applicationDidBecomeActive事件——一个(正确地)在应用程序出现时,然后另一个(错误地)在用户按下对话框中的按钮时(而iOS设置是最前面的应用程序)。
UIApplication.applicationState将说“Active”,即使这不是事实(至少如果您将“active”解释为在前台,就像原来的问题一样)。
由于您在第一次启动时不会收到willEnterForeground,因此检测应用程序是否可见的唯一可靠方法(据我所知)就是拥有一个标志,然后在以下位置将其设置为true:
applicationDidFinishLaunching
applicationWillEnterForeground

在以下情况下为false:

applicationDidEnterBackground
applicationWillResignActive 

感谢您的回答NJ,自您发布此问题以来,您认为这仍然是可靠的吗? - Bradley Thomas
1
是的,我不知道有任何它不能工作的情况。 - N.J.
2
如果您有VoIP应用程序,则此方法将无法正常工作。在设备启动时,它会自动启动,您只会收到applicationDidFinishLaunching,并且会认为它在前台运行(因为您不会收到applicationWillEnterForeground),但实际上根据applicationState的正确状态,它是在后台运行的。所以Pavel Oganesyan是正确的,但您需要检查UIApplicationStateActiveUIApplicationStateInactive状态以获取正确的前台状态。 - Shebuka
关于VoIP应用程序的正确性,可惜的是,似乎没有可靠的方法来确定前台状态... - Ethan Long

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