我的思路:在后臺(tái)保持一個(gè)定時(shí)器辉哥,創(chuàng)建任務(wù),監(jiān)聽事件
首先定義兩個(gè)變量 在AppDelegate里面?
var timer: Timer?
?var bgTask: UIBackgroundTaskIdentifier?
接下來就是核心代碼:
func applicationDidEnterBackground(_ application: UIApplication) {
? ? ? ? //? 這個(gè)判斷是為了防止進(jìn)入后臺(tái)之后時(shí)間還沒過完進(jìn)入前臺(tái)又開啟了新的任務(wù)導(dǎo)致APP被強(qiáng)制kill掉
? ? ? ? if self.bgTask != UIBackgroundTaskIdentifier.invalid {
? ? ? ? ? ? return
? ? ? ? }
? ? ? ? self.bgTask = application.beginBackgroundTask(expirationHandler: {
? ? ? ? ? ? //當(dāng)申請的后臺(tái)時(shí)間用完的時(shí)候調(diào)用這個(gè)block
?? ? ? ? ? ? //此時(shí)我們需要結(jié)束后臺(tái)任務(wù)螺戳,
? ? ? ? ? ? self.endTask()
? ? ? ? })
? ? ? ? // 模擬一個(gè)長時(shí)間的任務(wù) Task
? ? ? ? timer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(self.longTimeTask(timer:)), userInfo: nil, repeats: true)
? ? }
一定要銷毀定時(shí)器:銷毀定時(shí)器!銷毀定時(shí)器折汞!銷毀定時(shí)器倔幼!重要事情三遍
@objc func endTask() {
? ? ? ? if self.timer != nil || self.timer?.isValid == true {
? ? ? ? ? ? self.timer?.invalidate()
? ? ? ? ? ? self.timer=nil
? ? ? ? ? ? //結(jié)束后臺(tái)任務(wù)
? ? ? ? ? ? UIApplication.shared.endBackgroundTask(self.bgTask!)
? ? ? ? ? ? print("停止timeer...")
? ? ? ? }
? ? }
最后一步:
@objc func longTimeTask(timer:Timer) {
? ? ? ? // 系統(tǒng)留給的我們的時(shí)間
? ? ? ? let time = UIApplication.shared.backgroundTimeRemaining
? ? ? ? print("系統(tǒng)留給的我們的時(shí)間:\(time)")
? ? }
希望對各位有用,喜歡的給個(gè)贊哦爽待!