Rich Notification to rozszerzony format powiadomień push iOS, który zawiera załączniki multimedialne, przyciski interaktywne i niestandardowe interfejsy poprawiające doświadczenie użytkownika. W przeciwieństwie do standardowych powiadomień tekstowych, Rich Notification może wyświetlać obrazy, wideo i audio bezpośrednio w banerze lub na ekranie blokady. Według Apple Developer Documentation, 2026, UNNotificationAttachment obsługuje do 10 plików w jednym powiadomieniu i automatycznie skaluje je dla optymalnego wyświetlania na wszystkich urządzeniach.
Najważniejsze
Rich Notification to powiadomienie push iOS, które zawiera nie tylko tekst, ale także załączniki multimedialne, elementy interaktywne i spersonalizowany interfejs. Termin „rich” (bogaty) odzwierciedla możliwość dołączania do powiadomienia obrazów, wideo, audio, przycisków akcji i wprowadzania tekstu, co zmienia zwykłe powiadomienie w pełnoprawny element interaktywny.
Apple wprowadziło obsługę Rich Notification w iOS 10 wraz z frameworkiem UserNotifications. Wcześniej powiadomienia push mogły zawierać tylko tekst, dźwięk i badge. iOS 10 przedstawiło UNNotificationServiceExtension i UNNotificationContentExtension, które otworzyły możliwość modyfikacji treści i tworzenia niestandardowych interfejsów. W późniejszych wersjach dodano obsługę SwiftUI w Content Extension, animowanych GIF i ulepszone skalowanie multimediów.
Rich Notification znacznie zwiększa zaangażowanie użytkowników. Badania Apple pokazują, że powiadomienia z obrazami otrzymują o 30–40% więcej interakcji w porównaniu z tekstowymi. Obraz produktu, podgląd wideo lub przycisk szybkiej odpowiedzi pozwalają użytkownikowi podjąć decyzję bezpośrednio z powiadomienia, bez otwierania aplikacji. Skraca to ścieżkę do docelowej akcji i poprawia doświadczenie użytkownika.
UNNotificationAttachment obsługuje trzy kategorie multimediów: obrazy, wideo i audio. Każdy typ ma swoje ograniczenia dotyczące formatu, rozmiaru i czasu trwania. System automatycznie skaluje obrazy do rozmiaru powiadomienia i ogranicza czas trwania wideo do 30 sekund w celu optymalizacji wydajności.
| Typ multimediów | Obsługiwane formaty | Maksymalny rozmiar |
|---|---|---|
| Obrazy | JPEG, PNG, GIF, TIFF | 10 MB na plik |
| Wideo | MPEG, MP4, MOV | 10 MB, do 30 sekund |
| Audio | MP3, AAC, WAV, CAF | 10 MB |
Obrazy są automatycznie przycinane i skalowane przez system do wyświetlania w kompaktowym i rozszerzonym widoku powiadomienia. Animowane GIF są obsługiwane od iOS 12 i odtwarzają się automatycznie podczas przeglądania powiadomienia. Zalecany rozmiar obrazu to 1024x1024 piksele, co zapewnia wyraźne wyświetlanie na wszystkich urządzeniach, w tym na iPadzie z dużym ekranem.
Wideo w Rich Notification odtwarza się domyślnie bez dźwięku — użytkownik może włączyć dźwięk przez przycisk w odtwarzaczu. Maksymalny czas trwania wideo wynosi 30 sekund, po czym odtwarzanie zostaje zatrzymane. Załączniki audio mogą być używane do wiadomości głosowych lub podglądów dźwiękowych i odtwarzają się po dotknięciu powiadomienia w rozszerzonym widoku.
Akcje interaktywne pozwalają użytkownikowi wykonywać operacje bezpośrednio z powiadomienia bez otwierania aplikacji. Akcje są rejestrowane przez UNNotificationCategory i UNNotificationAction podczas uruchamiania aplikacji. Każda akcja może być w tle (bez otwierania aplikacji) lub pierwszoplanowa (otwiera aplikację w celu dokończenia operacji).
UNNotificationAction to przycisk z tytułem i opcjonalnymi modyfikatorami, takimi jak requiresAuthentication (wymaga Face ID/Touch ID) lub destructive (podświetlony na czerwono). UNTextInputNotificationAction rozszerza tę możliwość, dodając pole tekstowe do wprowadzania — idealne do szybkiej odpowiedzi na wiadomość lub komentarz. Akcje są wyświetlane po długim naciśnięciu powiadomienia lub przesunięciu w dół.
Kategorie powiadomień łączą typ treści z zestawem dostępnych akcji. Proces rejestracji odbywa się w AppDelegate podczas uruchamiania aplikacji przez UNUserNotificationCenter.current().setNotificationCategories. Kategoria jest określana na serwerze w polu category JSON payloadu, a system automatycznie stosuje odpowiedni zestaw akcji do powiadomienia.
Gdy użytkownik kliknie przycisk lub wyśle tekst, system wywołuje delegata UNUserNotificationCenterDelegate z metodą didReceive response. UNNotificationResponse zawiera identyfikator akcji i wprowadzony tekst (dla UNTextInputNotificationAction). Na podstawie tych informacji aplikacja wykonuje odpowiednią logikę biznesową: wysyła wiadomość, potwierdza akcję lub otwiera określony ekran.
Przeanalizujemy pełny cykl tworzenia Rich Notification: od rejestracji kategorii w AppDelegate po przetwarzanie w Service Extension i wyświetlanie. AppDelegate rejestruje kategorię z przyciskami, serwer wysyła powiadomienie z URL obrazu, Service Extension pobiera multimedia, a Content Extension wyświetla niestandardowy interfejs z przyciskami.
// AppDelegate — rejestracja kategorii i akcji
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let replyAction = UNTextInputNotificationAction(
identifier: "reply",
title: "Odpowiedz",
options: [.authenticationRequired])
let likeAction = UNNotificationAction(
identifier: "like",
title: "Lubię to",
options: [])
let category = UNNotificationCategory(
identifier: "social_post",
actions: [replyAction, likeAction],
intentIdentifiers: [],
options: [])
UNUserNotificationCenter.current()
.setNotificationCategories([category])
return true
}
Po otrzymaniu powiadomienia push z kategorią „social_post” i URL obrazu w niestandardowym polu, aktywuje się Service Extension. Rozszerzenie pobiera obraz przez sieć, tworzy UNNotificationAttachment z unikalnym identyfikatorem i dodaje go do treści. Ważne jest sprawdzenie rozmiaru pobranego pliku — jeśli przekracza 10 MB, attachment nie zostanie utworzony, a system wyświetli powiadomienie bez multimediów.
class NotificationService: UNNotificationServiceExtension {
override func didReceive(
_ request: UNNotificationRequest,
withContentHandler contentHandler:
@escaping (UNNotificationContent) -> Void
) {
let content = (request.content.mutableCopy()
as! UNMutableNotificationContent)
guard let urlString = content.userInfo["media-url"]
as? String,
let url = URL(string: urlString)
else { contentHandler(request.content); return }
URLSession.shared.downloadTask(with: url) {
location, _, _ in
guard let location = location else {
contentHandler(content); return }
let attachment = try! UNNotificationAttachment(
identifier: "media", url: location,
options: [UNNotificationAttachmentOptionsTypeHintKey:
"jpg"])
content.attachments = [attachment]
contentHandler(content)
}.resume()
}
}
Do testowania Rich Notification bez serwera użyj symulatora iOS i wysyłaj push przez terminal za pomocą xcrun simctl push. W payloadzie należy określić mutable-content: 1, aby aktywować Service Extension oraz category do wyświetlania akcji. Polecenie uruchamia push z pliku JSON bezpośrednio na wybrany symulator, co pozwala na szybkie iteracje bez konfigurowania infrastruktury serwerowej.
UNNotificationContentExtension pozwala całkowicie zastąpić standardowy interfejs powiadomienia dowolnym widokiem UIKit lub SwiftUI. Rozszerzenie aktywuje się, gdy użytkownik rozszerza powiadomienie (force touch lub przesunięcie w dół) i może zawierać przyciski, suwaki, animacje i inne komponenty UI. Rozmiar interfejsu dostosowuje się do treści za pomocą Auto Layout.
Content Extension opiera się na storyboard z widokiem dziedziczącym po UIViewController. Widok SwiftUI jest integrowany przez UIHostingController od iOS 16, co pozwala na stosowanie nowoczesnych podejść do budowania interfejsu. Dla wstecznej kompatybilności z iOS 14–15 zaleca się używanie UIKit z plikami xib. Interfejs otrzymuje zmodyfikowaną treść z Service Extension przez UNNotificationContent.
Content Extension implementuje protokół UNNotificationContentExtension z metodą didReceive response. UNNotificationResponse zawiera informacje o klikniętym przycisku lub wprowadzonym tekście. Rozszerzenie może zaktualizować interfejs bez zamykania powiadomienia lub wywołać completion handler w celu jego zamknięcia. Pozwala to tworzyć scenariusze szybkiej interakcji, na przykład „polubienie” z wizualnym sprzężeniem zwrotnym bezpośrednio w powiadomieniu.
Apple zaleca, aby Content Extension był zwięzły i funkcjonalny, unikając zbędnych elementów. Maksymalna wysokość rozszerzonego powiadomienia wynosi około 400 punktów, po czym treść jest przewijana. Używaj systemowych czcionek i odstępów dla spójności z innymi powiadomieniami. Testuj na różnych rozmiarach ekranu, aby upewnić się, że interfejs poprawnie wyświetla się zarówno na iPhone, jak i iPad.
Często zadawane pytania
Maksymalny rozmiar jednego załącznika multimedialnego wynosi 10 MB. Po przekroczeniu limitu UNNotificationAttachment nie zostanie utworzony, a powiadomienie wyświetli się bez multimediów. Zaleca się optymalizację obrazów do 1–3 MB dla szybkiego pobierania w Service Extension.
Rich Notification jest obsługiwane na wszystkich urządzeniach z iOS 10 i nowszym, w tym iPhone 5s i nowszych. Content Extension z niestandardowym UI jest dostępny od iOS 12. SwiftUI w Content Extension — od iOS 16. Na starszych wersjach powiadomienie wyświetla się w standardowej formie.
Tak, animowane GIF są obsługiwane od iOS 12. GIF jest pobierany przez UNNotificationAttachment jako zwykły obraz i automatycznie odtwarzany podczas przeglądania powiadomienia. Rozmiar GIF jest ograniczony do tych samych 10 MB co inne formaty.
Maksymalnie 4 akcje na jedno powiadomienie podczas rejestracji kategorii. Przy większej liczbie system wyświetla pierwsze 4, pozostałe ignoruje. Zaleca się używanie 2–3 przycisków dla optymalnego UX — zbyt wiele opcji przeciąża interfejs.
Tak, serwer musi wysyłać push przez APNS (Apple Push Notification service) z payloadem JSON zawierającym URL pliku multimedialnego w niestandardowym polu i flagą mutable-content: 1. Serwer określa również category do aktywacji Content Extension i akcji.
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ż