Notification Service Extension — push bildirimi işleme nasıl çalışır

Yazar: IT Sectr Yayınlanma: 2026-06-16 Okuma süresi: 9 dk

Notification Service Extension, bir push bildirimini alındıktan hemen sonra ancak kullanıcıya gösterilmeden önce yakalayan bir iOS uzantısıdır. Uzantı, şifrelenmiş yükü çözebilir, medya dosyalarını indirip ekleyebilir ve bildirimin metnini veya başlığını gerçek zamanlı olarak değiştirebilir. Apple Geliştirici Dokümantasyonu'na (2025) göre, uzantıyı etkinleştirmek için sunucunun bildirim özniteliklerinde mutable-content:1 anahtarını göndermesi gerekir — bu, UNNotificationServiceExtension'ı başlatmanın tek koşuludur.

Önemli Noktalar

  • Notification Service Extension, bir iOS cihazında kullanıcıya gösterilmeden önce push bildirimini değiştirir
  • Uzantının etkinleştirilmesi, sunucu bildirim yükünde mutable-content:1 parametresini gerektirir
  • Ana protokol, didReceive(_:withContentHandler:) ve serviceExtensionTimeWillExpire() yöntemlerine sahip UNNotificationServiceExtension'dır
  • Uzantı, ağdan medya ekleri indirebilir ve UNNotificationAttachment aracılığıyla bildirime ekleyebilir
  • Yürütme süresi sınırlıdır — sistem, tek bir bildirimin tam işlenmesi için yaklaşık 30 saniye ayırır

Notification Service Extension Nedir

Notification Service Extension, iOS'ta cihaz tarafında gelen bir push bildirimini yakalayan ve kullanıcının görmeden önce içeriğini değiştirmesine izin veren bir uygulama uzantısıdır. Bu, görüntüleme yerine içerikle çalışan tek bildirim uzantısı türüdür.

Notification Content Extension'dan temel fark: Service Extension, bildirim gösterilmeden önce çalışır ve başlığı, gövdeyi, ses dosyasını ve ekleri değiştirebilir. Content Extension, gösterildikten sonra çalışır ve yalnızca hazır bildirimin görsel sunumunu yönetir. Bu iki uzantı birlikte çalışabilir: Service Extension bir resim indirir ve Content Extension bunu özel bir arayüzde görüntüler.

Uzantı, aps sözlüğünde mutable-content:1 özniteliğine sahip bir push bildirimi alındığında otomatik olarak etkinleştirilir. iOS, uzantıyı arka planda başlatır, orijinal UNNotificationRequest'i iletir ve görüntülenmek üzere değiştirilmiş bir sürüm bekler.

Push Bildirimlerini Anında İşleme

UNNotificationServiceExtension, orijinal içerikle birlikte tam UNNotificationRequest'i alır. Uzantı, UNNotificationContent'in herhangi bir alanını değiştirebilir: title, subtitle, body, userInfo, attachments ve sound. Değişiklikler, bildirim gösterilmeden önce uygulanır.

Tipik Kullanım Senaryoları

İçerik şifre çözme — bir push bildirimi şifrelenmiş yük içeriyorsa, uzantı görüntülemeden önce şifresini çözer. Medya indirme — bildirime bir resim veya video eklemek. Yerelleştirme — bildirim metnini cihazın bölgesel ayarlarına uyarlamak. Veri zenginleştirme — yerel depolama veya önbellekten ek bilgi eklemek.

Apple'a göre, uygulamalar arasında en yaygın senaryo, zengin medya bildirimleri için resim indirmedir. Sunucu, yükte bir resim URL'si gönderir, uzantı bunu geçici bir dizine indirir ve bir UNNotificationAttachment oluşturur; sistem bunu standart veya özel bir arayüzde görüntüler.

Metin ve Başlık Değişikliği

