Czy jest jakiś sposób, aby sprawdzić, czy aplikacja na iOS działa w tle?


Odpowiedzi:


285

Delegat aplikacji otrzymuje wywołania zwrotne wskazujące przejścia stanu. Na tej podstawie możesz go śledzić.

Również właściwość applicationState w UIApplication zwraca bieżący stan.

[[UIApplication sharedApplication] applicationState]

64
Dziękujemy - i dla dodatkowej przejrzystości jest to [[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground.
podperson

39
Myślę, że [[UIApplication sharedApplication] applicationState] != UIApplicationStateActivejest lepiej, ponieważ UIApplicationStateInactive jest prawie tak samo jak w tle ...
JP Illanes


2
Odkryłem, że wywołania zwrotne przejścia nie są wywoływane, jeśli twoja aplikacja zostanie uruchomiona do celów pobierania w tle.
Mike Asdf,

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

Może to pomóc w rozwiązaniu problemu.

Zobacz komentarz poniżej - nieaktywny jest dość szczególnym przypadkiem i może oznaczać, że aplikacja jest właśnie uruchamiana na pierwszym planie. To może, ale nie musi, oznaczać „tło” dla ciebie w zależności od twojego celu ...


Ładna, pomocna odpowiedź. Pracował
Saranjith

1
Z dokumentacji: UIApplicationStateInactive - aplikacja działa na pierwszym planie, ale nie odbiera zdarzeń. Może się to zdarzyć w wyniku przerwy lub przejścia aplikacji do lub z tła.
Andy Weinstein

30

Szybki 3

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

czy jest też odwrotnie? czy mogę sprawdzić ==. nieaktywne || ==. aktywne, aby zobaczyć, czy jest na pierwszym planie (w przeciwieństwie do otwierania w wątku w tle)?
roberto tomás 27.04.19

21

Wersja szybka:

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

8

Jeśli wolisz odbierać połączenia zwrotne zamiast „pytać” o stan aplikacji, użyj tych dwóch metod AppDelegate:

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


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

1
Należy zauważyć, że applicationWillEnterForeground jest wywoływany przed applicationDidBecomeActive. Dlatego sprawdzenie applicationState z poziomu applicationWillEnterForeground zwróci UIApplicationStateBackground. To mnie trochę odrzuciło. Użyłem więc kombinacji powyższych rozwiązań, sprawdzając applicationState z poziomu applicationDidBecomeActive zamiast (niepoprawnie) sprawdzając applicationState dla UIApplicationStateBackground z poziomu applicationWillEnterForeground.
Justin Domnitz

Miałem to samo rozwiązanie i jest ono odpowiednie w przypadkach, gdy potrzebujesz informacji o stanie w innym wątku / kolejce.
naz

4

szybki 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
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, dlaczego i / lub jak ten kod odpowiada na pytanie, poprawia jego długoterminową wartość.
rollstuhlfahrer

z powodu braku ciała napisz dla szybkiego 4, pomagając szybkim 4 narodom
Shakeel Ahmed

kod sprawdzi, czy aplikacja działa w tle! Załóżmy, że jeśli otrzymujesz powiadomienie w tle i chcesz zrobić coś takiego, jak wykonać jakąś akcję, jeśli powiadomienie zostanie odebrane, gdy aplikacja w tle wykona wewnętrzny kod
Shakeel Ahmed

3

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
        }

1

Rozszerzenie Swift 4.0, aby ułatwić dostęp do niego:

import UIKit

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

Aby uzyskać dostęp z poziomu aplikacji:

let myAppIsInBackground = UIApplication.shared.isBackground

Jeśli szukasz informacji na temat różnych państw ( active, inactivei background), można znaleźć w dokumentacji firmy Apple tutaj .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.