Notification Service Extension — bagaimana pemrosesan notifikasi bekerja

Penulis: IT Sectr Diterbitkan: 2026-06-16 Waktu membaca: 9 mnt

Notification Service Extension adalah ekstensi iOS yang mencegat notifikasi push segera setelah diterima, tetapi sebelum ditampilkan kepada pengguna. Ekstensi ini dapat mendekripsi payload yang dienkripsi, mengunduh dan melampirkan file media, mengubah teks atau judul notifikasi secara real-time. Menurut Apple Developer Documentation (2025), untuk mengaktifkan ekstensi, server harus mengirim kunci mutable-content:1 dalam atribut notifikasi — ini adalah satu-satunya syarat untuk menjalankan UNNotificationServiceExtension.

Poin utama

  • Notification Service Extension mengubah notifikasi push sebelum ditampilkan kepada pengguna di perangkat iOS
  • Untuk mengaktifkan ekstensi, diperlukan parameter mutable-content:1 dalam payload notifikasi dari server
  • Protokol utama — UNNotificationServiceExtension dengan metode didReceive(_:withContentHandler:) dan serviceExtensionTimeWillExpire()
  • Ekstensi dapat mengunduh lampiran media dari jaringan dan melampirkannya ke notifikasi melalui UNNotificationAttachment
  • Waktu eksekusi terbatas — sistem mengalokasikan sekitar 30 detik untuk pemrosesan penuh satu notifikasi

Apa itu Notification Service Extension

Notification Service Extension adalah ekstensi aplikasi di iOS yang mencegat notifikasi push yang masuk di sisi perangkat dan memungkinkan perubahan kontennya sebelum pengguna melihatnya. Ini adalah satu-satunya jenis ekstensi notifikasi yang bekerja dengan konten, bukan dengan tampilan.

Perbedaan utama dengan Notification Content Extension: Service Extension bekerja sebelum notifikasi ditampilkan dan dapat mengubah judul, tubuh, file suara, dan lampiran. Content Extension bekerja setelah ditampilkan dan hanya mengelola presentasi visual dari notifikasi yang sudah jadi. Kedua ekstensi ini dapat bekerja bersama: Service Extension mengunduh gambar, dan Content Extension menampilkannya di antarmuka khusus.

Ekstensi diaktifkan secara otomatis saat menerima notifikasi push dengan atribut mutable-content:1 di kamus aps. iOS menjalankan ekstensi di latar belakang, mengirimkan UNNotificationRequest asli, dan menunggu versi yang dimodifikasi untuk ditampilkan.

Memproses notifikasi push dengan cepat

UNNotificationServiceExtension menerima UNNotificationRequest lengkap dengan konten asli. Ekstensi dapat memodifikasi bidang UNNotificationContent apa pun: title, subtitle, body, userInfo, attachments, dan sound. Perubahan diterapkan sebelum notifikasi ditampilkan.

Skenario penggunaan umum

Dekripsi konten — jika notifikasi push berisi payload terenkripsi, ekstensi mendekripsinya sebelum ditampilkan. Unduh media — melampirkan gambar atau video ke notifikasi. Lokalisasi — menyesuaikan teks notifikasi dengan pengaturan regional perangkat. Pengayaan data — menambahkan informasi tambahan dari penyimpanan lokal atau cache.

Menurut Apple, skenario paling umum di antara aplikasi adalah mengunduh gambar untuk notifikasi media yang kaya. Server mengirim URL gambar dalam payload, ekstensi mengunduhnya ke direktori sementara dan membuat UNNotificationAttachment yang ditampilkan sistem di antarmuka standar atau khusus.

Memodifikasi teks dan judul

Ekstensi dapat menulis ulang teks notifikasi sepenuhnya, mengganti judul, atau menambahkan subtitle. Misalnya, aplikasi perpesanan dapat menerima notifikasi terenkripsi, mendekripsinya di ekstensi, dan menampilkan teks yang dapat dibaca. Atau aplikasi berita dapat menambahkan kategori berita ke subjudul sebelum ditampilkan.