Uzantı, bildirim metnini tamamen yeniden yazabilir, başlığı değiştirebilir veya bir alt başlık ekleyebilir. Örneğin, bir mesajlaşma uygulaması şifrelenmiş bir bildirim alabilir, uzantıda şifresini çözebilir ve okunabilir metin görüntüleyebilir. Veya bir haber uygulaması, görüntülemeden önce alt başlığa bir haber kategorisi ekleyebilir.

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

UNNotificationServiceExtension Protokolü

UNNotificationServiceExtension, Service Extension'ın miras aldığı temel sınıftır. Sınıf iki yaşam döngüsü yöntemi tanımlar: didReceive(_:withContentHandler:) — ana işleme yöntemi ve serviceExtensionTimeWillExpire() — zaman aşımı işleyicisi.

didReceive:withContentHandler: Yöntemi

didReceive(_:withContentHandler:), bir bildirim alındığında çağrılır. Uzantı, bir UNNotificationRequest ve değiştirilmiş UNMutableNotificationContent ile çağrılması gereken bir contentHandler kapanışı alır. Uzantı, contentHandler'ı çağırmakla yükümlüdür — çağırmazsa, iOS zaman aşımından sonra orijinal bildirimi gösterir.

Önemli: uzantı aynı anda yalnızca bir bildirimi işleyebilir. Aynı anda birden fazla bildirim gelirse, iOS her biri için ayrı uzantı örnekleri oluşturur. Sıralı işleme için genel durum kullanılamaz.

serviceExtensionTimeWillExpire: Yöntemi

serviceExtensionTimeWillExpire(), kalan yürütme süresi dolmak üzereyken sistem tarafından çağrılır. Bu yöntemde, o anda hazır olan herhangi bir içerikle derhal contentHandler'ı çağırmanız gerekir — medya dosyası indirmesi tamamlanmamış olsa bile. Bu yöntemde contentHandler'ı çağırmazsanız, iOS orijinal bildirimi gösterir.

Bu yöntemde minimum kabul edilebilir içerik kaydedilmesi önerilir — örneğin, metin ve başlığı olan ancak indirmesi zamanında tamamlanmamış bir resmi olmayan bildirim.

Şifreleme ve Medya Ekleri

UNNotificationAttachment, bildirime bir medya dosyası eklemek için uzantı tarafından oluşturulan bir nesnedir. Uzantı, dosyayı ağdan indirir, geçici bir dizine kaydeder ve içerik türünü belirterek bir UNNotificationAttachment oluşturur.

İndirilen Dosyadan Ek Oluşturma

UNNotificationAttachment, init(identifier:url:options:) başlatıcısı kullanılarak oluşturulur. URL, uzantının erişebileceği geçici dizindeki yerel bir dosyayı işaret etmelidir. Oluşturulduktan sonra ek, UNMutableNotificationContent'in attachments dizisine eklenir.

Apple, indirme için arka plan yapılandırmalı URLSession kullanılmasını önerir — standart URLSession kullanıldığında, indirme iş parçacığını bloke eder ve 30 saniyelik sınırdan zaman tüketir. Arka plan URLSession'ı, uzantı sona erdikten sonra bile indirmeye devam eder ve sonuç bir sonraki başlatışta kullanılabilir.

Şifrelenmiş Yükün Şifresini Çözme

Sunucu şifrelenmiş bir bildirim gönderirse, uzantı contentHandler'ı çağırmadan önce yükün şifresini çözmelidir. Şifre çözme genellikle Keychain veya App Group'dan bir anahtar istemeyi, CommonCrypto aracılığıyla şifre çözmeyi ve bildirimin body veya userInfo'sunu değiştirmeyi içerir. Şifre çözme hatası durumunda, orijinal içerikle contentHandler'ı çağırmalısınız — böylece kullanıcı en azından bir bildirimin geldiğini görür, okunamasa bile.

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

Zaman Aşımları ve Yedek Mekanizmalar

Notification Service Extension, katı zaman kısıtlamaları içinde çalışır. iOS sabit bir yürütme süresi ayırır — etkinleştirmeden itibaren yaklaşık 30 saniye. Uzantı bu süre içinde contentHandler'ı çağırmazsa, sistem işlemi zorla sonlandırır ve değiştirilmemiş orijinal bildirimi gösterir.

Kademeli Bozulma Stratejisi

Çok seviyeli bir yedekleme uygulanması önerilir: önce medyayı indirmeyi deneyin, başarılı olursa tam içerikle contentHandler'ı çağırın; başarısız olursa metinle ancak medyasız contentHandler'ı çağırın; kritik hatada orijinal içeriği iletin. Bu yaklaşım, kullanıcının her zaman boş bir ekran değil bir bildirim görmesini sağlar.

Apple'a göre, zaman aşımlarının en yaygın nedeni, yavaş bağlantı üzerinden büyük medya dosyalarının indirilmesidir. Riski azaltmak için sunucuda resim boyutlarının optimize edilmesi önerilir — tam çözünürlük yerine 300 KB'a kadar önizlemeler gönderin. Tam boyutlu resimler, uygulama açıldığında indirilmelidir.

Performans İzleme

Uzantı zaman aşımlarını ve hatalarını izlemek için, Birleşik Günlük Kaydı Sisteminde tanılama mesajları kaydetmek üzere os_log kullanabilirsiniz. Uzantıda doğrudan dosya günlüğü zor olsa da, os_log, geliştirici cihazında Console.app aracılığıyla performans analizine olanak tanır. Apple, her didReceive çağrısına metrikler eklenmesini önerir — indirme süresi, dosya boyutu, işlem sonucu.

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

Sıkça Sorulan Sorular

Sunucu Notification Service Extension'ı nasıl etkinleştirir?

Sunucu, push bildiriminin aps sözlüğüne mutable-content:1 anahtarını ekler. Bu parametre olmadan, sistem uzantıyı yok sayar ve standart bildirimi gösterir.

Uzantı mutable-content olmadan kullanılabilir mi?

Hayır. mutable-content:1, Service Extension'ı etkinleştirmek için zorunlu bir koşuldur. Anahtar eksikse veya 0 olarak ayarlanmışsa, bildirim uzantıyı çağırmadan görüntülenir.

30 saniye sınırı aşıldığında ne olur?

iOS uzantıyı zorla sonlandırır ve değiştirilmemiş orijinal bildirimi gösterir. Bunu önlemek için, minimum kabul edilebilir içerikle serviceExtensionTimeWillExpire() uygulayın.

Şifreleme anahtarları uzantıya nasıl iletilir?

App Group (paylaşılan UserDefaults veya dosya) veya uygulama ile uzantı arasında paylaşılan erişime sahip Keychain aracılığıyla. Anahtarları doğrudan bildirim yükünde iletmek güvenli değildir.

Service Extension'da kaç medya dosyası eklenebilir?

Bildirim başına en fazla 4 ek, her biri en fazla 50 MB. Eklerin toplam boyutu indirme süresini etkiler — ne kadar çok dosya varsa, zaman aşımı riski o kadar yüksektir.

Özet

  • Notification Service Extension, cihazdaki push bildirimlerini görüntülemeden önce değiştirerek metin, başlık ve medya eklerini değiştirir
  • Etkinleştirme için aps sözlüğünde mutable-content:1 anahtarı gereklidir — onsuz uzantı başlamaz
  • Ana protokol UNNotificationServiceExtension, işleme için didReceive ve serviceExtensionTimeWillExpire yöntemlerini tanımlar
  • Uzantı, ağdan medya indirebilir, yüklerin şifresini çözebilir ve bildirime en fazla 4 ek ekleyebilir
  • Yürütme süresi yaklaşık 30 saniye ile sınırlıdır — aşılırsa, iOS orijinal bildirimi gösterir
  • Boş bildirimleri önlemek için çok seviyeli yedekleme ile kademeli bozulma stratejisi önerilir

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