【问题标题】:Is there any way to check if iOS app is in background?有没有办法检查iOS应用程序是否在后台?
【发布时间】:2011-08-15 16:50:18
【问题描述】:

我想检查应用程序是否在后台运行。

在:

locationManagerDidUpdateLocation {
    if(app is runing in background){
        do this
    }
}

【问题讨论】:

  • 你说的是locationManager:didUpdateToLocation:fromLocation:方法吗?

标签: ios objective-c uiapplicationdelegate application-lifecycle ios-background-mode


【解决方案1】:

应用程序委托获取指示状态转换的回调。您可以根据它进行跟踪。

UIApplication 中的applicationState 属性也返回当前状态。

[[UIApplication sharedApplication] applicationState]

【讨论】:

  • 谢谢——为了更清楚起见,它是 [[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground。
  • 我认为[[UIApplication sharedApplication] applicationState] != UIApplicationStateActive 更好,因为 UIApplicationStateInactive 几乎相当于在后台...
  • 我发现,如果您的应用被激活用于后台获取目的,则不会调用转换回调。
【解决方案2】:
UIApplicationState state = [[UIApplication sharedApplication] applicationState];
if (state == UIApplicationStateBackground || state == UIApplicationStateInactive)
{
   //Do checking here.
}

这可能会帮助您解决问题。

请参阅下面的评论 - 不活动是一种相当特殊的情况,可能意味着应用程序正在启动到前台。根据您的目标,这对您来说可能意味着也可能不意味着“背景”......

【讨论】:

  • 很好,有用的答案。工作过
  • 来自文档:UIApplicationStateInactive - 应用程序在前台运行,但未接收事件。这可能是由于中断或应用正在后台转换或从后台转换的结果。
【解决方案3】:

斯威夫特 3

    let state = UIApplication.shared.applicationState
    if state == .background {
        print("App in Background")
    }

【讨论】:

  • 反之亦然吗?我可以检查 == .inactive || == .active 看看它是否在前台(而不是在后台线程上打开)?
【解决方案4】:

斯威夫特版本:

let state = UIApplication.shared.applicationState
if state == .Background {
    print("App in Background")
}

【讨论】:

    【解决方案5】:

    如果您更喜欢接收回调而不是“询问”应用程序状态,请在您的AppDelegate 中使用这两种方法:

    - (void)applicationDidBecomeActive:(UIApplication *)application {
        NSLog(@"app is actvie now");
    }
    
    
    - (void)applicationWillResignActive:(UIApplication *)application {
        NSLog(@"app is not actvie now");
    }
    

    【讨论】:

    • 需要注意的是 applicationWillEnterForeground 在 applicationDidBecomeActive 之前被调用。因此,从 applicationWillEnterForeground 中检查 applicationState 将返回 UIApplicationStateBackground。这让我有点失望。因此,我通过从 applicationDidBecomeActive 中检查 applicationState 而不是(错误地)从 applicationWillEnterForeground 中检查 UIApplicationStateBackground 的 applicationState 来使用上述解决方案的组合。
    • 我有同样的解决方案,它适用于您需要另一个线程/队列上的状态信息的情况。
    • 在 iOS 14 中似乎没有做任何事情,没有为我调用这些方法。
    • 好吧,我在 2015 年写了这篇文章,可能在 iOS 8 上测试过...
    【解决方案6】:

    斯威夫特 5

    let state = UIApplication.shared.applicationState
        if state == .background {
            print("App in Background")
            //MARK: - if you want to perform come action when app in background this will execute 
            //Handel you code here
        }
        else if state == .foreground{
            //MARK: - if you want to perform come action when app in foreground this will execute 
            //Handel you code here
        }
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    • 因为没有为 swift 4 编写正文,帮助 swift 4 人民
    • 代码会检查你的应用是否在后台!假设如果您在后台收到通知,并且您想做一些事情,例如当应用程序在后台执行内部代码时收到通知时执行一些操作
    【解决方案7】:

    斯威夫特 4+

    let appstate = UIApplication.shared.applicationState
            switch appstate {
            case .active:
                print("the app is in active state")
            case .background:
                print("the app is in background state")
            case .inactive:
                print("the app is in inactive state")
            default:
                print("the default state")
                break
            }
    

    【讨论】:

      【解决方案8】:

      一个 Swift 4.0 扩展,使其更容易访问:

      import UIKit
      
      extension UIApplication {
          var isBackground: Bool {
              return UIApplication.shared.applicationState == .background
          }
      }
      

      从您的应用程序中访问:

      let myAppIsInBackground = UIApplication.shared.isBackground
      

      如果您正在寻找有关各个州的信息(activeinactivebackground),您可以找到 Apple documentation here

      【讨论】:

        猜你喜欢
        • 2017-12-18
        • 2021-12-21
        • 2012-06-03
        • 2023-03-04
        • 2020-11-25
        • 2011-02-12
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        相关资源
        最近更新 更多