Notification Content Extension — este o extensie iOS care permite înlocuirea interfeței standard a notificării push cu un UIView personalizat. Dezvoltatorul obține control complet asupra afișării conținutului: imagini, video, animații, fonturi personalizate și elemente interactive. Conform Apple Developer, 2025, Notification Content Extension suportă orice interfață UIKit în spațiul limitat al notificării.
Principalele puncte
Notification Content Extension — este o extensie de aplicație în iOS care suprascrie șablonul standard de afișare a notificării push cu un UIView personalizat. Spre deosebire de o notificare obișnuită, unde conținutul este limitat la titlu, subtitlu și corp, extensia permite afișarea oricărei interfețe UIKit: hartă cu coordonate, grafic, galerie de imagini sau formular de introducere.
Când iOS primește o notificare push cu categoryIdentifier specificat, sistemul verifică dacă extensia este înregistrată pentru această categorie. Dacă da — sistemul lansează extensia într-un proces separat și îi transmite conținutul notificării. Extensia afișează propria interfață în locul celei standard. Utilizatorul interacționează cu interfața personalizată fără a deschide aplicația principală.
Este important să nu confundați Notification Content Extension cu Notification Service Extension. Service Extension procesează conținutul înainte de afișarea notificării (descărcarea atașamentelor, decriptarea). Content Extension înlocuiește interfața după primirea conținutului gata. Ambele extensii pot funcționa în tandem: Service Extension pregătește datele, Content Extension le afișează.
| Caracteristică | Content Extension | Service Extension |
|---|---|---|
| Scop | UI personalizat al notificării | Modificarea conținutului înainte de afișare |
| Timp de execuție | Cât timp utilizatorul vede notificarea | Până la 30 de secunde în fundal |
| Interfață | UIKit UIView complet | Fără interfață |
| API | UNNotificationContentExtension | UNNotificationServiceExtension |
Notification Content Extension funcționează într-un proces izolat cu resurse limitate. Extensia nu are acces la stocarea principală a aplicației prin NSUserDefaults, cu excepția App Group. Dimensiunea extensiei este limitată la 50 MB în formă decomprimată. Timpul de afișare a conținutului este de asemenea limitat — dacă extensia nu finalizează actualizarea într-un timp rezonabil, sistemul o închide.
Pentru a crea extensia în Xcode, trebuie să adăugați un nou target de tip Notification Content Extension. Xcode va crea automat MainInterface.storyboard cu un controler care moștenește UIViewController și implementează UNNotificationContentExtension.
În Xcode selectați File → New → Target → Notification Content Extension. Specificați numele extensiei, limbajul (Swift sau Objective-C) și asigurați-vă că proiectul este conectat la aceeași echipă de dezvoltatori. După crearea targetului, va apărea un folder cu trei fișiere: MainInterface.storyboard, Info.plist și fișierul controlerului.
În Info.plist al extensiei se specifică obligatoriu tabloul NSExtensionAttributes cu cheia UNNotificationExtensionCategory. Acest tablou conține identificatorii categoriilor de notificări pentru care extensia va fi activată. Cheia opțională UNNotificationExtensionInitialContentSizeRatio stabilește raportul de aspect inițial al interfeței personalizate pentru poziționarea corectă.
Se recomandă menținerea unei arhitecturi curate în target-extensie: folder separat pentru controlere, folder separat pentru vizualizări personalizate. Deoarece extensia este un fișier binar separat, codul aplicației principale nu este accesibil direct. Pentru partajarea codului, creați un framework separat sau utilizați App Group pentru date.
UNNotificationContentExtension — protocol pe care controlerul din Notification Content Extension trebuie să îl implementeze. Singura metodă obligatorie este didReceive(_:with:), apelată la primirea notificării. Controlerul primește notificarea și un view controller gata care trebuie actualizat cu date.
Controlerul extensiei trebuie să moștenească UIViewController și să implementeze UNNotificationContentExtension. Storyboard sau xib este asociat cu acest controler. La primirea notificării, metoda didReceive transmite conținutul, iar controlerul își actualizează vizualizările.
import UIKit
import UserNotifications
import UserNotificationsUI
class CustomNotificationViewController: UIViewController {
@IBOutlet var titleLabel: UILabel!
@IBOutlet var customImageView: UIImageView!
func didReceive(
notification: UNNotification
) {
let content = notification.request.content
titleLabel.text = content.title
loadAttachment(content.attachments.first)
}
private func loadAttachment(attachment: UNNotificationAttachment?) {
guard let url = attachment?.URL else { return }
if let image = UIImage(contentsOfFile: url.path) {
customImageView.image = image
}
}
}
extension CustomNotificationViewController: UNNotificationContentExtension {
func didReceive(
notification: UNNotification
) {
didReceive(notification: notification)
}
}
Sistemul determină dimensiunea interfeței personalizate pe baza cheii UNNotificationExtensionInitialContentSizeRatio din Info.plist și a conținutului curent. Se recomandă setarea acestei chei la valoarea 0.1 pentru o dimensiune inițială minimă, apoi modificarea dimensiunii prin preferredContentSize după încărcarea conținutului.
Notification Content Extension oferă libertate completă în crearea interfeței. Puteți utiliza orice componente UIKit: UITableView, MKMapView, WKWebView, UIStackView. Cu toate acestea, trebuie să țineți cont de spațiul limitat al notificării și să optimizați performanța.
Unul dintre scenariile populare este afișarea hărții cu locația. Pentru aceasta, în Storyboard al extensiei se adaugă MKMapView, iar controlerul transmite coordonatele din conținutul notificării. Este important să nu uitați să adăugați MapKit la targetul extensiei. Când utilizați harta, luați în considerare limita de memorie a extensiei — încărcarea plăcilor complexe poate depăși resursele disponibile.
Notification Content Extension suportă animații UIView, inclusiv modificarea dimensiunilor, deplasarea și transparența elementelor. La intrarea în modul extins al notificării, puteți porni animația de apariție a conținutului. Animațiile trebuie să fie scurte (până la 0.5 secunde) și să nu împiedice utilizatorul să interacționeze cu notificarea. Evitați animațiile infinite — acestea consumă bateria și reduc performanța.
Deoarece extensia este un UIViewController complet, puteți adăuga gesturi și gestionarea atingerilor. Gestiunile UIKit (UITapGestureRecognizer, UIButton) funcționează standard. Pentru acțiunile care necesită deschiderea aplicației, utilizați delegatul extensiei sau userNotificationCenter. Elementele interactive trebuie să fie suficient de mari pentru a fi atinse confortabil în spațiul limitat — dimensiunea minimă a touch target este de 44x44 de puncte conform recomandărilor Apple.
Conținutul multimedia — o capacitate cheie a Notification Content Extension. Notificarea poate conține imagini, GIF, audio și video care sunt afișate în interfața personalizată. Atașamentele sunt livrate prin UNNotificationAttachment, care poate fi adăugat atât de server prin payload, cât și de Notification Service Extension după descărcare. Formatele suportate sunt JPEG, PNG, MPEG-4 și MP3.
Pentru a afișa o imagine, este suficient să obțineți UNNotificationAttachment din conținutul notificării și să îl încărcați de la un URL local. Este important să rețineți că extensia are acces doar la fișierele locale — resursele la distanță trebuie descărcate în prealabil de Service Extension. Dimensiunea maximă a atașamentului — 50 MB pe iOS 15+, limita este mărită cu fiecare actualizare ulterioară. Pentru suportarea mai multor imagini, utilizați UNNotificationAttachment cu identificatori diferiți și afișați-le prin UIPageViewController.
Pentru a afișa o imagine în interfața personalizată, extensia obține UNNotificationAttachment din conținutul notificării și îl încarcă de la un URL local. Atașamentul trebuie descărcat în prealabil de Notification Service Extension — Content Extension nu are acces la rețea. Dimensiunea maximă a atașamentului multimedia — 50 MB pe iOS 15+, în versiunile anterioare limita era de 10 MB. Extensia trebuie să gestioneze corect absența atașamentului și să afișeze o interfață de rezervă. Pentru încărcarea preliminară a imaginilor cu rezoluție scăzută, utilizați versiuni miniatură create de Service Extension înainte de atașare.
iOS suportă redarea video în Notification Content Extension prin AVPlayerLayer. Extensia poate afișa un player video cu butoane de control direct în notificare. Acest lucru este util în special pentru aplicațiile de supraveghere video, streaming sau previzualizare a conținutului. Redarea automată fără sunet este permisă cu condiția ca utilizatorul să se aștepte la conținut multimedia în această notificare. La implementarea playerului video, adăugați elemente de control: play/pause, bară de progres și buton de închidere. Asigurați-vă că videoclipul nu pornește automat cu sunet — acest lucru încalcă recomandările Apple privind experiența utilizatorului. Pentru un slideshow cu mai multe imagini, utilizați o tranziție animată între ele prin UIView.transition cu opțiunea de tranziție prin întoarcerea paginii.
Notification Content Extension funcționează într-un mediu limitat cu o limită de memorie de aproximativ 50 MB. Pentru a optimiza performanța, utilizați încărcarea lentă a imaginilor, evitați calculele grele pe thread-ul principal și aplicați Auto Layout cu constrângeri simple. Operațiile grele, cum ar fi procesarea imaginilor sau parsarea datelor, executați-le în fundal (DispatchQueue.global). La depășirea limitei de memorie, sistemul va închide extensia, iar utilizatorul va vedea notificarea standard. Se recomandă profilarea extensiei prin Instruments (Allocations și Time Profiler) înainte de publicare, precum și verificarea consumului de memorie pe dispozitive reale cu diferite versiuni iOS.
Întrebări frecvente
Da, începând cu iOS 16, Notification Content Extension suportă SwiftUI prin UIHostingController. Cu toate acestea, UIKit rămâne o alegere mai stabilă pentru interfețe complexe din cauza suportului limitat al SwiftUI în extensii.
Verificați că categoryIdentifier din payload-ul notificării corespunde cu UNNotificationExtensionCategory din Info.plist al extensiei. De asemenea, asigurați-vă că extensia a fost adăugată la targetul principal al aplicației și este semnată corect.
Utilizați App Group — stocare comună (UserDefaults suite) sau container de fișiere. Aplicația principală și extensia trebuie să fie în același grup de dezvoltatori și să aibă capabilitatea App Groups activată.
Utilizați metoda didReceive(_:with:) cu UNNotificationContentExtensionMediaPlayPauseButtonType pentru controlul media sau solicitați actualizarea prin delegat. Actualizarea completă a conținutului fără o notificare nouă nu este posibilă.
Selectați targetul extensiei în Xcode și rulați pe simulator. Utilizați lldb și breakpoint-uri ca într-o aplicație obișnuită. Pentru testare, trimiteți o notificare push prin Firebase Console sau local prin Pusher.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și