【发布时间】:2012-01-07 15:18:07
【问题描述】:
众所周知,如果 iOS 应用在前台运行,那么当删除通知到来时,该应用不会通知用户。现在在我的应用程序中,我想显示警报以通知用户远程通知来了。如何判断app是运行在前台还是后台?我找到了文档并搜索了 stackoverflow.com,但没有找到任何相关信息。 谢谢。
【问题讨论】:
-
抱歉我的拼写错误。
标签: ios foreground
众所周知,如果 iOS 应用在前台运行,那么当删除通知到来时,该应用不会通知用户。现在在我的应用程序中,我想显示警报以通知用户远程通知来了。如何判断app是运行在前台还是后台?我找到了文档并搜索了 stackoverflow.com,但没有找到任何相关信息。 谢谢。
【问题讨论】:
标签: ios foreground
[UIApplication sharedApplication].applicationState 将返回当前状态,检查可能的值,并且在您可以使用系统功能时不要创建不必要的标志。
您可能需要考虑的值:
例如
+(BOOL) runningInBackground
{
UIApplicationState state = [UIApplication sharedApplication].applicationState;
return state == UIApplicationStateBackground;
}
+(BOOL) runningInForeground
{
UIApplicationState state = [UIApplication sharedApplication].applicationState;
return state == UIApplicationStateActive;
}
【讨论】:
在某些情况下检查状态不起作用。
这是我遇到的一个问题:如果您尝试使用 BT 并且它被禁用,iOS 会弹出一个对话框询问用户是否要打开 BT。发生这种情况时,应用程序状态不是确定您的应用程序是否在前台的可靠方法。
首先,您将收到两个 applicationDidBecomeActive 事件 - 一个(正确)在应用出现时,然后另一个(错误)在用户按下对话框中的按钮后(而 iOS 设置是最前面的应用) .
UIApplication.applicationState 会说“活动”,即使情况并非如此(至少如果您将“活动”解释为在前台,就像原来的问题一样)。
由于您在首次启动时没有得到 willEnterForeground,因此检测应用程序是否可见的唯一可靠方法(据我所知)是设置一个标志,然后将其设置为 true在:
applicationDidFinishLaunching
applicationWillEnterForeground
假的:
applicationDidEnterBackground
applicationWillResignActive
【讨论】:
applicationDidFinishLaunching,你会假设它在前台(因为你不会得到applicationWillEnterForeground),但实际上它是在后台,正如applicationState 正确说明的那样。所以 Pavel Oganesyan 是对的,但是您需要同时检查 UIApplicationStateActive 和 UIApplicationStateInactive 状态以了解正确的前台状态。