มีวิธีใดบ้างในการตรวจสอบว่าแอป iOS อยู่ในพื้นหลังหรือไม่?


186

ฉันต้องการตรวจสอบว่าแอปทำงานในพื้นหลังหรือไม่

ใน:

locationManagerDidUpdateLocation {
    if(app is runing in background){
        do this
    }
}

คุณกำลังพูดถึงlocationManager:didUpdateToLocation:fromLocation:วิธีการ?
กบดำเมื่อ

คำตอบ:


285

ผู้แทนแอปได้รับการเรียกกลับแสดงสถานะการเปลี่ยนผ่าน คุณสามารถติดตามมันได้

ด้วยคุณสมบัติapplicationStateใน UIApplication จะคืนค่าสถานะปัจจุบัน

[[UIApplication sharedApplication] applicationState]

64
ขอบคุณ - และเพื่อความชัดเจนเพิ่มเติมคือ [[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground
podperson

39
ฉันคิดว่า[[UIApplication sharedApplication] applicationState] != UIApplicationStateActiveดีกว่าเนื่องจาก UIApplicationStateInactive เกือบเทียบเท่ากับพื้นหลัง ...
JP Illanes

6
รัฐถูกสะกดออกที่นี่: developer.apple.com/library/ios/documentation/uikit/reference/…
Dan Rosenstark

2
ฉันพบว่าการเรียกกลับการเปลี่ยนแปลงไม่ได้รับการเรียกถ้าแอปของคุณมีชีวิตขึ้นมาเพื่อวัตถุประสงค์ในการดึงพื้นหลัง
Mike Asdf

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

นี่อาจช่วยคุณในการแก้ปัญหาของคุณ

ดูความคิดเห็นด้านล่าง - ไม่ได้ใช้งานเป็นกรณีพิเศษพอสมควรและอาจหมายความว่าแอพกำลังอยู่ระหว่างการเปิดตัวในส่วนหน้า นั่นอาจจะใช่หรือไม่ใช่ความหมาย "ภูมิหลัง" ของคุณก็ได้ขึ้นอยู่กับเป้าหมายของคุณ ...


ดีคำตอบที่เป็นประโยชน์ ทำงานแล้ว
Saranjith

1
จากเอกสาร: UIApplicationStateInactive - แอปทำงานในเบื้องหน้า แต่ไม่ได้รับเหตุการณ์ สิ่งนี้อาจเกิดขึ้นจากการหยุดชะงักหรือเนื่องจากแอพเปลี่ยนไปจากพื้นหลัง
Andy Weinstein

30

สวิฟท์ 3

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

ย้อนกลับเป็นจริงหรือไม่ ฉันสามารถตรวจสอบ == .inactive || ==. ใช้งานเพื่อดูว่าอยู่ในเบื้องหน้า (ตรงข้ามกับการเปิดบนเธรดพื้นหลัง) หรือไม่
roberto tomás


8

หากคุณต้องการรับการติดต่อกลับแทน "ถาม" เกี่ยวกับสถานะแอปพลิเคชันให้ใช้สองวิธีนี้ในAppDelegate:

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


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

1
สิ่งสำคัญคือให้สังเกตว่า applicationWillEnterForeground ถูกเรียกใช้ก่อน applicationDidBecomeActive ดังนั้นการตรวจสอบ applicationState จากภายใน applicationWillEnterForeground จะส่งคืน UIApplicationStateBackground เรื่องนี้ทำให้ฉันผิดหวัง ดังนั้นฉันจึงใช้การรวมกันของการแก้ปัญหาข้างต้นโดยการตรวจสอบ applicationState จากภายใน applicationDidBecomeActive แทน (ไม่ถูกต้อง) การตรวจสอบ applicationState สำหรับ UIApplicationStateBackground จากภายใน applicationWillEnterForeground
Justin Domnitz

ฉันมีโซลูชันเดียวกันนี้และเหมาะสำหรับกรณีที่คุณต้องการข้อมูลสถานะในเธรด / คิวอื่น
naz

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

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

ส่วนขยาย Swift 4.0 เพื่อให้เข้าถึงได้ง่ายขึ้น:

import UIKit

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

วิธีเข้าถึงจากภายในแอปของคุณ:

let myAppIsInBackground = UIApplication.shared.isBackground

หากคุณกำลังมองหาข้อมูลเกี่ยวกับรัฐต่างๆ ( active, inactiveและbackground), คุณสามารถหาเอกสารแอปเปิ้ลที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.