Notification Content Extension — je rozšíření iOS, které umožňuje nahradit standardní rozhraní push oznámení vlastním UIView. Vývojář získává plnou kontrolu nad zobrazením obsahu: obrázky, videa, animace, vlastní fonty a interaktivní prvky. Podle Apple Developer, 2025, Notification Content Extension podporuje jakékoli rozhraní UIKit v omezeném prostoru oznámení.
Hlavní body
Notification Content Extension — je rozšíření aplikace v iOS, které přepisuje standardní šablonu zobrazení push oznámení vlastním UIView. Na rozdíl od běžného oznámení, kde je obsah omezen na nadpis, podnadpis a tělo, rozšíření umožňuje zobrazit jakékoli rozhraní UIKit: mapu se souřadnicemi, graf, galerii obrázků nebo vstupní formulář.
Když iOS obdrží push oznámení s uvedeným categoryIdentifier, systém zkontroluje, zda je rozšíření pro tuto kategorii zaregistrováno. Pokud ano — systém spustí rozšíření v samostatném procesu a předá mu obsah oznámení. Rozšíření zobrazí své vlastní rozhraní místo standardního. Uživatel interaguje s vlastním rozhraním bez otevření hlavní aplikace.
Je důležité nezaměňovat Notification Content Extension s Notification Service Extension. Service Extension zpracovává obsah před zobrazením oznámení (stažení příloh, dešifrování). Content Extension nahrazuje rozhraní po obdržení hotového obsahu. Obě rozšíření mohou pracovat v tandemu: Service Extension připravuje data, Content Extension je zobrazuje.
| Vlastnost | Content Extension | Service Extension |
|---|---|---|
| Účel | Vlastní UI oznámení | Úprava obsahu před zobrazením |
| Doba provádění | Dokud uživatel vidí oznámení | Až 30 sekund na pozadí |
| Rozhraní | Plné UIKit UIView | Žádné rozhraní |
| API | UNNotificationContentExtension | UNNotificationServiceExtension |
Notification Content Extension pracuje v izolovaném procesu s omezenými zdroji. Rozšíření nemá přístup k hlavnímu úložišti aplikace přes NSUserDefaults, s výjimkou App Group. Velikost rozšíření je omezena na 50 MB v rozbalené podobě. Čas na zobrazení obsahu je také omezen — pokud rozšíření nedokončí aktualizaci v přiměřené době, systém jej ukončí.
Pro vytvoření rozšíření v Xcode je třeba přidat nový target typu Notification Content Extension. Xcode automaticky vytvoří MainInterface.storyboard s kontrolerem, který dědí z UIViewController a implementuje UNNotificationContentExtension.
V Xcode vyberte File → New → Target → Notification Content Extension. Uveďte název rozšíření, jazyk (Swift nebo Objective-C) a ujistěte se, že projekt je připojen ke stejnému vývojářskému týmu. Po vytvoření targetu se objeví složka se třemi soubory: MainInterface.storyboard, Info.plist a soubor kontroleru.
V Info.plist rozšíření se povinně uvádí pole NSExtensionAttributes s klíčem UNNotificationExtensionCategory. Toto pole obsahuje identifikátory kategorií oznámení, pro které se rozšíření aktivuje. Volitelný klíč UNNotificationExtensionInitialContentSizeRatio nastavuje počáteční poměr stran vlastního rozhraní pro správné umístění.
Doporučuje se udržovat čistou architekturu v target-rozšíření: samostatná složka pro kontrolery, samostatná pro vlastní zobrazení. Protože rozšíření je samostatný binární soubor, kód hlavní aplikace není přímo přístupný. Pro sdílení kódu vytvořte samostatný framework nebo použijte App Group pro data.
UNNotificationContentExtension — protokol, který musí kontroler v Notification Content Extension implementovat. Jedinou povinnou metodou je didReceive(_:with:), volaná při přijetí oznámení. Kontroler obdrží oznámení a hotový view controller, který je třeba aktualizovat daty.
Kontroler rozšíření musí dědit z UIViewController a implementovat UNNotificationContentExtension. Storyboard nebo xib je propojen s tímto kontrolerem. Při přijetí oznámení metoda didReceive předává obsah a kontroler aktualizuje svá zobrazení.
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)
}
}
Systém určuje velikost vlastního rozhraní na základě klíče UNNotificationExtensionInitialContentSizeRatio v Info.plist a aktuálního obsahu. Doporučuje se nastavit tento klíč na hodnotu 0.1 pro minimální počáteční velikost a poté změnit velikost prostřednictvím preferredContentSize po načtení obsahu.
Notification Content Extension dává plnou svobodu při vytváření rozhraní. Lze použít libovolné UIKit komponenty: UITableView, MKMapView, WKWebView, UIStackView. Je však třeba zohlednit omezený prostor oznámení a optimalizovat výkon.
Jedním z oblíbených scénářů je zobrazení mapy s polohou. K tomu se do Storyboard rozšíření přidá MKMapView a kontroler předá souřadnice z obsahu oznámení. Je důležité nezapomenout přidat MapKit do targetu rozšíření. Při použití mapy zohledněte omezení paměti rozšíření — načítání složitých dlaždic může překročit dostupné zdroje.
Notification Content Extension podporuje UIView animace, včetně změny velikosti, přesouvání a průhlednosti prvků. Při vstupu do rozšířeného režimu oznámení lze spustit animaci zobrazení obsahu. Animace by měly být krátké (do 0.5 sekundy) a neměly by uživateli bránit v interakci s oznámením. Vyhněte se nekonečným animacím — spotřebovávají baterii a snižují výkon.
Protože rozšíření je plnohodnotný UIViewController, můžete přidávat gesta a zpracování dotyků. UIKit gesta (UITapGestureRecognizer, UIButton) fungují standardně. Pro akce vyžadující otevření aplikace použijte delegáta rozšíření nebo userNotificationCenter. Interaktivní prvky by měly být dostatečně velké pro pohodlné stisknutí v omezeném prostoru — minimální velikost touch targetu je 44x44 bodů podle doporučení Apple.
Multimediální obsah — klíčová možnost Notification Content Extension. Oznámení může obsahovat obrázky, GIF, audio a video, které se zobrazují ve vlastním rozhraní. Přílohy jsou doručovány prostřednictvím UNNotificationAttachment, který může být přidán jak serverem přes payload, tak Notification Service Extension po stažení. Podporované formáty jsou JPEG, PNG, MPEG-4 a MP3.
Pro zobrazení obrázku stačí získat UNNotificationAttachment z obsahu oznámení a načíst jej z lokálního URL. Je důležité si uvědomit, že rozšíření má přístup pouze k lokálním souborům — vzdálené zdroje musí být předem staženy Service Extension. Maximální velikost přílohy — 50 MB na iOS 15+, limit se s každou další aktualizací zvyšuje. Pro podporu více obrázků použijte UNNotificationAttachment s různými identifikátory a zobrazte je přes UIPageViewController.
Pro zobrazení obrázku ve vlastním rozhraní rozšíření získá UNNotificationAttachment z obsahu oznámení a načte jej z lokálního URL. Příloha musí být předem stažena Notification Service Extension — Content Extension nemá přístup k síti. Maximální velikost multimediální přílohy — 50 MB na iOS 15+, v dřívějších verzích byl limit 10 MB. Rozšíření by mělo správně zpracovat nepřítomnost přílohy a zobrazit záložní rozhraní. Pro přednačtení obrázků s nízkým rozlišením použijte miniaturní verze vytvořené Service Extension před přiložením.
iOS podporuje přehrávání videa v Notification Content Extension přes AVPlayerLayer. Rozšíření může zobrazit videopřehrávač s ovládacími tlačítky přímo v oznámení. To je užitečné zejména pro aplikace videodohledu, streamování nebo náhledu obsahu. Automatické přehrávání bez zvuku je povoleno za předpokladu, že uživatel očekává multimediální obsah v tomto oznámení. Při implementaci videopřehrávače přidejte ovládací prvky: play/pause, ukazatel průběhu a tlačítko zavření. Ujistěte se, že video nezačíná automaticky se zvukem — to porušuje doporučení Apple pro uživatelský zážitek. Pro prezentaci z více obrázků použijte animovaný přechod mezi nimi přes UIView.transition s volbou přechodu otáčení stránky.
Notification Content Extension pracuje v omezeném prostředí s limitem paměti kolem 50 MB. Pro optimalizaci výkonu použijte líné načítání obrázků, vyhněte se těžkým výpočtům na hlavním vlákně a aplikujte Auto Layout s jednoduchými omezeními. Těžké operace, jako je zpracování obrázků nebo analýza dat, provádějte na pozadí (DispatchQueue.global). Při překročení limitu paměti systém rozšíření ukončí a uživatel uvidí standardní oznámení. Doporučuje se profilovat rozšíření pomocí Instruments (Allocations a Time Profiler) před publikací a také kontrolovat spotřebu paměti na skutečných zařízeních s různými verzemi iOS.
Často kladené otázky
Ano, od iOS 16 Notification Content Extension podporuje SwiftUI přes UIHostingController. UIKit však zůstává stabilnější volbou pro složitá rozhraní kvůli omezené podpoře SwiftUI v rozšířeních.
Zkontrolujte, zda se categoryIdentifier v payloadu oznámení shoduje s UNNotificationExtensionCategory v Info.plist rozšíření. Také se ujistěte, že rozšíření je přidáno do hlavního targetu aplikace a správně podepsáno.
Použijte App Group — sdílené úložiště (UserDefaults suite) nebo kontejner souborů. Hlavní aplikace a rozšíření musí být ve stejné vývojářské skupině a mít povolenou schopnost App Groups.
Použijte metodu didReceive(_:with:) s UNNotificationContentExtensionMediaPlayPauseButtonType pro ovládání médií nebo požádejte o aktualizaci přes delegáta. Úplná aktualizace obsahu bez nového oznámení není možná.
Vyberte target rozšíření v Xcode a spusťte na simulátoru. Použijte lldb a breakpointy jako v běžné aplikaci. Pro testování pošlete push oznámení přes Firebase Console nebo lokálně přes Pusher.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také