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]
DavidN
źródło
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
6
Stany są określone tutaj: developer.apple.com/library/ios/documentation/uikit/reference/…
Dan Rosenstark
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 ...

Aswathy Bose
źródło
Ł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")
    }
Spotykać się
źródło
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")
}
ioopl
źródło
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");
}
klimat
źródło
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
    }
Shakeel Ahmed
źródło
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
        }
Raj Kumar
źródło
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 .

CodeBender
źródło