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

谢小进*_*谢小进 27 foreground ios

众所周知,如果iOS应用程序正在运行前台,那么应用程序将不会在删除通知到来时通知用户.现在在我的应用程序中,我想显示警告以通知用户远程通知到来.如何判断应用程序是运行前台还是后台?我找到了docs并搜索了stackoverflow.com,却找不到任何相关内容.谢谢.

Pav*_*yan 73

[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;
}
Run Code Online (Sandbox Code Playgroud)

  • 可能的值有:**UIApplicationStateActive**,**UIApplicationStateInactive**或**UIApplicationStateBackground**. (2认同)

N.J*_*.J. 5

有些情况下检查状态不起作用.

这是我遇到的一个问题:如果你试图使用BT并且它被禁用,iOS会弹出一个对话框,询问用户是否想要打开BT.发生这种情况时,应用程序状态不是确定您的应用程序是否位于前台的可靠方法.

首先,您将获得两个applicationDidBecomeActive事件 - 一个(正确)当应用程序出现时,然后另一个(不正确)用户按下对话框中的按钮(而iOS设置是最前面的应用程序).

即使不是这种情况,UIApplication.applicationState也会说"Active"(至少如果你将"active"解释为在前台,就像原始问题一样).

由于你没有在第一次启动时获得willEnterForeground,检测应用程序是否可见的唯一可靠方法(据我能够弄清楚)是有一个标志,然后将其设置为true:

applicationDidFinishLaunching
applicationWillEnterForeground
Run Code Online (Sandbox Code Playgroud)

和错误:

applicationDidEnterBackground
applicationWillResignActive 
Run Code Online (Sandbox Code Playgroud)

  • 如果你有一个VoIP应用程序,这将无法正常工作.在设备启动时,它会自动启动,你只能得到`applicationDidFinishLaunching`,你会认为它在Foreground中(因为你不会得到`applicationWillEnterForeground`),但实际上它是在`applicationState`中正确描述的背景中.所以Pavel Oganesyan是对的,但你需要检查'UIApplicationStateActive`和`UIApplicationStateInactive`状态以获得正确的Foreground状态. (2认同)