Background Task: mga pangunahing konsepto, pagpaparehistro ng gawain, at pag-execute sa background

May-akda: IT Sectr Nai-publish: 2026-03-27 Oras ng pagbabasa: 10 min

Background Task — mekanismo ng iOS na nagpapahintulot sa app na tapusin ang sinimulang operasyon pagkatapos lumipat sa background mode. Naglalaan ang system ng limitadong oras (hanggang 30 segundo) para sa pag-execute ng gawain, pagkatapos ay sapilitang i-suspend ang app. Ayon sa Apple, 2026, ang paggamit ng expiration handler ay isang mandatoryong kinakailangan para sa tamang pagkumpleto ng background task.

Mga pangunahing punto

  • Background Task — mekanismo ng iOS para sa pagkumpleto ng mga operasyon pagkatapos pumunta ang app sa background.
  • beginBackgroundTask — pangunahing pamamaraan ng UIApplication para sa pagrerehistro ng background task.
  • Expiration handler — bloke ng code na tinatawag ng system kapag naubos ang inilaang oras.
  • Limitasyong 30 segundo — karaniwang oras para sa pag-execute, pinalawig sa pamamagitan ng Background Modes.
  • UIApplication.shared.endBackgroundTask — mandatoryong tawag para sa tamang pagkumpleto ng gawain.

Ano ang Background Task sa iOS?

Background Task ay isang software mechanism ng iOS na nagpapahintulot sa app na pahabain ang oras ng pag-execute pagkatapos lumipat sa background mode. Kapag pinaliit ng user ang app, tinatawag ng system ang UIApplicationDelegate.applicationDidEnterBackground. Kung sa oras na iyon ay may kritikal na operasyon na isinasagawa (pag-save ng data, pagpapadala ng request), ang app ay maaaring humiling ng karagdagang oras sa pamamagitan ng beginBackgroundTask.

Bakit kailangan ang Background Tasks

Kung hindi gagamitin ang Background Task, ang app ay sapilitang isa-suspend pagkatapos ng 3-5 segundo mula sa pagpunta sa background. Lahat ng hindi natapos na operasyon ay naaantala: hindi nai-save ang data, napuputol ang mga network request, nawawala ang mga estado. Ang Background Task ay nagbibigay sa app ng hanggang 30 segundo para sa tamang pagkumpleto ng mga operasyong ito.

  • Pag-save ng estado — pagsusulat ng data sa CoreData, UserDefaults o file system.
  • Pagkumpleto ng mga network request — paghihintay ng tugon mula sa server at pagproseso ng resulta.
  • Pagpapadala ng analytics — paglilipat ng mga event sa analytics server bago i-suspend.
  • Paglinis ng mga resource — pagsara ng file descriptors, pagpapalaya ng memory.
  • Caching — pagsusulat ng mga pansamantalang resulta para sa pagbawi sa susunod na startup.

Kasaysayan at ebolusyon

beginBackgroundTask ay lumitaw sa iOS 4.0 — unang release na sumusuporta sa multitasking. Bago ang iOS 4, ang app ay ganap na nagsasara kapag pinindot ang Home button. Mula sa iOS 7, lumitaw ang Background Fetch at URLSession background configuration. Simula sa iOS 13, inirerekomenda ng Apple ang BGTaskScheduler para sa mga bagong proyekto, ngunit nananatiling may kaugnayan ang beginBackgroundTask para sa mga panandaliang operasyon.

Paano gumagana ang beginBackgroundTask: lifecycle

beginBackgroundTask — pamamaraan ng UIApplication na nagrerehistro ng gawain at nagbabalik ng natatanging identifier na UIBackgroundTaskIdentifier. Pinapalawak ng system ang timer ng background execution. Kapag naubos ang oras, tinatawag ang expiration handler, pagkatapos ay dapat tawagan ng app ang endBackgroundTask(identifier:) para sa tamang pagkumpleto.

Hakbang-hakbang na proseso ng pag-execute

