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
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.
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 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.
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, 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.
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.
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.
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)
}
}
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, 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.
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.
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.
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.
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.
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.
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.
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.
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ı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 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.
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.
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.
İ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.
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
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