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

Ответы:

285

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

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

[[UIApplication sharedApplication] applicationState]
DavidN
источник
64
Спасибо - и для дополнительной ясности это [[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground.
podperson
39
Я думаю, что [[UIApplication sharedApplication] applicationState] != UIApplicationStateActiveлучше, так как UIApplicationStateInactive почти эквивалентен фоновому изображению ...
JP Illanes
6
Состояния прописаны здесь: developer.apple.com/library/ios/documentation/uikit/reference/…
Дэн Розенстарк,
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")
}
ioopl
источник
8

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

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


- (void)applicationWillResignActive:(UIApplication *)application {
    NSLog(@"app is not actvie now");
}
Klimat
источник
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 здесь .

CodeBender
источник