Background Task — mekanisme iOS yang memungkinkan aplikasi menyelesaikan operasi yang dimulai setelah beralih ke mode latar belakang. Sistem mengalokasikan waktu terbatas (hingga 30 detik) untuk menjalankan tugas, setelah itu aplikasi dijeda secara paksa. Menurut Apple, 2026, penggunaan expiration handler adalah persyaratan wajib untuk penyelesaian tugas latar belakang yang benar.
Poin utama
Background Task adalah mekanisme perangkat lunak iOS yang memungkinkan aplikasi memperpanjang waktu eksekusi setelah beralih ke mode latar belakang. Ketika pengguna mengecilkan aplikasi, sistem memanggil UIApplicationDelegate.applicationDidEnterBackground. Jika pada saat itu operasi kritis sedang berjalan (menyimpan data, mengirim permintaan), aplikasi dapat meminta waktu tambahan melalui beginBackgroundTask.
Tanpa menggunakan Background Task, aplikasi dijeda secara paksa 3-5 detik setelah masuk ke latar belakang. Semua operasi yang belum selesai terputus: data tidak tersimpan, permintaan jaringan terpotong, status hilang. Background Task memberi aplikasi hingga 30 detik untuk menyelesaikan operasi ini dengan benar.
beginBackgroundTask muncul di iOS 4.0 — rilis pertama yang mendukung multitasking. Sebelum iOS 4, aplikasi ditutup sepenuhnya saat tombol Home ditekan. Mulai iOS 7, Background Fetch dan URLSession background configuration muncul. Mulai iOS 13, Apple merekomendasikan BGTaskScheduler untuk proyek baru, tetapi beginBackgroundTask tetap relevan untuk operasi jangka pendek.
beginBackgroundTask — metode UIApplication yang mendaftarkan tugas dan mengembalikan pengidentifikasi unik UIBackgroundTaskIdentifier. Sistem memperpanjang timer eksekusi latar belakang. Setelah waktu habis, expiration handler dipanggil, setelah itu aplikasi harus memanggil endBackgroundTask(identifier:) untuk penyelesaian yang benar.
Langkah 1 — aplikasi menerima notifikasi didEnterBackground. Langkah 2 — beginBackgroundTask(expirationHandler:) dipanggil. Langkah 3 — operasi kritis (menyimpan, permintaan jaringan) dijalankan. Langkah 4 — setelah selesai, endBackgroundTask(identifier:) dipanggil. Jika operasi tidak selesai dalam 30 detik — sistem memanggil expiration handler, dan aplikasi harus segera mengakhiri tugas.
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
}
Properti backgroundTimeRemaining mengembalikan jumlah detik yang tersisa hingga penghentian paksa tugas latar belakang. Nilai berkurang secara real-time. Jika aplikasi tidak di latar belakang — mengembalikan DBL_MAX. Gunakan properti ini untuk menyesuaikan perilaku: ketika tersisa kurang dari 5 detik, hentikan operasi panjang dan simpan progres.
Aplikasi dapat mendaftarkan beberapa Background Task secara bersamaan. Setiap tugas mendapatkan pengidentifikasinya sendiri. Total waktu eksekusi dijumlahkan — jika 3 tugas didaftarkan, aplikasi dapat memperoleh hingga 90 detik. Namun, sistem dapat mengakhiri aplikasi lebih awal jika sumber daya habis atau batas baterai terlampaui.
Expiration handler adalah blok kode yang dipanggil oleh sistem ketika waktu yang dialokasikan untuk tugas latar belakang habis. Keberadaan expiration handler adalah persyaratan wajib Apple. Tanpanya, aplikasi dapat diakhiri secara paksa oleh sistem, dan data bisa hilang.
Expiration handler harus melakukan tindakan minimal untuk menyimpan status aplikasi: menyimpan data saat ini di penyimpanan persisten, memanggil endBackgroundTask dengan pengidentifikasi yang sesuai, dan mengatur pengidentifikasi ke .invalid. Di dalam expiration handler dilarang memulai operasi panjang baru — waktu eksekusi dibatasi 1-2 detik.
func handleExpiration() {
// Menyimpan progres eksekusi
saveProgressToUserDefaults()
// Membatalkan permintaan jaringan aktif
currentTask?.cancel()
// Mengakhiri Background Task
UIApplication.shared.endBackgroundTask(backgroundTaskID)
backgroundTaskID = .invalid
}
// Registrasi dengan expiration handler
backgroundTaskID = UIApplication.shared.beginBackgroundTask(
withName: "SaveDocument",
expirationHandler: handleExpiration
)
Kesalahan paling umum adalah tidak memanggil endBackgroundTask di dalam expiration handler. Dalam kasus ini, sistem terus menganggap tugas aktif, aplikasi tidak masuk ke status Suspended, dan baterai habis. Kesalahan kedua adalah memulai operasi panjang di dalam expiration handler. Sistem dapat mengakhiri aplikasi sebelum operasi selesai, dan data akan hilang.
Di expiration handler, waktu eksekusi sangat singkat — biasanya kurang dari 1 detik. Oleh karena itu, di dalam handler tidak boleh dilakukan: perhitungan kompleks, permintaan jaringan, penulisan data dalam jumlah besar ke CoreData. Hanya operasi atomik: menulis satu kunci di UserDefaults, mengatur flag status, memanggil endBackgroundTask.
Mari kita lihat implementasi lengkap Background Task untuk menyimpan dokumen saat aplikasi masuk ke latar belakang. Contoh ini mencakup registrasi tugas, eksekusi operasi dengan pemeriksaan waktu tersisa, dan penyelesaian yang benar melalui endBackgroundTask.
Saat masuk ke latar belakang, aplikasi memulai penyimpanan dokumen besar. Background Task memberi hingga 30 detik untuk operasi. Jika waktu habis — expiration handler menyimpan hasil sementara. Setelah penyimpanan selesai, endBackgroundTask dipanggil untuk membebaskan sumber daya.
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
}
}
Permintaan jaringan di latar belakang memerlukan perhatian khusus — expiration handler dapat memotong permintaan sebelum menerima respons. Gunakan URLSession dengan dataTask dan periksa backgroundTimeRemaining sebelum mengirim. Jika tersisa kurang dari 5 detik — tunda pengiriman hingga aplikasi terbangun berikutnya.
func sendCriticalData(data: Data) {
backgroundTaskID = UIApplication.shared.beginBackgroundTask {
// Menyimpan data untuk pengiriman ulang
saveForRetry(data)
self.endBackgroundTask()
}
let task = URLSession.shared.dataTask(with: request) { _, _, error in
if error != nil {
saveForRetry(data)
}
self.endBackgroundTask()
}
task.resume()
}
Untuk operasi panjang, pantau UIApplication.shared.backgroundTimeRemaining. Jika nilai turun di bawah ambang batas (10 detik), hentikan operasi saat ini dan mulai simpan hasil sementara. Ini memungkinkan penyelesaian kerja yang benar sebelum panggilan paksa expiration handler.
Background Task adalah mekanisme yang kuat, tetapi penggunaannya yang tidak tepat menyebabkan masalah baterai dan kinerja. Mengikuti rekomendasi Apple dan praktik komunitas yang terbukti membantu menghindari kesalahan umum dan memastikan operasi aplikasi yang stabil.
Selesaikan Background Task secepat mungkin. Setiap detik eksekusi latar belakang menghabiskan daya baterai. Waktu optimal — kurang dari 5 detik. Jika operasi memakan waktu lebih lama — pertimbangkan menggunakan BGTaskScheduler atau Background Modes. Jangan perpanjang tugas secara artifisial melalui panggilan beginBackgroundTask tanpa kebutuhan nyata.
Simpan UIBackgroundTaskIdentifier sebagai properti kelas atau struktur. Jangan pernah meneruskannya sebagai variabel global — ini menyebabkan konflik pada beberapa tugas. Atur pengidentifikasi ke .invalid setelah memanggil endBackgroundTask untuk mencegah penyelesaian ganda.
Di Xcode Simulator, alihkan aplikasi ke latar belakang melalui tombol Home (Command + Shift + H). Gunakan Debug — Simulate Background Fetch untuk menguji kebangkitan latar belakang. Untuk mensimulasikan waktu habis, atur variabel lingkungan BACKGROUND_TASK_SIMULATE_EXPIRATION = YES — expiration handler akan dipanggil setelah 5 detik.
// Memeriksa waktu tersisa sebelum memulai operasi
let remaining = UIApplication.shared.backgroundTimeRemaining
guard remaining > 10.0 else {
// Waktu tidak cukup — tunda tugas
scheduleForNextLaunch()
return
}
// Eksekusi operasi dengan kontrol waktu
backgroundTaskID = UIApplication.shared.beginBackgroundTask {
saveProgress()
self.endBackgroundTask()
}
Expiration handler menangkap self — ini dapat membuat retain cycle jika backgroundTaskID disimpan sebagai properti objek yang sama. Gunakan [weak self] di closure atau simpan pengidentifikasi secara terpisah. Retain cycle menyebabkan kebocoran memori — objek tidak akan dibebaskan hingga aplikasi berakhir.
Dengan rilis iOS 13, Apple memperkenalkan BGTaskScheduler — pengganti modern untuk API Background Task lama. Kedua mekanisme menyelesaikan tugas serupa, tetapi BGTaskScheduler memberikan lebih banyak kontrol dan fleksibilitas. Memahami perbedaan membantu memilih alat yang tepat untuk skenario tertentu.
| Karakteristik | Background Task | BGTaskScheduler |
|---|---|---|
| Versi iOS | 4.0+ | 13.0+ |
| Waktu maks. | 30 detik | 30 dtk / 10 mnt (processing) |
| Inisiasi | didEnterBackground | Penjadwalan + sistem |
| Jaminan eksekusi | Hanya saat masuk ke latar belakang | Kapan saja saat sistem memungkinkan |
| Expiration handler | Ya, wajib | Ya, melalui task.expirationHandler |
| Internet | Diperlukan saat startup | Tersedia melalui requiresNetworkConnectivity |
| Pengisian daya | Tidak diperlukan | Opsional untuk processing |
beginBackgroundTask cocok untuk operasi jangka pendek yang harus segera dilakukan saat masuk ke latar belakang: menyimpan status, menyelesaikan permintaan jaringan, caching data. API sederhana dan tidak memerlukan konfigurasi Info.plist atau registrasi pengidentifikasi. Ideal untuk operasi yang memakan waktu kurang dari 10 detik.
BGTaskScheduler cocok untuk tugas yang dapat dilakukan kapan saja: sinkronisasi periodik, pembersihan cache, pembaruan widget. Sistem memilih waktu optimal dengan mempertimbangkan perilaku pengguna dan status baterai. Untuk operasi panjang (hingga 10 menit) gunakan BGProcessingTask.
Kedua API dapat digunakan dalam satu aplikasi. Background Task — untuk operasi segera saat masuk ke latar belakang (menyimpan draf). BGTaskScheduler — untuk pembaruan terjadwal (sinkronisasi setiap 6 jam). Pembagian tanggung jawab memungkinkan penyimpanan data yang benar dan layanan latar belakang yang hemat energi.
Pertanyaan yang sering diajukan
Ya, beginBackgroundTask dapat dipanggil kapan saja selama aplikasi berjalan. Namun, alokasi waktu sistem hanya akan dimulai setelah beralih ke latar belakang. Jika aplikasi di latar depan, panggilan beginBackgroundTask tidak berpengaruh — backgroundTimeRemaining mengembalikan DBL_MAX, dan tugas akan diaktifkan saat masuk ke latar belakang.
Jika endBackgroundTask tidak dipanggil, sistem terus menganggap aplikasi aktif di latar belakang. Setelah 30 detik, expiration handler akan dipanggil, tetapi jika di dalamnya juga tidak ada endBackgroundTask — aplikasi tetap di memori, menghabiskan baterai. Di iOS 13+, sistem mengakhiri aplikasi semacam itu secara paksa setelah 3 menit.
Waktu standar adalah 30 detik. Memperpanjangnya hanya dapat dilakukan melalui Background Modes: Audio (pemutaran), Location (geolokasi), Bluetooth (BLE). Atau melalui BGProcessingTask (iOS 13+) — hingga 10 menit dengan syarat pengisian daya dan Wi-Fi. beginBackgroundTask sendiri tidak menyediakan cara untuk meningkatkan batas.
Ya, iPadOS sepenuhnya mendukung beginBackgroundTask dengan batasan yang sama seperti iOS. Di iPad dengan Stage Manager, aplikasi dapat bertahan lebih lama di memori — sistem lebih jarang menjeda aplikasi karena jumlah RAM yang lebih besar. Namun batas 30 detik untuk tugas latar belakang tetap berlaku.
Hubungkan perangkat ke Xcode, jalankan aplikasi, perkecil — di konsol akan muncul log sistem. Gunakan sysdiagnose untuk mengumpulkan log detail: paksa sysdiagnose dari perangkat (Volume Up + Down + Power). Di Xcode Debug Navigator, pantau aktivitas tugas latar belakang.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga