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 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.
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.
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.
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 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.
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
}
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.
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 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.
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.
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
)
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.
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.
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.
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.
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
}
}
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.
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()
}
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.
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.
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.
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.
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.
// 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()
}
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.
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.
| Katangian | Background Task | BGTaskScheduler |
|---|---|---|
| Bersyon ng iOS | 4.0+ | 13.0+ |
| Max. oras | 30 segundo | 30 s / 10 min (processing) |
| Pagsisimula | didEnterBackground | Pag-iskedyul + system |
| Garantiya ng pag-execute | Kapag pumunta lang sa background | Anumang oras na maginhawa para sa system |
| Expiration handler | Oo, mandatory | Oo, sa pamamagitan ng task.expirationHandler |
| Internet | Kinakailangan sa startup | Magagamit sa pamamagitan ng requiresNetworkConnectivity |
| Pag-charge | Hindi kinakailangan | Opsyonal para sa processing |
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.
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.
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
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.
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.
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.
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.
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
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.
Basahin din