swift
override func didReceive(
    _ request: UNNotificationRequest,
    withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void
) {
    let content = request.content.mutableCopy()
        as! UNMutableNotificationContent
    if let imageURL = content.userInfo["media-url"]
        as? String {
        downloadAndAttach(imageURL: imageURL,
            content: content,
            handler: contentHandler)
    }
}

Protokol UNNotificationServiceExtension

UNNotificationServiceExtension — kelas dasar yang diwarisi oleh Service Extension. Kelas ini mendefinisikan dua metode siklus hidup: didReceive(_:withContentHandler:) — metode pemrosesan utama, dan serviceExtensionTimeWillExpire() — penangan kedaluwarsa waktu.

Metode didReceive:withContentHandler:

didReceive(_:withContentHandler:) dipanggil saat menerima notifikasi. Ekstensi menerima UNNotificationRequest dan closure contentHandler yang harus dipanggil dengan UNMutableNotificationContent yang dimodifikasi. Ekstensi wajib memanggil contentHandler — jika tidak, iOS akan menampilkan notifikasi asli setelah waktu habis.

Penting: ekstensi hanya dapat memproses satu notifikasi dalam satu waktu. Jika beberapa notifikasi tiba secara bersamaan, iOS membuat instance ekstensi terpisah untuk masing-masing. Status global tidak dapat digunakan untuk pemrosesan berurutan.

Metode serviceExtensionTimeWillExpire:

serviceExtensionTimeWillExpire() dipanggil oleh sistem ketika sisa waktu eksekusi hampir habis. Dalam metode ini, segera panggil contentHandler dengan konten yang sudah siap saat itu — bahkan jika file media belum diunduh. Jika contentHandler tidak dipanggil dalam metode ini, iOS akan menampilkan notifikasi asli.

Disarankan untuk menyimpan konten minimum yang dapat diterima dalam metode ini — misalnya, notifikasi dengan teks dan judul, tetapi tanpa gambar yang unduhannya belum selesai tepat waktu.

Enkripsi dan lampiran media

UNNotificationAttachment — objek yang dibuat oleh ekstensi untuk melampirkan file media ke notifikasi. Ekstensi mengunduh file dari jaringan, menyimpannya di direktori sementara, dan membuat UNNotificationAttachment dengan menentukan jenis konten.

Membuat lampiran dari file yang diunduh

UNNotificationAttachment dibuat menggunakan inisialisasi init(identifier:url:options:). URL harus menunjuk ke file lokal di direktori sementara yang dapat diakses oleh ekstensi. Setelah dibuat, lampiran ditambahkan ke array attachments dari UNMutableNotificationContent.

Apple merekomendasikan penggunaan URLSession dengan konfigurasi latar belakang untuk mengunduh — saat menggunakan URLSession standar, pengunduhan memblokir thread dan menghabiskan waktu dari batas 30 detik. URLSession latar belakang melanjutkan pengunduhan bahkan setelah ekstensi berakhir, dan hasilnya dapat digunakan pada saat startup berikutnya.

Mendekripsi payload terenkripsi

Jika server mengirim notifikasi terenkripsi, ekstensi harus mendekripsi payload sebelum memanggil contentHandler. Dekripsi biasanya melibatkan permintaan kunci dari Keychain atau App Group, dekripsi melalui CommonCrypto, dan penggantian body atau userInfo notifikasi. Jika terjadi kesalahan dekripsi, contentHandler harus dipanggil dengan konten asli — sehingga pengguna setidaknya melihat bahwa notifikasi telah tiba, meskipun tidak terbaca.

swift
func downloadAndAttach(
    imageURL: String,
    content: UNMutableNotificationContent,
    handler: @escaping (UNNotificationContent) -> Void
) {
    let task = URLSession.shared.dataTask(with:
        URL(string: imageURL)!) { data, _, _ in
        let url = FileManager.default
            .temporaryDirectory
            .appendingPathComponent("image.jpg")
        try? data?.write(to: url)
        let attachment = try? UNNotificationAttachment(
            identifier: "image", url: url)
        content.attachments = [attachment].compactMap { $0 }
        handler(content)
    }
    task.resume()
}

Time-out dan mekanisme fallback

Notification Service Extension bekerja dalam batas waktu yang ketat. iOS mengalokasikan waktu eksekusi tetap — sekitar 30 detik sejak aktivasi. Jika ekstensi tidak memanggil contentHandler dalam waktu ini, sistem secara paksa menghentikan proses dan menampilkan notifikasi asli tanpa perubahan.

Strategi graceful degradation

Disarankan untuk menerapkan fallback bertingkat: pertama coba unduh media, jika berhasil — panggil contentHandler dengan konten lengkap; jika gagal — panggil contentHandler dengan teks tetapi tanpa media; jika terjadi kesalahan kritis — teruskan konten asli. Pendekatan ini menjamin bahwa pengguna selalu melihat notifikasi, bukan layar kosong.

Menurut Apple, penyebab paling umum dari time-out adalah pengunduhan file media besar pada koneksi lambat. Untuk mengurangi risiko, disarankan untuk mengoptimalkan ukuran gambar di server — kirim pratinjau hingga 300 KB, bukan resolusi penuh. Gambar resolusi penuh sebaiknya diunduh saat membuka aplikasi.

Pemantauan kinerja

Untuk melacak time-out dan kesalahan ekstensi, dapat digunakan os_log untuk menulis pesan diagnostik ke Unified Logging System. Meskipun pencatatan langsung ke file di ekstensi sulit dilakukan, os_log memungkinkan analisis kinerja melalui Console.app di perangkat pengembang. Apple merekomendasikan menambahkan metrik pada setiap panggilan didReceive — waktu unduh, ukuran file, hasil operasi.

swift
override func serviceExtensionTimeWillExpire() {
    let fallback = bestEffortContent as?
        UNMutableNotificationContent
        ?? request.content.mutableCopy()
        as! UNMutableNotificationContent
    contentHandler(fallback)
}

Pertanyaan yang sering diajukan

Bagaimana server mengaktifkan Notification Service Extension?

Server menambahkan kunci mutable-content:1 ke kamus aps notifikasi push. Tanpa parameter ini, sistem mengabaikan ekstensi dan menampilkan notifikasi standar.

Bisakah ekstensi digunakan tanpa mutable-content?

Tidak. mutable-content:1 adalah syarat wajib untuk aktivasi Service Extension. Jika kunci tidak ada atau diatur ke 0, notifikasi ditampilkan tanpa memanggil ekstensi.

Apa yang terjadi jika batas 30 detik terlampaui?

iOS secara paksa menghentikan ekstensi dan menampilkan notifikasi asli tanpa perubahan. Untuk menghindari ini, implementasikan serviceExtensionTimeWillExpire() dengan konten minimum yang dapat diterima.

Bagaimana cara meneruskan kunci enkripsi ke ekstensi?

Melalui App Group (UserDefaults atau file bersama) atau Keychain dengan akses bersama antara aplikasi dan ekstensi. Meneruskan kunci secara langsung di payload notifikasi tidak aman.

Berapa banyak file media yang dapat dilampirkan di Service Extension?

Hingga 4 lampiran per notifikasi, masing-masing hingga 50 MB. Ukuran total lampiran memengaruhi waktu unduh — semakin banyak file, semakin tinggi risiko time-out.

Kesimpulan

  • Notification Service Extension mengubah notifikasi push di perangkat sebelum ditampilkan, mengedit teks, judul, dan lampiran media
  • Untuk aktivasi, diperlukan kunci mutable-content:1 di kamus aps — tanpanya ekstensi tidak berjalan
  • Protokol utama UNNotificationServiceExtension mendefinisikan metode didReceive dan serviceExtensionTimeWillExpire untuk pemrosesan
  • Ekstensi dapat mengunduh media dari jaringan, mendekripsi payload, dan menambahkan hingga 4 lampiran ke notifikasi
  • Waktu eksekusi terbatas sekitar 30 detik — jika terlampaui, iOS menampilkan notifikasi asli
  • Strategi graceful degradation dengan fallback bertingkat direkomendasikan untuk mencegah notifikasi kosong

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