[英]iOS Swift Timer in not firing if the App is in the background
我正在開發一個 Cocoapod 庫,其中,我必須在計時器觸發時調用一個函數。 我在 iOS 應用程序中使用 Cocoapod,當應用程序進入后台狀態時,計時器不會觸發
private var timer : DispatchSourceTimer? = nil
let queue = DispatchQueue(label: "sample.timer")
timer = DispatchSource.makeTimerSource(queue : queue)
timer?.setEventHandler
{
[weak self] in
self?.sendData()
}
timer?.scheduleRepeating(deadline: .now(), interval: .seconds(5))
您正在使用一個GCD定時器(替代的事實Timer
可以在后台線程上運行)使我不知道,如果你混為一談兩個完全不同的單詞“背景”的用途:
“后台”的一種含義與應用程序運行時的后台隊列或線程有關。 這與“主”線程/隊列相反。
而且,是的,GCD 計時器與Timer
實例不同,因為它們可以在后台隊列上運行(假設應用程序本身實際上正在運行)。
“背景”的另一個含義與應用程序的狀態有關。 您可以在前台運行,在后台運行,或者被暫停/終止。
當應用程序運行時(在前台或后台),計時器(GCD 計時器或標准Timer
)可以運行。 但是如果一個應用程序被暫停或終止,所有的執行都會停止,包括計時器。
問題是您試圖在應用程序本身已暫停時運行計時器。 那是行不通的。
您的應用程序不會在后台運行,除非您:
請求一點時間來完成一些有限長度的任務(在最近的 iOS 版本中只運行 30 秒); 或
您的應用為某些批准的目的(例如導航、音樂、VOIP 等)啟用了一些后台模式。
但是應用程序不能繼續在后台運行(計時器或其他任何東西),除了那些特殊的、狹窄的情況(例如 VOIP、音樂、導航應用程序等)。 有關后台執行的更多信息,請參閱:
而且,即使在允許更通用的后台任務的iOS 13 及更高版本中,它們也適用於由操作系統自行決定啟動的有限長度任務(由電源、wifi、用戶啟動的頻率決定)應用程序等)。 有關更多信息,請參閱 WWDC 2019應用后台執行進展。
這有點棘手,但您可以嘗試限制您在后台的時間並解決此問題。
import AVFoundation
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, with: .mixWithOthers)
try AVAudioSession.sharedInstance().setActive(true)
}
catch { print(error) }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.