Notification Extension: Temel kavramlar, uzantı türleri ve kurulum

Yazar: IT Sectr Yayınlanma: 2026-03-20 Okuma süresi: 8 dk

Notification Extension, push bildirimlerini kullanıcıya göstermeden önce içeriğini ve görünümünü değiştirmeye olanak tanıyan bir iOS mekanizmasıdır. Uzantılar, işletim sistemi tarafında ayrı bir süreçte çalışır: UNNotificationServiceExtension gelen içeriği işlerken, UNNotificationContentExtension arayüzü yönetir. Apple Developer Documentation, 2026'ya göre, Service Extension bildirim gösterilmeden önce görevleri gerçekleştirmek için 30 saniyeye kadar süre alır. Bu sınırlama, ek dosyaları indirirken veya verilerin şifresini çözerken kritiktir.

Önemli Noktalar

  • Service Extension — bildirimi göstermeden önce yakalar, metin değiştirme, medya ekleme ve 30 saniyelik sınırla veri şifre çözme olanağı sağlar.
  • Content Extension — storyboard veya SwiftUI aracılığıyla özel UI, düğmeler ve dokunma işleme ile özel bir bildirim arayüzü oluşturur.
  • Medya ekleri — görseller, videolar ve ses, Content Extension'a geçmeden önce Service Extension'da UNNotificationAttachment aracılığıyla eklenir.
  • Kayıt — her iki uzantı da Info.plist'te bildirim kategorileri ve NSExtensionPointIdentifier belirtilerek ayrı hedef olarak kaydedilir.
  • Sınırlamalar — uzantıların ana uygulamaya erişimi yoktur, 50 MB bellek sınırı olan izole bir kum havuzunda çalışır.

Notification Extension Nedir

Notification Extension, push bildirimlerinin standart davranışını içerik değiştirme ve arayüz özelleştirme yeteneği ekleyerek genişleten bir iOS yazılım bileşenidir. Sistem tarafından standart biçimde görüntülenen sıradan bildirimlerin aksine, uzantılar geliştiricinin görüntülemeden önce içeriği etkilemesine ve benzersiz bir kullanıcı arayüzü oluşturmasına olanak tanır.

İki Tür Bildirim Uzantısı

Apple, farklı amaçlar için iki tür Notification Extension sağlar: UNNotificationServiceExtension gelen yük işlemesini üstlenirken, UNNotificationContentExtension görüntülemeyi yönetir. Service Extension, bildirim gösterilmeden önce çalışır ve Apple Developer Documentation'a göre 30 saniyeye kadar sınırlı yürütme süresine sahiptir. Content Extension, kullanıcı bildirimle etkileşime girdikten sonra etkinleşir ve özel bir görünüm görüntüler.

Standart Bildirimlerden Farkı

Standart bir iOS push bildirimi, JSON yükünün alert, title ve subtitle alanlarına göre sistem tarafından otomatik olarak görüntülenir. Notification Extension kontrolü yakalar: Service Extension ham yükü alır, değiştirir ve görüntüleme için sisteme iletir. Content Extension, standart banner'ı herhangi bir kontrol öğesiyle özel bir arayüzle değiştirir.

Uzantı Yaşam Döngüsü

Cihaz, mutable-content: 1 anahtarıyla bir push bildirimi aldığında, sistem ayrı bir süreçte Service Extension'ı başlatır. Uzantı süreci ana uygulamadan izole edilmiştir ve 50 MB bellek sınırı olan kendi kum havuzuna sahiptir. İşlem tamamlandıktan sonra, uzantı completion handler'ı çağırır ve değiştirilmiş UNNotificationContent'i görüntüleme için sisteme iletir.

UNNotificationServiceExtension: İçerik Değişikliği

UNNotificationServiceExtension, push bildirimlerini kullanıcıya göstermeden önce programlı olarak değiştirmek için birincil araçtır. Uzantı, yükünde mutable-content: 1 bayrağı ayarlanmış bir bildirim alındığında otomatik olarak etkinleşir. 30 saniye içinde uzantı, bir medya eki indirebilir, metni değiştirebilir, şifrelenmiş verilerin şifresini çözebilir veya içeriği zenginleştirebilir.

UNNotificationServiceExtension Protokol Yöntemleri

