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