Notification Content Extension — to rozszerzenie iOS, które pozwala zastąpić standardowy interfejs push powiadomienia niestandardowym UIView. Deweloper otrzymuje pełną kontrolę nad wyświetlaniem treści: obrazy, wideo, animacje, niestandardowe czcionki i interaktywne elementy. Według Apple Developer, 2025, Notification Content Extension obsługuje dowolny interfejs UIKit w ograniczonej przestrzeni powiadomienia.
Najważniejsze
Notification Content Extension — to app extension w iOS, które nadpisuje standardowy szablon wyświetlania push powiadomienia niestandardowym UIView. W przeciwieństwie do zwykłego powiadomienia, gdzie treść jest ograniczona do tytułu, podtytułu i treści, rozszerzenie pozwala wyświetlić dowolny interfejs UIKit: mapę ze współrzędnymi, wykres, galerię obrazów lub formularz wprowadzania.
Gdy iOS otrzymuje push powiadomienie z określonym categoryIdentifier, system sprawdza, czy rozszerzenie jest zarejestrowane dla tej kategorii. Jeśli tak — system uruchamia rozszerzenie w oddzielnym procesie i przekazuje mu treść powiadomienia. Rozszerzenie wyświetla swój interfejs zamiast standardowego. Użytkownik wchodzi w interakcję z niestandardowym interfejsem bez otwierania głównej aplikacji.
Ważne jest, aby nie mylić Notification Content Extension z Notification Service Extension. Service Extension przetwarza treść przed wyświetleniem powiadomienia (pobieranie załączników, deszyfrowanie). Content Extension zastępuje interfejs po otrzymaniu gotowej treści. Oba rozszerzenia mogą działać w tandemie: Service Extension przygotowuje dane, Content Extension je wyświetla.
| Cecha | Content Extension | Service Extension |
|---|---|---|
| Przeznaczenie | Niestandardowy UI powiadomienia | Modyfikacja treści przed wyświetleniem |
| Czas wykonania | Dopóki użytkownik widzi powiadomienie | Do 30 sekund w tle |
| Interfejs | Pełny UIKit UIView | Brak interfejsu |
| API | UNNotificationContentExtension | UNNotificationServiceExtension |
Notification Content Extension działa w izolowanym procesie z ograniczonymi zasobami. Rozszerzenie nie ma dostępu do głównego magazynu aplikacji przez NSUserDefaults, z wyjątkiem App Group. Rozmiar rozszerzenia jest ograniczony do 50 MB w formacie rozpakowanym. Czas na wyświetlenie treści jest również ograniczony — jeśli rozszerzenie nie zakończy aktualizacji w rozsądnym czasie, system je zamyka.
Aby utworzyć rozszerzenie w Xcode, należy dodać nowy target typu Notification Content Extension. Xcode automatycznie utworzy MainInterface.storyboard z kontrolerem dziedziczącym po UIViewController i implementującym UNNotificationContentExtension.
W Xcode wybierz File → New → Target → Notification Content Extension. Podaj nazwę rozszerzenia, język (Swift lub Objective-C) i upewnij się, że projekt jest podłączony do tego samego zespołu deweloperskiego. Po utworzeniu targetu pojawi się folder z trzema plikami: MainInterface.storyboard, Info.plist i plik kontrolera.
W Info.plist rozszerzenia obowiązkowo podaje się tablicę NSExtensionAttributes z kluczem UNNotificationExtensionCategory. Ta tablica zawiera identyfikatory kategorii powiadomień, dla których rozszerzenie będzie aktywowane. Opcjonalny klucz UNNotificationExtensionInitialContentSizeRatio określa początkowy współczynnik proporcji niestandardowego interfejsu dla prawidłowego pozycjonowania.
Zaleca się utrzymanie czystej architektury w target-rozszerzeniu: osobny folder dla kontrolerów, osobny dla niestandardowych widoków. Ponieważ rozszerzenie jest oddzielnym binarnym plikiem, kod głównej aplikacji nie jest bezpośrednio dostępny. Do współdzielenia kodu utwórz osobny framework lub użyj App Group dla danych.
UNNotificationContentExtension — protokół, który musi zaimplementować kontroler w Notification Content Extension. Jedyną obowiązkową metodą jest didReceive(_:with:), wywoływana przy otrzymaniu powiadomienia. Kontroler otrzymuje powiadomienie i gotowy view controller, który należy zaktualizować danymi.
Kontroler rozszerzenia musi dziedziczyć po UIViewController i implementować UNNotificationContentExtension. Storyboard lub xib jest powiązany z tym kontrolerem. Po otrzymaniu powiadomienia metoda didReceive przekazuje treść, a kontroler aktualizuje swoje widoki.
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)
}
}
System określa rozmiar niestandardowego interfejsu na podstawie klucza UNNotificationExtensionInitialContentSizeRatio w Info.plist oraz aktualnej treści. Zaleca się ustawienie tego klucza na wartość 0.1 dla minimalnego początkowego rozmiaru, a następnie zmianę rozmiaru przez preferredContentSize po załadowaniu treści.
Notification Content Extension daje pełną swobodę w tworzeniu interfejsu. Można używać dowolnych komponentów UIKit: UITableView, MKMapView, WKWebView, UIStackView. Należy jednak uwzględnić ograniczoną przestrzeń powiadomienia i zoptymalizować wydajność.
Jednym z popularnych scenariuszy jest wyświetlenie mapy z lokalizacją. W tym celu w Storyboard rozszerzenia dodaje się MKMapView, a kontroler przekazuje współrzędne z treści powiadomienia. Ważne jest, aby nie zapomnieć dodać MapKit do targetu rozszerzenia. Podczas korzystania z mapy należy uwzględnić limit pamięci rozszerzenia — ładowanie złożonych kafelków może przekroczyć dostępne zasoby.
Notification Content Extension obsługuje animacje UIView, w tym zmianę rozmiarów, przesuwanie i przezroczystość elementów. Przy wejściu w rozszerzony tryb powiadomienia można uruchomić animację pojawiania się treści. Animacje powinny być krótkie (do 0.5 sekundy) i nie przeszkadzać użytkownikowi w interakcji z powiadomieniem. Unikaj nieskończonych animacji — zużywają baterię i obniżają wydajność.
Ponieważ rozszerzenie jest pełnoprawnym UIViewController, można dodawać gesty i obsługę dotknięć. UIKit gestures (UITapGestureRecognizer, UIButton) działają standardowo. Do akcji wymagających otwarcia aplikacji użyj delegata rozszerzenia lub userNotificationCenter. Elementy interaktywne powinny być wystarczająco duże, aby wygodnie je nacisnąć w ograniczonej przestrzeni — minimalny rozmiar touch target to 44x44 punkty zgodnie z zaleceniami Apple.
Treści multimedialne — kluczowa możliwość Notification Content Extension. Powiadomienie może zawierać obrazy, GIF, audio i wideo, które są wyświetlane w niestandardowym interfejsie. Załączniki są dostarczane przez UNNotificationAttachment, który może być dodany zarówno przez serwer przez payload, jak i przez Notification Service Extension po pobraniu. Obsługiwane formaty to JPEG, PNG, MPEG-4 i MP3.
Do wyświetlenia obrazu wystarczy pobrać UNNotificationAttachment z treści powiadomienia i załadować go z lokalnego URL. Należy pamiętać, że rozszerzenie ma dostęp tylko do lokalnych plików — zdalne zasoby muszą być wcześniej pobrane przez Service Extension. Maksymalny rozmiar załącznika — 50 MB na iOS 15+, ograniczenie jest zwiększane z każdą kolejną aktualizacją. Do obsługi wielu obrazów użyj UNNotificationAttachment z różnymi identyfikatorami i wyświetlaj je przez UIPageViewController.
Do wyświetlenia obrazu w niestandardowym interfejsie rozszerzenie pobiera UNNotificationAttachment z treści powiadomienia i ładuje go z lokalnego URL. Załącznik musi być wcześniej pobrany przez Notification Service Extension — Content Extension nie ma dostępu do sieci. Maksymalny rozmiar załącznika multimedialnego — 50 MB na iOS 15+, we wcześniejszych wersjach ograniczenie wynosiło 10 MB. Rozszerzenie powinno poprawnie obsługiwać brak załącznika i wyświetlać fallback-interfejs. Do wstępnego ładowania obrazów o niskiej rozdzielczości użyj wersji miniatur, utworzonych przez Service Extension przed dołączeniem.
iOS obsługuje odtwarzanie wideo w Notification Content Extension przez AVPlayerLayer. Rozszerzenie może wyświetlić odtwarzacz wideo z przyciskami sterowania bezpośrednio w powiadomieniu. Jest to szczególnie przydatne w aplikacjach monitoringu, streamingu lub podglądu treści. Autoodtwarzanie bez dźwięku jest dozwolone pod warunkiem, że użytkownik oczekuje treści multimedialnej w tym powiadomieniu. Przy implementacji odtwarzacza wideo dodaj elementy sterowania: play/pause, pasek postępu i przycisk zamykania. Upewnij się, że wideo nie uruchamia się automatycznie z dźwiękiem — to narusza zalecenia Apple dotyczące doświadczenia użytkownika. Dla pokazu slajdów z kilku obrazów użyj animowanego przejścia między nimi przez UIView.transition z opcją przejścia przewracania strony.
Notification Content Extension działa w ograniczonym środowisku z limitem pamięci około 50 MB. Aby zoptymalizować wydajność, używaj leniwego ładowania obrazów, unikaj ciężkich obliczeń na głównym wątku i stosuj Auto Layout z prostymi constraintami. Ciężkie operacje, takie jak przetwarzanie obrazów lub parsowanie danych, wykonuj w tle (DispatchQueue.global). Po przekroczeniu limitu pamięci system zamknie rozszerzenie, a użytkownik zobaczy standardowe powiadomienie. Zaleca się profilowanie rozszerzenia przez Instruments (Allocations i Time Profiler) przed publikacją oraz sprawdzanie zużycia pamięci na rzeczywistych urządzeniach z różnymi wersjami iOS.
Często zadawane pytania
Tak, od iOS 16 Notification Content Extension obsługuje SwiftUI przez UIHostingController. Jednak UIKit pozostaje bardziej stabilnym wyborem dla złożonych interfejsów ze względu na ograniczoną obsługę SwiftUI w rozszerzeniach.
Sprawdź, czy categoryIdentifier w payload powiadomienia zgadza się z UNNotificationExtensionCategory w Info.plist rozszerzenia. Upewnij się również, że rozszerzenie zostało dodane do głównego targetu aplikacji i jest prawidłowo podpisane.
Użyj App Group — wspólnego magazynu (UserDefaults suite) lub kontenera plików. Główna aplikacja i rozszerzenie muszą być w tej samej grupie deweloperskiej i mieć włączony capability App Groups.
Użyj metody didReceive(_:with:) z UNNotificationContentExtensionMediaPlayPauseButtonType do sterowania mediami lub poproś o aktualizację przez delegata. Pełna aktualizacja treści bez nowego powiadomienia jest niemożliwa.
Wybierz target rozszerzenia w Xcode i uruchom na symulatorze. Użyj lldb i breakpointów jak w zwykłej aplikacji. Do testowania wyślij push powiadomienie przez Firebase Console lub lokalnie przez Pusher.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również