Uzantı, UNNotificationServiceExtension protokolünden iki ana yöntemi uygular. didReceive yöntemi ham UNNotificationRequest ile gelen isteği alır ve yeni bir UNNotificationContent ile completion handler aracılığıyla değişikliğe izin verir. serviceExtensionTimeWillExpire yöntemi, zaman aşımından bir saniye önce sistem tarafından çağrılır — bu yöntemde işlemi tamamlamanız ve mevcut (muhtemelen kısmi) sonucu iletmeniz gerekir.

Örnek: Bildirime Görsel Ekleme

Sunucunun özel bir alanda görsel URL'si olan bir push gönderdiği bir senaryo düşünün. Service Extension bu görseli ağ üzerinden indirir, bir UNNotificationAttachment oluşturur ve içeriğe ekler. UNNotificationAttachment yerel bir görsel, video veya ses dosyasını kabul eder ve otomatik olarak uzantının kum havuzuna kopyalar. Ek oluşturulduktan sonra, uzantı güncellenmiş içeriği sisteme iletir.

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

Önbelleğe Alma ve Yeniden Kullanma

Aynı ekleri içeren bildirimler sık sık gönderildiğinde, indirilen dosyaların cihazda önbelleğe alınması önerilir. FileManager, başlatmalar arasında kalıcı olan uzantının önbellek dizinine erişim sağlar. Bu, sonraki bildirimlerin işlem süresini azaltır ve ağ yükünü düşürür. Apple'a göre, önbelleğe alma işlem süresini tam indirme yerine 2–5 saniyeye düşürebilir.

UNNotificationContentExtension: Özel Arayüz

UNNotificationContentExtension, standart bildirim banner'ını Interface Builder veya SwiftUI'de oluşturulan özel bir arayüzle değiştirmeye olanak tanır. Uzantı, kullanıcı bildirimde bir eylem gerçekleştirdiğinde etkinleşir: dokunma, aşağı kaydırma veya 3D Touch. Content Extension, Service Extension tarafından zaten işlenmiş içeriği alır ve özel bir görünümde görüntüler.

Storyboard ve Bildirim Kategorileri

Her Content Extension, Info.plist aracılığıyla bir veya daha fazla bildirim kategorisine bağlanır. Kategori, sunucuda APNS yükündeki category alanı tarafından tanımlanır. Sistem, alınan bildirimin kategorisine göre uygun uzantıyı otomatik olarak seçer. Arayüz, standart UIKit bileşenleri veya SwiftUI View kullanılarak storyboard aracılığıyla oluşturulur.

Kullanıcı Eylemlerini İşleme

Content Extension, UNNotificationAction'da tanımlanan özel düğmeleri ve dokunma işleyicilerini destekler. UNNotificationAction, kategori kaydı aşamasında oluşturulur ve UNTextInputNotificationAction aracılığıyla metin girişini destekleyebilir. Kullanıcı bir düğmeye bastığında, uzantı eylem tanımlayıcısıyla didReceive geri çağrısını alır ve ilgili mantığı yürütebilir — URL açma, sunucuya istek gönderme veya arayüzü güncelleme.

Performans Sınırlamaları

Content Extension, kendi çalışma döngüsü ve yaklaşık 50 MB bellek sınırı olan izole bir süreçte çalışır. Uzantının performansı kritiktir çünkü sistem watchdogs'u sınırlar aşıldığında süreci sonlandırır. Content Extension içinde ağır hesaplamalardan, büyük görseller yüklemekten ve uzun ağ isteklerinden kaçınılması önerilir.

Medya Ekleri ve UNNotificationAttachment

UNNotificationAttachment, push bildirimine bir medya dosyası (görsel, video, ses veya GIF) ekleyen bir nesnedir. Ek, uzantının kum havuzunda bulunması gereken yerel bir dosya URL'sinden oluşturulur. Maksimum ek boyutu 10 MB'ı geçmemelidir, aksi takdirde sistem oluşturma sırasında eki reddeder.

Desteklenen Biçimler

Apple, medya ekleri için sınırlı bir biçim kümesini destekler. Görseller — JPEG, PNG, GIF (animasyonlu dahil), TIFF. Video — MPEG, MP4, MOV (maksimum 30 saniye süreyle). Ses — MP3, AAC, WAV, CAF. Her biçim için UNNotificationAttachmentOptionsTypeHintKey aracılığıyla tür belirtilebilir, bu da sistemin dosyayı doğru şekilde işlemesine yardımcı olur.

Ekleri Ağdan İndirme

