Existe alguma maneira de verificar se o aplicativo iOS está em segundo plano?

186

Quero verificar se o aplicativo está sendo executado em segundo plano.

No:

locationManagerDidUpdateLocation {
    if(app is runing in background){
        do this
    }
}
bobby grenier
fonte
Você está falando sobre o locationManager:didUpdateToLocation:fromLocation:método?
Black Frog

Respostas:

285

O delegado do aplicativo recebe retornos de chamada indicando transições de estado. Você pode rastreá-lo com base nisso.

Além disso, a propriedade applicationState em UIApplication retorna o estado atual.

[[UIApplication sharedApplication] applicationState]
DavidN
fonte
64
Obrigado - e, para maior clareza, é [[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground.
precisa saber é
39
Eu acho que [[UIApplication sharedApplication] applicationState] != UIApplicationStateActiveé melhor, como UIApplicationStateInactive é quase equivalente a estar em plano ...
JP Illanes
6
Os estados estão descritos aqui: developer.apple.com/library/ios/documentation/uikit/reference/…
Dan Rosenstark
2
Descobri que os retornos de chamada de transição não são chamados se seu aplicativo é criado para fins de busca em segundo plano.
Mike Asdf
176
UIApplicationState state = [[UIApplication sharedApplication] applicationState];
if (state == UIApplicationStateBackground || state == UIApplicationStateInactive)
{
   //Do checking here.
}

Isso pode ajudá-lo a resolver seu problema.

Veja o comentário abaixo - inativo é um caso bastante especial e pode significar que o aplicativo está em processo de lançamento em primeiro plano. Isso pode ou não significar "pano de fundo" para você, dependendo do seu objetivo ...

Aswathy Bose
fonte
Resposta agradável e útil. Trabalhou
Saranjith 2/11
1
Dos documentos: UIApplicationStateInactive - o aplicativo está sendo executado em primeiro plano, mas não está recebendo eventos. Isso pode acontecer como resultado de uma interrupção ou porque o aplicativo está em transição para ou de segundo plano.
Andy Weinstein
30

Swift 3

    let state = UIApplication.shared.applicationState
    if state == .background {
        print("App in Background")
    }
Conheçer
fonte
o inverso também é verdadeiro? posso verificar == .inactive || == .active para ver se está em primeiro plano (em vez de abrir no thread de segundo plano)?
roberto tomás
21

Versão rápida:

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

Se você preferir receber retornos de chamada em vez de "perguntar" sobre o estado do aplicativo, use estes dois métodos em AppDelegate:

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


- (void)applicationWillResignActive:(UIApplication *)application {
    NSLog(@"app is not actvie now");
}
Klimat
fonte
1
É importante observar que applicationWillEnterForeground é chamado antes de applicationDidBecomeActive. Portanto, verificar applicationState de dentro de applicationWillEnterForeground retornará UIApplicationStateBackground. Isso me assustou um pouco. Portanto, usei uma combinação das soluções acima verificando applicationState de applicationDidBecomeActive em vez de (incorretamente) verificando applicationState para UIApplicationStateBackground de applicationWillEnterForeground.
11136 Justin Domnitz #
1
Eu tinha essa mesma solução e é adequada para casos em que você precisa das informações de estado em outro thread / fila.
naz
4

veloz 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
fonte
1
Embora esse código possa responder à pergunta, fornecer um contexto adicional a respeito de por que e / ou como esse código responde à pergunta melhora seu valor a longo prazo.
precisa saber é o seguinte
por causa de nenhuma gravação corpo para SWIFT 4 ajudando para os velozes 4 pessoas
Shakeel Ahmed
o código irá verificar se o aplicativo está em segundo plano! Suponha que se você está recebendo a notificação no fundo e você quer fazer algumas coisas como executar alguma ação se a notificação receber quando o aplicativo em segundo plano o código interno irá executar
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
fonte
1

Uma extensão do Swift 4.0 para facilitar o acesso:

import UIKit

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

Para acessar de dentro do seu aplicativo:

let myAppIsInBackground = UIApplication.shared.isBackground

Se você estiver procurando informações sobre os vários estados ( active, inactivee background), poderá encontrar a documentação da Apple aqui .

CodeBender
fonte