Есть ли способ проверить, находится ли приложение iOS в фоновом режиме?


186

Я хочу проверить, работает ли приложение в фоновом режиме.

В:

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

Вы говорите о locationManager:didUpdateToLocation:fromLocation:методе?
Черная лягушка

Ответы:


285

Делегат приложения получает обратные вызовы, указывающие переходы состояний. Вы можете отслеживать это на основе этого.

Также свойство applicationState в UIApplication возвращает текущее состояние.

[[UIApplication sharedApplication] applicationState]

64
Спасибо - и для дополнительной ясности это [[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground.
podperson

39
Я думаю, что [[UIApplication sharedApplication] applicationState] != UIApplicationStateActiveлучше, так как UIApplicationStateInactive почти эквивалентен фоновому изображению ...
JP Illanes


2
Я обнаружил, что обратные вызовы перехода не вызываются, если ваше приложение используется для фоновой выборки.
Майк Асдф

176
UIApplicationState state = [[UIApplication sharedApplication] applicationState];
if (state == UIApplicationStateBackground || state == UIApplicationStateInactive)
{
   //Do checking here.
}

Это может помочь вам в решении вашей проблемы.

См. Комментарий ниже - неактивный является довольно частным случаем и может означать, что приложение находится в процессе запуска на передний план. Это может или не может означать «фон» для вас в зависимости от вашей цели ...


Хороший, полезный ответ. Работал
Саранджит

1
Из документов: UIApplicationStateInactive - приложение работает на переднем плане, но не получает события. Это может произойти в результате прерывания или из-за перехода приложения в фоновый режим.
Энди Вайнштейн

30

Swift 3

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

верно ли обратное? можно проверить == .inactive || == .active, чтобы увидеть, находится ли он на переднем плане (в отличие от открытия в фоновом потоке)?
Роберто Томас

21

Swift версия:

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

8

Если вы предпочитаете получать обратные вызовы вместо «спрашивать» о состоянии приложения, используйте эти два метода в вашем AppDelegate:

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


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

1
Важно отметить, что applicationWillEnterForeground вызывается перед applicationDidBecomeActive. Поэтому проверка applicationState из applicationWillEnterForeground вернет UIApplicationStateBackground. Это немного сбило меня с толку. Итак, я использовал комбинацию вышеупомянутых решений, проверив applicationState из applicationDidBecomeActive вместо (неправильно) проверки applicationState для UIApplicationStateBackground из applicationWillEnterForeground.
Джастин Домниц

1
У меня было такое же решение, и оно подходит для случаев, когда вам нужна информация о состоянии в другом потоке / очереди.
НАЗ

4

Свифт 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
    }

1
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, повышает его долгосрочную ценность.
rollstuhlfahrer

из-за отсутствия тела пиши для swift 4, помогая для swift 4 народов
Shakeel Ahmed

код проверит ваше состояние, если приложение в фоновом режиме! Предположим, если вы получаете уведомление в фоновом режиме и хотите выполнить какие-то действия, например, выполнить какое-либо действие, если уведомление получено, когда приложение в фоновом режиме выполнит внутренний код
Shakeel Ahmed

3

Свифт 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
        }

1

Расширение Swift 4.0 для облегчения доступа к нему:

import UIKit

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

Чтобы получить доступ из вашего приложения:

let myAppIsInBackground = UIApplication.shared.isBackground

Если вы ищете информацию о различных состояниях ( active, inactiveи background), можно найти в документации компании Apple здесь .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.