Hakbang 1 — natatanggap ng app ang notipikasyon na didEnterBackground. Hakbang 2 — tinatawag ang beginBackgroundTask(expirationHandler:). Hakbang 3 — isinasagawa ang kritikal na operasyon (pag-save, network request). Hakbang 4 — kapag natapos, tinatawag ang endBackgroundTask(identifier:). Kung hindi matapos ang operasyon sa loob ng 30 segundo — tinatawag ng system ang expiration handler, at dapat agad tapusin ng app ang gawain.

swift
var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid

func startBackgroundTask() {
    backgroundTaskID = UIApplication.shared.beginBackgroundTask {
        // Expiration handler
        UIApplication.shared.endBackgroundTask(backgroundTaskID)
        backgroundTaskID = .invalid
    }
}

func finishBackgroundTask() {
    UIApplication.shared.endBackgroundTask(backgroundTaskID)
    backgroundTaskID = .invalid
}

UIApplication.shared.backgroundTimeRemaining

Ang property na backgroundTimeRemaining ay nagbabalik ng bilang ng mga segundong natitira hanggang sa sapilitang pagtatapos ng background task. Bumababa ang halaga sa real-time. Kung ang app ay wala sa background — nagbabalik ng DBL_MAX. Gamitin ang property na ito para iakma ang pag-uugali: kapag wala pang 5 segundo ang natitira, putulin ang mahahabang operasyon at i-save ang progreso.

Maramihang gawain

Ang app ay maaaring magrehistro ng maraming Background Task nang sabay-sabay. Bawat gawain ay nakakakuha ng sarili nitong identifier. Ang kabuuang oras ng pag-execute ay pinagsama-sama — kung 3 gawain ang narehistro, ang app ay maaaring makakuha ng hanggang 90 segundo. Gayunpaman, maaaring tapusin ng system ang app nang mas maaga kung naubos ang mga resource o lumampas sa limitasyon ng baterya.

Expiration handler: mandatoryong paghawak ng pagkumpleto

Expiration handler ay isang bloke ng code na tinatawag ng system kapag naubos ang inilaang oras para sa background task. Ang pagkakaroon ng expiration handler ay isang mandatoryong kinakailangan ng Apple. Kung wala nito, ang app ay maaaring sapilitang tapusin ng system, at ang data ay maaaring mawala.

Ano ang dapat nasa expiration handler

Ang expiration handler ay dapat magsagawa ng mga minimal na aksyon para i-save ang estado ng app: i-save ang kasalukuyang data sa permanenteng storage, tawagan ang endBackgroundTask na may kaukulang identifier, at itakda ang identifier sa .invalid. Sa loob ng expiration handler, bawal magsimula ng mga bagong mahahabang operasyon — ang oras ng pag-execute ay limitado sa 1-2 segundo.

swift
func handleExpiration() {
    // Sine-save ang progreso ng pag-execute
    saveProgressToUserDefaults()

    // Kinakansela ang mga aktibong network request
    currentTask?.cancel()

    // Tinatapos ang Background Task
    UIApplication.shared.endBackgroundTask(backgroundTaskID)
    backgroundTaskID = .invalid
}

// Pagrehistro na may expiration handler
backgroundTaskID = UIApplication.shared.beginBackgroundTask(
    withName: "SaveDocument",
    expirationHandler: handleExpiration
)

Mga pagkakamali sa paggamit ng expiration handler

Ang pinakakaraniwang pagkakamali ay hindi pagtawag ng endBackgroundTask sa loob ng expiration handler. Sa kasong ito, patuloy na itinuturing ng system na aktibo ang gawain, ang app ay hindi pumapasok sa Suspended state, at nauubos ang baterya. Ang pangalawang pagkakamali ay ang pagsisimula ng mahahabang operasyon sa loob ng expiration handler. Maaaring tapusin ng system ang app bago matapos ang mga ito, at mawawala ang data.

Pagsusuri ng natitirang oras

Sa expiration handler, ang oras ng pag-execute ay kritikal na maikli — karaniwang wala pang 1 segundo. Kaya naman, sa loob ng handler ay hindi maaaring gawin ang: mga komplikadong kalkulasyon, network request, pagsusulat ng malaking halaga ng data sa CoreData. Tanging atomic operations: pagsusulat ng isang key sa UserDefaults, pagtatakda ng state flag, pagtawag ng endBackgroundTask.

Mga halimbawa ng code ng Background Task sa Swift

Tingnan natin ang buong implementasyon ng Background Task para sa pag-save ng dokumento kapag pumunta ang app sa background. Kasama sa halimbawa ang pagrerehistro ng gawain, pag-execute ng operasyon na may pagsusuri ng natitirang oras, at tamang pagkumpleto sa pamamagitan ng endBackgroundTask.

Pag-save ng dokumento na may progreso

Kapag pumunta sa background, sinisimulan ng app ang pag-save ng malaking dokumento. Ang Background Task ay nagbibigay ng hanggang 30 segundo para sa operasyon. Kung maubos ang oras — ise-save ng expiration handler ang mga pansamantalang resulta. Pagkatapos ng pag-save, tinatawag ang endBackgroundTask para palayain ang mga resource.

swift
class DocumentManager {
    private var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid

    func saveDocumentInBackground(document: Document) {
        backgroundTaskID = UIApplication.shared.beginBackgroundTask {
            self.saveProgress(document)
            self.endBackgroundTask()
        }

        DispatchQueue.global().async {
            document.save()
            self.endBackgroundTask()
        }
    }

    private func endBackgroundTask() {
        UIApplication.shared.endBackgroundTask(backgroundTaskID)
        backgroundTaskID = .invalid
    }
}

Pagpapadala ng data sa server

Ang mga network request sa background ay nangangailangan ng espesyal na atensyon — maaaring putulin ng expiration handler ang request bago makuha ang tugon. Gamitin ang URLSession na may dataTask at suriin ang backgroundTimeRemaining bago magpadala. Kung wala pang 5 segundo ang natitira — ipagpaliban ang pagpapadala hanggang sa susunod na paggising ng app.

swift
func sendCriticalData(data: Data) {
    backgroundTaskID = UIApplication.shared.beginBackgroundTask {
        // Sine-save ang data para sa muling pagpapadala
        saveForRetry(data)
        self.endBackgroundTask()
    }

    let task = URLSession.shared.dataTask(with: request) { _, _, error in
        if error != nil {
            saveForRetry(data)
        }
        self.endBackgroundTask()
    }
    task.resume()
}

Pagmonitor ng natitirang oras

Para sa mahahabang operasyon, subaybayan ang UIApplication.shared.backgroundTimeRemaining. Kung bumaba ang halaga sa ibaba ng threshold (10 segundo), putulin ang kasalukuyang operasyon at simulan ang pag-save ng mga pansamantalang resulta. Ito ay nagpapahintulot ng tamang pagkumpleto ng trabaho bago ang sapilitang pagtawag ng expiration handler.

Pinakamahuhusay na kasanayan sa paggamit ng Background Task

Background Task ay isang makapangyarihang mekanismo, ngunit ang maling paggamit nito ay humahantong sa mga problema sa baterya at performance. Ang pagsunod sa mga rekomendasyon ng Apple at mga napatunayang kasanayan ng komunidad ay tumutulong upang maiwasan ang mga karaniwang pagkakamali at matiyak ang matatag na operasyon ng app.

Pag-minimize ng oras ng pag-execute

Tapusin ang Background Task nang mabilis hangga't maaari. Bawat segundo ng background execution ay kumukonsumo ng lakas ng baterya. Optimal na oras — wala pang 5 segundo. Kung mas matagal ang operasyon — isaalang-alang ang paggamit ng BGTaskScheduler o Background Modes. Huwag artipisyal na pahabain ang gawain sa pamamagitan ng mga tawag sa beginBackgroundTask nang walang tunay na pangangailangan.

Tamang paggamit ng mga identifier

Itago ang UIBackgroundTaskIdentifier bilang property ng isang klase o istraktura. Huwag itong ipasa bilang global variable — ito ay humahantong sa mga salungatan sa maraming gawain. Itakda ang identifier sa .invalid pagkatapos tawagan ang endBackgroundTask upang maiwasan ang dobleng pagkumpleto.

Pag-test ng Background Task

Sa Xcode Simulator, ilipat ang app sa background sa pamamagitan ng Home button (Command + Shift + H). Gamitin ang Debug — Simulate Background Fetch para sa pag-test ng background wake. Para gayahin ang pagkaubos ng oras, itakda ang environment variable na BACKGROUND_TASK_SIMULATE_EXPIRATION = YES — ang expiration handler ay tatawagin pagkatapos ng 5 segundo.

swift
// Pagsusuri ng natitirang oras bago simulan ang operasyon
let remaining = UIApplication.shared.backgroundTimeRemaining
guard remaining > 10.0 else {
    // Hindi sapat ang oras — ipagpaliban ang gawain
    scheduleForNextLaunch()
    return
}

// Pag-execute ng operasyon na may kontrol sa oras
backgroundTaskID = UIApplication.shared.beginBackgroundTask {
    saveProgress()
    self.endBackgroundTask()
}

Iwasan ang retain cycles

Ang expiration handler ay kumukuha ng self — ito ay maaaring lumikha ng retain cycle kung ang backgroundTaskID ay naka-store bilang property ng parehong object. Gumamit ng [weak self] sa closure o itago ang identifier nang hiwalay. Ang retain cycle ay humahantong sa memory leak — ang object ay hindi palalayain hanggang sa matapos ang app.

Background Task vs BGTaskScheduler: paghahambing ng mga approach

Sa paglabas ng iOS 13, ipinakilala ng Apple ang BGTaskScheduler — isang modernong kapalit para sa lumang Background Task API. Parehong nilulutas ng dalawang mekanismo ang magkatulad na gawain, ngunit ang BGTaskScheduler ay nagbibigay ng mas maraming kontrol at flexibility. Ang pag-unawa sa mga pagkakaiba ay tumutulong sa pagpili ng tamang tool para sa partikular na sitwasyon.

KatangianBackground TaskBGTaskScheduler
Bersyon ng iOS4.0+13.0+
Max. oras30 segundo30 s / 10 min (processing)
PagsisimuladidEnterBackgroundPag-iskedyul + system
Garantiya ng pag-executeKapag pumunta lang sa backgroundAnumang oras na maginhawa para sa system
Expiration handlerOo, mandatoryOo, sa pamamagitan ng task.expirationHandler
InternetKinakailangan sa startupMagagamit sa pamamagitan ng requiresNetworkConnectivity
Pag-chargeHindi kinakailanganOpsyonal para sa processing

Kailan gagamitin ang Background Task

beginBackgroundTask ay angkop para sa mga panandaliang operasyon na kailangang gawin kaagad kapag pumunta sa background: pag-save ng estado, pagkumpleto ng network request, caching ng data. Ang API ay simple at hindi nangangailangan ng configuration ng Info.plist o pagrerehistro ng mga identifier. Mainam para sa mga operasyon na tumatagal ng wala pang 10 segundo.

Kailan gagamitin ang BGTaskScheduler

BGTaskScheduler ay angkop para sa mga gawain na maaaring gawin anumang oras: pana-panahong synchronization, paglilinis ng cache, pag-update ng mga widget. Pinipili ng system ang optimal na oras na isinasaalang-alang ang pag-uugali ng user at estado ng baterya. Para sa mahahabang operasyon (hanggang 10 minuto) gamitin ang BGProcessingTask.

Pinagsamang paggamit

