簡體   English   中英

如果應用程序在后台,iOS Swift Timer 不會觸發

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM