Notification Extension: konsep kunci, jenis ekstensi, dan konfigurasi

Penulis: IT Sectr Diterbitkan: 2026-03-20 Waktu membaca: 8 mnt

Notification Extension adalah mekanisme iOS yang memungkinkan modifikasi konten dan tampilan notifikasi push sebelum ditampilkan kepada pengguna. Ekstensi bekerja di sisi sistem operasi dalam proses terpisah: UNNotificationServiceExtension memproses konten masuk, dan UNNotificationContentExtension mengelola antarmuka. Menurut Apple Developer Documentation, 2026, Service Extension mendapat hingga 30 detik untuk menjalankan tugas sebelum notifikasi ditampilkan. Batasan ini kritis saat memuat lampiran atau mendekripsi data.

Poin Utama

  • Service Extension — mencegat notifikasi sebelum ditampilkan, memungkinkan perubahan teks, penambahan media, dan dekripsi data dengan batas 30 detik.
  • Content Extension — membuat antarmuka notifikasi kustom dengan UI arbitrer, tombol, dan pemrosesan sentuhan melalui storyboard atau SwiftUI.
  • Lampiran media — gambar, video, dan audio ditambahkan melalui UNNotificationAttachment di Service Extension sebelum diteruskan ke Content Extension.
  • Pendaftaran — kedua ekstensi didaftarkan di Info.plist sebagai target terpisah dengan menentukan kategori notifikasi dan NSExtensionPointIdentifier.
  • Keterbatasan — ekstensi tidak memiliki akses ke aplikasi utama, beroperasi di sandbox terisolasi dengan batas memori 50 MB.

Apa itu Notification Extension

Notification Extension adalah komponen perangkat lunak iOS yang memperluas perilaku standar notifikasi push, menambahkan kemampuan untuk memodifikasi konten dan menyesuaikan antarmuka. Tidak seperti notifikasi biasa yang ditampilkan oleh sistem dalam bentuk standar, ekstensi memungkinkan pengembang memengaruhi konten sebelum ditampilkan dan membuat antarmuka pengguna yang unik.

Dua jenis ekstensi notifikasi

Apple menyediakan dua jenis Notification Extension untuk tujuan berbeda: UNNotificationServiceExtension bertanggung jawab untuk memproses payload masuk, dan UNNotificationContentExtension mengelola tampilan. Service Extension diluncurkan sebelum notifikasi ditampilkan dan memiliki waktu terbatas untuk dieksekusi — hingga 30 detik menurut Apple Developer Documentation. Content Extension diaktifkan setelah pengguna berinteraksi dengan notifikasi dan menampilkan tampilan kustom.

Perbedaan dari notifikasi standar

Notifikasi push standar iOS ditampilkan secara otomatis oleh sistem berdasarkan bidang alert, title, dan subtitle dari JSON-payload. Notification Extension mengambil alih kendali: Service Extension menerima payload mentah, memodifikasinya, dan meneruskannya ke sistem untuk ditampilkan. Content Extension mengganti banner standar dengan antarmuka arbitrer dengan elemen kontrol apa pun.

Siklus hidup ekstensi

Ketika perangkat menerima notifikasi push dengan kunci mutable-content: 1, sistem meluncurkan Service Extension dalam proses terpisah. Proses ekstensi diisolasi dari aplikasi utama dan memiliki sandbox sendiri dengan batas memori 50 MB. Setelah pemrosesan selesai, ekstensi memanggil completion handler, meneruskan UNNotificationContent yang dimodifikasi ke sistem untuk ditampilkan.

UNNotificationServiceExtension: modifikasi konten

UNNotificationServiceExtension adalah alat utama untuk mengubah notifikasi push secara terprogram sebelum ditampilkan kepada pengguna. Ekstensi diaktifkan secara otomatis saat menerima notifikasi yang payload-nya memiliki flag mutable-content: 1. Dalam 30 detik, ekstensi dapat memuat lampiran media, mengubah teks, mendekripsi data terenkripsi, atau memperkaya konten.

Metode protokol UNNotificationServiceExtension

Ekstensi mengimplementasikan dua metode kunci dari protokol UNNotificationServiceExtension. Metode didReceive menerima permintaan masuk dengan UNNotificationRequest mentah dan memungkinkan modifikasinya melalui completion handler dengan UNNotificationContent baru. Metode serviceExtensionTimeWillExpire dipanggil oleh sistem satu detik sebelum batas waktu berakhir — di sini pemrosesan harus diselesaikan dan hasil saat ini (mungkin parsial) diteruskan.

Contoh: menambahkan gambar ke notifikasi

Pertimbangkan skenario di mana server mengirim push dengan URL gambar di bidang kustom. Service Extension memuat gambar ini melalui jaringan, membuat UNNotificationAttachment, dan menambahkannya ke konten. UNNotificationAttachment menerima file lokal gambar, video, atau audio dan secara otomatis menyalinnya ke sandbox ekstensi. Setelah attachment dibuat, ekstensi meneruskan konten yang diperbarui ke sistem.

swift
class NotificationService: UNNotificationServiceExtension {

    override func didReceive(_ request: UNNotificationRequest,
        withContentHandler contentHandler:
        @escaping (UNNotificationContent) -> Void) {

        let userInfo = request.content.userInfo
        guard let imageURL = URL(string: userInfo["image-url"] as! String)
        else { contentHandler(request.content); return }

        let attachment = try! UNNotificationAttachment(
            identifier: "image", url: imageURL,
            options: [UNNotificationAttachmentOptionsTypeHintKey: "jpg"])

        let modifiedContent = request.content.mutableCopy()
            as! UNMutableNotificationContent
        modifiedContent.attachments = [attachment]
        contentHandler(modifiedContent)
    }

    override func serviceExtensionTimeWillExpire() {
        contentHandler?(bestAttemptContent ?? request.content)
    }
}

Caching dan penggunaan kembali

Saat sering mengirim notifikasi dengan lampiran yang sama, disarankan untuk menyimpan file yang diunduh di perangkat. FileManager menyediakan akses ke direktori cache ekstensi, yang disimpan di antara peluncuran. Ini mengurangi waktu pemrosesan notifikasi berikutnya dan mengurangi beban jaringan. Menurut Apple, caching lampiran dapat mengurangi waktu pemrosesan menjadi 2–5 detik, bukan pemuatan penuh.

UNNotificationContentExtension: antarmuka kustom

UNNotificationContentExtension memungkinkan penggantian banner notifikasi standar dengan antarmuka kustom yang dibuat di Interface Builder atau SwiftUI. Ekstensi diaktifkan ketika pengguna melakukan tindakan dengan notifikasi: sentuhan, geser ke bawah, atau 3D Touch. Content Extension menerima konten yang sudah diproses oleh Service Extension dan menampilkannya dalam tampilan kustom.

Storyboard dan kategori notifikasi

Setiap Content Extension terikat ke satu atau beberapa kategori notifikasi melalui Info.plist. Kategori ditentukan di server oleh bidang category di payload APNS. Sistem secara otomatis memilih ekstensi yang tepat berdasarkan kategori notifikasi yang diterima. Antarmuka dibangun melalui storyboard menggunakan komponen UIKit standar atau SwiftUI View.

Pemrosesan tindakan pengguna

Content Extension mendukung tombol kustom dan penangan sentuhan yang didefinisikan di UNNotificationAction. UNNotificationAction dibuat pada tahap pendaftaran kategori dan dapat berupa input teks melalui UNTextInputNotificationAction. Saat pengguna menekan tombol, ekstensi menerima callback didReceive dengan pengidentifikasi tindakan dan dapat menjalankan logika yang sesuai — membuka URL, mengirim permintaan ke server, atau memperbarui antarmuka.

Keterbatasan kinerja

Content Extension beroperasi dalam proses terisolasi dengan siklus eksekusi sendiri dan batas memori sekitar 50 MB. Kinerja ekstensi sangat penting karena watchdog sistem menghentikan proses saat melebihi batas. Dianjurkan untuk menghindari perhitungan berat, memuat gambar besar, dan permintaan jaringan panjang di dalam Content Extension.

Lampiran media dan UNNotificationAttachment

UNNotificationAttachment adalah objek yang menambahkan file media ke notifikasi push: gambar, video, audio, atau GIF. Lampiran dibuat dari URL file lokal yang harus berada di sandbox ekstensi. Ukuran maksimum lampiran tidak boleh melebihi 10 MB, jika tidak sistem akan menolak attachment saat pembuatan.

Format yang didukung

Apple mendukung serangkaian format terbatas untuk lampiran media. Gambar — JPEG, PNG, GIF (termasuk animasi), TIFF. Video — MPEG, MP4, MOV dengan durasi maksimum 30 detik. Audio — MP3, AAC, WAV, CAF. Untuk setiap format, tipe dapat ditentukan melalui UNNotificationAttachmentOptionsTypeHintKey, yang membantu sistem memproses file dengan benar.

Memuat lampiran dari jaringan

Karena payload push hanya berisi URL, bukan file itu sendiri, pemuatan lampiran harus dilakukan di dalam Service Extension. Waktu muat maksimum dibatasi hingga 30 detik, oleh karena itu disarankan menggunakan URLSession dengan pengaturan minimal dan menonaktifkan pemuatan saat sinyal lemah. Jika lampiran tidak dimuat tepat waktu, notifikasi ditampilkan tanpa media — ini adalah perilaku default sistem.

Contoh implementasi di Swift

Mari kita lihat contoh lengkap Notification Extension yang memuat gambar, mengunduhnya, dan menambahkannya ke notifikasi. NotificationService mewarisi UNNotificationServiceExtension dan menimpa metode didReceive. Contoh ini menunjukkan pemrosesan bidang opsional, pembuatan attachment, dan pemanggilan completion handler dengan konten yang dimodifikasi.

swift
import UserNotifications

class NotificationService: UNNotificationServiceExtension {

    var contentHandler: ((UNNotificationContent) -> Void)?
    var bestAttemptContent: UNMutableNotificationContent?

    override func didReceive(
        _ request: UNNotificationRequest,
        withContentHandler contentHandler:
        @escaping (UNNotificationContent) -> Void
    ) {
        self.contentHandler = contentHandler
        self.bestAttemptContent =
            (request.content.mutableCopy()
                as! UNMutableNotificationContent)

        guard let attachmentURLString =
            bestAttemptContent?.userInfo["attachment-url"] as? String,
            let url = URL(string: attachmentURLString)
        else {
            contentHandler(request.content)
            return
        }

        URLSession.shared.downloadTask(with: url) {
            [weak self] localURL, _, error in
            guard let localURL = localURL, error == nil
            else {
                contentHandler(request.content)
                return
            }
            let attachment = try! UNNotificationAttachment(
                identifier: "media", url: localURL)
            self?.bestAttemptContent?.attachments = [attachment]
            contentHandler(self?.bestAttemptContent
                ?? request.content)
        }.resume()
    }

    override func serviceExtensionTimeWillExpire() {
        if let content = bestAttemptContent {
            contentHandler?(content)
        }
    }
}

Konfigurasi Info.plist untuk ekstensi

Untuk pengoperasian ekstensi yang benar, kategori notifikasi harus didaftarkan di Info.plist. Kunci NSExtensionPointIdentifier diatur ke com.apple.usernotifications.service untuk Service Extension atau com.apple.usernotifications.content untuk Content Extension. Kategori ditentukan di AppDelegate saat memulai aplikasi melalui UNUserNotificationCenter, dan ekstensi hanya diaktifkan untuk notifikasi dengan kategori yang sesuai di payload.

Pertanyaan yang Sering Diajukan

Apa perbedaan antara Service Extension dan Content Extension?

Service Extension memodifikasi konten sebelum notifikasi ditampilkan — menambahkan media, mengubah teks, mendekripsi data. Content Extension mengganti antarmuka notifikasi dengan yang kustom setelah interaksi pengguna. Service Extension bekerja sebelum ditampilkan, Content Extension — setelahnya.

Berapa banyak waktu yang diberikan untuk pemrosesan di Service Extension?

Sistem mengalokasikan 30 detik untuk menjalankan kode di didReceive. Jika pemrosesan tidak selesai dalam waktu ini, serviceExtensionTimeWillExpire dipanggil, di mana hasil saat ini harus diteruskan. Disarankan untuk menyelesaikan dalam 10–15 detik, dengan mempertimbangkan pemuatan lampiran.

Bisakah SwiftUI digunakan di Content Extension?

Ya, SwiftUI didukung di Content Extension mulai iOS 16. View dibungkus dalam UIHostingController dan ditambahkan ke storyboard. Namun, karena batasan memori, disarankan menggunakan SwiftUI hanya untuk antarmuka sederhana dengan jumlah elemen minimal.

Bagaimana cara menangani kesalahan pemuatan lampiran?

Saat terjadi kesalahan pemuatan atau melebihi batas waktu, cukup panggil completion handler dengan konten asli tanpa attachment. Sistem akan menampilkan notifikasi dalam bentuk standar tanpa media. Catat kesalahan melalui OSLog untuk diagnostik, tetapi jangan memblokir tampilan notifikasi.

Apa batasan memori Notification Extension?

Ekstensi beroperasi dalam proses terisolasi dengan batas sekitar 50 MB. Saat melebihi batas, sistem menghentikan proses melalui watchdog. Hindari memuat file besar, menyimpan gambar di memori, dan kebocoran memori saat bekerja dengan URLSession.

Ringkasan

  • Notification Extension — mekanisme iOS untuk memodifikasi notifikasi push, termasuk Service Extension (konten) dan Content Extension (antarmuka).
  • Service Extension memproses payload sebelum notifikasi ditampilkan dengan batas 30 detik, dapat menambahkan lampiran media dan mendekripsi data.
  • Content Extension mengganti banner standar dengan antarmuka kustom melalui UIKit atau SwiftUI dengan dukungan tombol interaktif.
  • UNNotificationAttachment menambahkan gambar, video, dan audio ke notifikasi, mendukung format JPEG, PNG, MP4, MP3, dan lainnya.
  • Pendaftaran ekstensi dilakukan melalui Info.plist dengan menentukan NSExtensionPointIdentifier dan kategori notifikasi untuk aktivasi.
  • Keterbatasan — batas memori 50 MB, sandbox terisolasi tanpa akses ke aplikasi utama, waktu eksekusi terbatas.
  • Notification Extension adalah alat kunci untuk membuat notifikasi pengguna yang kaya, meningkatkan keterlibatan dan fungsionalitas komunikasi push di iOS.

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