Parehong API ay maaaring gamitin sa isang app. Background Task — para sa agarang operasyon kapag pumunta sa background (pag-save ng draft). BGTaskScheduler — para sa mga naka-iskedyul na update (synchronization bawat 6 na oras). Ang paghahati ng responsibilidad ay nagbibigay-daan upang garantiyahan ang tamang pag-save ng data at energy-efficient na background service.

Mga madalas itanong

Maaari bang tawagan ang beginBackgroundTask sa labas ng didEnterBackground?

Oo, ang beginBackgroundTask ay maaaring tawagan anumang oras sa panahon ng pagpapatakbo ng app. Gayunpaman, ang paglalaan ng oras ng system ay magsisimula lamang pagkatapos lumipat sa background. Kung ang app ay nasa foreground, ang pagtawag ng beginBackgroundTask ay walang epekto — ang backgroundTimeRemaining ay nagbabalik ng DBL_MAX, at ang gawain ay ia-activate kapag pumunta sa background.

Ano ang mangyayari kung hindi tatawagin ang endBackgroundTask?

Kung hindi tatawagin ang endBackgroundTask, patuloy na ituturing ng system na aktibo ang app sa background. Pagkatapos ng 30 segundo, tatawagin ang expiration handler, ngunit kung wala ring endBackgroundTask doon — mananatili ang app sa memory, nauubos ang baterya. Sa iOS 13+, sapilitang tinatapos ng system ang naturang app pagkatapos ng 3 minuto.

Paano pahabain ang oras ng Background Task nang higit sa 30 segundo?

Ang karaniwang oras ay 30 segundo. Mapapahaba lamang ito sa pamamagitan ng Background Modes: Audio (pag-play), Location (geolocation), Bluetooth (BLE). O sa pamamagitan ng BGProcessingTask (iOS 13+) — hanggang 10 minuto na may kondisyong naka-charge at naka-Wi-Fi. Ang beginBackgroundTask mismo ay hindi nagbibigay ng paraan upang taasan ang limitasyon.

Gumagana ba ang Background Task sa iPad?

Oo, ganap na sinusuportahan ng iPadOS ang beginBackgroundTask na may parehong mga limitasyon tulad ng iOS. Sa iPad na may Stage Manager, ang app ay maaaring manatili sa memory nang mas matagal — mas madalas na sini-suspend ng system ang mga app dahil sa mas malaking halaga ng RAM. Ngunit nananatili ang limitasyong 30 segundo para sa background task.

Paano i-debug ang Background Task sa isang tunay na device?

Ikonekta ang device sa Xcode, patakbuhin ang app, paliitin ito — lilitaw ang mga system log sa console. Gamitin ang sysdiagnose para mangolekta ng mga detalyadong log: pilitin ang sysdiagnose mula sa device (Volume Up + Down + Power). Sa Xcode Debug Navigator, subaybayan ang aktibidad ng mga background task.

Buod

  • Background Task — mekanismo ng iOS para sa pagkumpleto ng mga operasyon pagkatapos pumunta sa background, available mula noong iOS 4.0.
  • beginBackgroundTask — pamamaraan ng UIApplication na nagrerehistro ng gawain at nagbabalik ng identifier para sa pagkumpleto nito.
  • Expiration handler — mandatoryong bloke ng code na tinatawag ng system kapag naubos ang 30-segundong limitasyon.
  • endBackgroundTask — mandatoryong tawag para sa tamang pagkumpleto ng gawain; kung wala, nananatili ang app sa memory.
  • BGTaskScheduler — modernong alternatibo (iOS 13+) na may pag-iskedyul, dalawang uri ng gawain, at kundisyon ng pag-execute.
  • backgroundTimeRemaining — property para sa pagsusuri ng natitirang oras at pag-aakma ng pag-uugali ng gawain.
  • Gamitin ang Background Task para sa agarang panandaliang operasyon at BGTaskScheduler para sa mga naka-iskedyul na background update sa mga bagong proyekto.

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din