Background Task: konsep kunci, registrasi tugas, dan eksekusi di latar belakang

Penulis: IT Sectr Diterbitkan: 2026-03-27 Waktu membaca: 10 mnt

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 — mekanisme iOS untuk menyelesaikan operasi setelah aplikasi masuk ke latar belakang.
  • beginBackgroundTask — metode kunci UIApplication untuk mendaftarkan tugas latar belakang.
  • Expiration handler — blok kode yang dipanggil oleh sistem ketika waktu yang dialokasikan habis.
  • Batasan 30 detik — waktu standar untuk eksekusi, diperpanjang melalui Background Modes.
  • UIApplication.shared.endBackgroundTask — panggilan wajib untuk penyelesaian tugas yang benar.

Apa itu Background Task di iOS?

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.

Mengapa Background Tasks diperlukan

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.

  • Menyimpan status — menulis data ke CoreData, UserDefaults, atau sistem file.
  • Menyelesaikan permintaan jaringan — menunggu respons dari server dan memproses hasil.
  • Mengirim analitik — mentransfer peristiwa ke server analitik sebelum dijeda.
  • Membersihkan sumber daya — menutup deskriptor file, membebaskan memori.
  • Caching — menulis hasil sementara untuk pemulihan saat startup berikutnya.

Sejarah dan evolusi

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.

Bagaimana cara kerja beginBackgroundTask: siklus hidup

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.

Proses eksekusi langkah demi langkah

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.

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

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.

Beberapa tugas

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: penanganan penyelesaian wajib

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.

Apa yang harus ada di expiration handler

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.

swift
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 saat bekerja dengan expiration handler

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.

Memeriksa waktu tersisa

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.

Contoh kode Background Task di Swift

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.

Menyimpan dokumen dengan progres

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.

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
    }
}

Mengirim data ke server

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.

swift
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()
}

Memantau waktu tersisa

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.

Praktik terbaik penggunaan Background Task

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.

Meminimalkan waktu eksekusi

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.

Penggunaan pengidentifikasi yang benar

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.

Pengujian Background Task

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.

swift
// 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()
}

Hindari retain cycle

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.

Background Task vs BGTaskScheduler: perbandingan pendekatan

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.

KarakteristikBackground TaskBGTaskScheduler
Versi iOS4.0+13.0+
Waktu maks.30 detik30 dtk / 10 mnt (processing)
InisiasididEnterBackgroundPenjadwalan + sistem
Jaminan eksekusiHanya saat masuk ke latar belakangKapan saja saat sistem memungkinkan
Expiration handlerYa, wajibYa, melalui task.expirationHandler
InternetDiperlukan saat startupTersedia melalui requiresNetworkConnectivity
Pengisian dayaTidak diperlukanOpsional untuk processing

Kapan menggunakan Background Task

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.

Kapan menggunakan BGTaskScheduler

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.

Penggunaan bersama

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

Bisakah beginBackgroundTask dipanggil di luar didEnterBackground?

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.

Apa yang terjadi jika endBackgroundTask tidak dipanggil?

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.

Bagaimana cara memperpanjang waktu Background Task lebih dari 30 detik?

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.

Apakah Background Task berfungsi di iPad?

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.

Bagaimana cara men-debug Background Task di perangkat nyata?

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

  • Background Task — mekanisme iOS untuk menyelesaikan operasi setelah masuk ke latar belakang, tersedia sejak iOS 4.0.
  • beginBackgroundTask — metode UIApplication yang mendaftarkan tugas dan mengembalikan pengidentifikasi untuk penyelesaiannya.
  • Expiration handler — blok kode wajib yang dipanggil oleh sistem saat batas 30 detik habis.
  • endBackgroundTask — panggilan wajib untuk penyelesaian tugas yang benar; tanpanya aplikasi tetap di memori.
  • BGTaskScheduler — alternatif modern (iOS 13+) dengan penjadwalan, dua jenis tugas, dan kondisi eksekusi.
  • backgroundTimeRemaining — properti untuk memeriksa waktu tersisa dan menyesuaikan perilaku tugas.
  • Gunakan Background Task untuk operasi jangka pendek segera dan BGTaskScheduler untuk pembaruan latar belakang terjadwal di proyek baru.

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.

Diskusikan proyek

Baca juga