Push yükü yalnızca bir URL içerdiğinden, dosyanın kendisini değil, ek indirme işlemi Service Extension içinde yapılmalıdır. Maksimum indirme süresi 30 saniye ile sınırlıdır, bu nedenle minimum ayarlarla URLSession kullanılması ve zayıf sinyalde indirmenin devre dışı bırakılması önerilir. Ek zamanında yüklenmezse, bildirim medya olmadan görüntülenir — bu varsayılan sistem davranışıdır.

Swift'te Uygulama Örneği

Bir görseli indiren, kaydeden ve bildirime ekleyen tam bir Notification Extension örneğini inceleyelim. NotificationService, UNNotificationServiceExtension'dan miras alır ve didReceive yöntemini geçersiz kılar. Örnek, isteğe bağlı alanların işlenmesini, ek oluşturmayı ve değiştirilmiş içerikle completion handler'ı çağırmayı gösterir.

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

Uzantı için Info.plist Yapılandırması

Uzantının doğru çalışması için Info.plist'te bildirim kategorilerinin kaydedilmesi gerekir. NSExtensionPointIdentifier anahtarı Service Extension için com.apple.usernotifications.service veya Content Extension için com.apple.usernotifications.content olarak ayarlanır. Kategoriler, UNUserNotificationCenter aracılığıyla uygulama başlatılırken AppDelegate'te tanımlanır ve uzantı yalnızca yükte eşleşen kategorisi olan bildirimler için etkinleşir.

Sıkça Sorulan Sorular

Service Extension ile Content Extension arasındaki fark nedir?

Service Extension bildirim görüntülenmeden önce içeriği değiştirir — medya ekler, metni değiştirir, verilerin şifresini çözer. Content Extension, kullanıcı etkileşiminden sonra bildirim arayüzünü özel bir arayüzle değiştirir. Service Extension görüntülemeden önce, Content Extension sonra çalışır.

Service Extension'da işleme için ne kadar süre verilir?

Sistem, didReceive'da kod yürütme için 30 saniye ayırır. İşlem bu süre içinde tamamlanmazsa, serviceExtensionTimeWillExpire çağrılır ve mevcut sonucu iletmeniz gerekir. Ek indirmeleri hesaba katarak 10–15 saniye içinde kalmak önerilir.

Content Extension'da SwiftUI kullanılabilir mi?

Evet, iOS 16'dan itibaren Content Extension'da SwiftUI desteklenmektedir. View, bir UIHostingController içine sarılır ve storyboard'a eklenir. Ancak bellek sınırlamaları nedeniyle SwiftUI'nin yalnızca minimum sayıda öğeye sahip basit arayüzler için kullanılması önerilir.

Ek indirme hataları nasıl işlenir?

İndirme hatası veya zaman aşımı durumunda, ek olmadan orijinal içerikle completion handler'ı çağırmanız yeterlidir. Sistem bildirimi medya olmadan standart biçimde görüntüleyecektir. Teşhis için OSLog aracılığıyla hataları günlüğe kaydedin, ancak bildirim görüntülemesini engellemeyin.

Notification Extension'ın bellek sınırları nelerdir?

Uzantı, yaklaşık 50 MB sınırı olan izole bir süreçte çalışır. Aşıldığında, sistem watchdog aracılığıyla süreci sonlandırır. Büyük dosyalar yüklemekten, bellekte görsel depolamaktan ve URLSession ile çalışırken sızıntılardan kaçının.

Özet

  • Notification Extension — push bildirimlerini değiştirmek için Service Extension (içerik) ve Content Extension (arayüz) içeren bir iOS mekanizmasıdır.
  • Service Extension 30 saniye sınırıyla bildirim görüntülenmeden önce yükü işler, medya ekleri ekleyebilir ve verilerin şifresini çözebilir.
  • Content Extension etkileşimli düğmeler desteğiyle UIKit veya SwiftUI aracılığıyla standart banner'ı özel bir arayüzle değiştirir.
  • UNNotificationAttachment bildirimlere görsel, video ve ses ekler, JPEG, PNG, MP4, MP3 ve diğer biçimleri destekler.
  • Uzantı kaydı, etkinleştirme için NSExtensionPointIdentifier ve bildirim kategorileri belirtilerek Info.plist aracılığıyla yapılır.
  • Sınırlamalar — 50 MB bellek sınırı, ana uygulamaya erişimi olmayan izole kum havuzu, sınırlı yürütme süresi.
  • Notification Extension, iOS'ta push iletişiminin etkileşimini ve işlevselliğini artıran zengin kullanıcı bildirimleri oluşturmak için önemli bir araçtır.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun