Apakah ada cara untuk memeriksa apakah aplikasi iOS ada di latar belakang?

186

Saya ingin memeriksa apakah aplikasi berjalan di latar belakang.

Di:

locationManagerDidUpdateLocation {
    if(app is runing in background){
        do this
    }
}
bobby grenier
sumber
Apakah Anda berbicara tentang locationManager:didUpdateToLocation:fromLocation:metode ini?
Black Frog

Jawaban:

285

Delegasi aplikasi mendapat panggilan balik yang mengindikasikan transisi keadaan. Anda dapat melacaknya berdasarkan itu.

Juga properti applicationState di aplikasi UIA mengembalikan keadaan saat ini.

[[UIApplication sharedApplication] applicationState]
DavidN
sumber
64
Terima kasih - dan untuk kejelasan tambahan ini [[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground.
podperson
39
Saya pikir [[UIApplication sharedApplication] applicationState] != UIApplicationStateActivelebih baik, karena UIApplicationStateInactive hampir setara dengan di latar belakang ...
JP Illanes
2
Saya telah menemukan bahwa panggilan balik transisi tidak dipanggil jika aplikasi Anda dihidupkan untuk tujuan pengambilan latar belakang.
Mike Asdf
176
UIApplicationState state = [[UIApplication sharedApplication] applicationState];
if (state == UIApplicationStateBackground || state == UIApplicationStateInactive)
{
   //Do checking here.
}

Ini dapat membantu Anda dalam memecahkan masalah Anda.

Lihat komentar di bawah - tidak aktif adalah kasus yang cukup khusus, dan dapat berarti bahwa aplikasi sedang dalam proses diluncurkan ke latar depan. Itu mungkin atau mungkin tidak berarti "latar belakang" bagi Anda tergantung pada tujuan Anda ...

Bose Aswathy
sumber
Bagus, jawaban yang bermanfaat. Bekerja
Saranjith
1
Dari dokumen: UIApplicationStateInactive - Aplikasi ini berjalan di latar depan tetapi tidak menerima acara. Ini mungkin terjadi sebagai akibat dari gangguan atau karena aplikasi beralih ke atau dari latar belakang.
Andy Weinstein
30

Cepat 3

    let state = UIApplication.shared.applicationState
    if state == .background {
        print("App in Background")
    }
Memenuhi
sumber
apakah yang sebaliknya juga benar? dapatkah saya memeriksa == .inactive || == .aktif untuk melihat apakah ada di latar depan (sebagai lawan membuka di utas latar belakang)?
roberto tomás
21

Versi cepat:

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

Jika Anda lebih suka menerima panggilan balik alih-alih "bertanya" tentang status aplikasi, gunakan dua metode ini di AppDelegate:

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


- (void)applicationWillResignActive:(UIApplication *)application {
    NSLog(@"app is not actvie now");
}
klimat
sumber
1
Penting untuk dicatat bahwa applicationWillEnterForeground dipanggil sebelum applicationDidBecomeActive. Oleh karena itu, memeriksa applicationState dari dalam applicationWillEnterForeground akan mengembalikan UIApplicationStateBackground. Ini melempar saya sedikit. Jadi, saya menggunakan kombinasi solusi di atas dengan memeriksa applicationState dari dalam applicationDidBecomeActive alih-alih (salah) memeriksa applicationState untuk UIApplicationStateBackground dari dalam applicationWillEnterForeground.
Justin Domnitz
1
Saya punya solusi yang sama dan cocok untuk kasus-kasus di mana Anda memerlukan informasi status pada utas / antrian lain.
naz
4

cepat 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
sumber
1
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang mengapa dan / atau bagaimana kode ini menjawab pertanyaan meningkatkan nilai jangka panjangnya.
rollstuhlfahrer
karena tidak ada tulisan untuk cepat 4 membantu untuk cepat 4 orang
Shakeel Ahmed
kode akan memeriksa Anda menyatakan jika aplikasi di latar belakang! Misalkan jika Anda menerima pemberitahuan di latar belakang dan Anda ingin melakukan beberapa hal seperti melakukan beberapa tindakan jika pemberitahuan menerima ketika aplikasi di latar belakang kode batin akan dieksekusi
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
sumber
1

Ekstensi Swift 4.0 untuk membuatnya lebih mudah diakses:

import UIKit

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

Untuk mengakses dari dalam aplikasi Anda:

let myAppIsInBackground = UIApplication.shared.isBackground

Jika Anda mencari informasi tentang berbagai status ( active, inactivedan background), Anda dapat menemukan dokumentasi Apple di sini .

CodeBender
sumber