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, 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.
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.
İç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.
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.
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, 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:), 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(), 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.
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.
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.
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.
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()
}
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.
Ç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.
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.
override func serviceExtensionTimeWillExpire() {
let fallback = bestEffortContent as?
UNMutableNotificationContent
?? request.content.mutableCopy()
as! UNMutableNotificationContent
contentHandler(fallback)
}
Sıkça Sorulan Sorular
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.
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.
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.
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.
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
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.
Ayrıca okuyun