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

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

In:

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

person bobby grenier    schedule 29.04.2011    source источник
comment
Вы говорите о методе locationManager:didUpdateToLocation:fromLocation:?   -  person Black Frog    schedule 29.04.2011


Ответы (8)


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

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

[[UIApplication sharedApplication] applicationState]
person DavidN    schedule 29.04.2011
comment
Спасибо - и для дополнительной ясности это [[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground. - person podperson; 05.06.2012
comment
Я думаю, что [[UIApplication sharedApplication] applicationState] != UIApplicationStateActive лучше, поскольку UIApplicationStateInactive почти эквивалентен фоновому режиму ... - person JP Illanes; 28.10.2013
comment
Состояния описаны здесь: developer.apple.com/library/ios/documentation/uikit/reference/ - person Dan Rosenstark; 07.04.2014
comment
Я обнаружил, что обратные вызовы перехода не вызываются, если ваше приложение оживлено для целей фоновой выборки. - person Mike Asdf; 07.07.2016

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

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

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

person Aswathy Bose    schedule 05.02.2013
comment
Хороший, полезный ответ. Работал - person Saranjith; 02.11.2017
comment
Из документов: UIApplicationStateInactive - приложение работает на переднем плане, но не получает событий. Это может произойти в результате прерывания или из-за того, что приложение переходит в фоновый режим или из него. - person Andy Weinstein; 07.01.2018

Swift 3

    let state = UIApplication.shared.applicationState
    if state == .background {
        print("App in Background")
    }
person Meet    schedule 24.01.2017
comment
верно ли и обратное? могу я проверить ==. неактивный || == .active, чтобы увидеть, находится ли он на переднем плане (в отличие от открытия в фоновом потоке)? - person roberto tomás; 27.04.2019

Быстрая версия:

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

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

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


- (void)applicationWillResignActive:(UIApplication *)application {
    NSLog(@"app is not actvie now");
}
person klimat    schedule 04.03.2015
comment
Важно отметить, что applicationWillEnterForeground вызывается перед applicationDidBecomeActive. Следовательно, проверка applicationState из applicationWillEnterForeground вернет UIApplicationStateBackground. Это меня немного сбило с толку. Итак, я использовал комбинацию вышеуказанных решений, проверив applicationState из applicationDidBecomeActive вместо (неправильно) проверки applicationState на UIApplicationStateBackground из applicationWillEnterForeground. - person Justin Domnitz; 13.11.2015
comment
У меня было такое же решение, и оно подходит для случаев, когда вам нужна информация о состоянии в другом потоке / очереди. - person naz; 06.10.2017
comment
Похоже, что в iOS 14 ничего не делает, методы за меня не вызываются. - person Supertecnoboff; 15.03.2021
comment
ну я написал пост в 2015 году, наверное тестировал на iOS 8 ... - person klimat; 16.03.2021

быстрый 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
    }
person Shakeel Ahmed    schedule 24.04.2018
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и / или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. - person rollstuhlfahrer; 24.04.2018
comment
так как нет тела пишите для swift 4 помогая для swift 4 народ - person Shakeel Ahmed; 24.04.2018
comment
код проверит ваше состояние, если приложение в фоновом режиме! Предположим, что если вы получаете уведомление в фоновом режиме и хотите выполнить некоторые действия, например, выполнить какое-либо действие, если уведомление получено, когда приложение в фоновом режиме, внутренний код будет выполняться - person Shakeel Ahmed; 25.04.2018

Swift 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
        }
person Raj Kumar    schedule 11.09.2019

Расширение Swift 4.0 для упрощения доступа:

import UIKit

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

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

let myAppIsInBackground = UIApplication.shared.isBackground

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

person CodeBender    schedule 22.06.2018