Rich Notification — це розширений формат push-сповіщень iOS, який включає медіа-вкладення, інтерактивні кнопки та кастомні інтерфейси для покращення користувацького досвіду. На відміну від стандартних текстових сповіщень, Rich Notification може відображати зображення, відео та аудіо прямо в банері або на екрані блокування. За даними Apple Developer Documentation, 2026, UNNotificationAttachment підтримує до 10 файлів в одному сповіщенні та автоматично масштабує їх для оптимального відображення на всіх пристроях.
Головне
Rich Notification — це push-сповіщення iOS, яке містить не лише текст, але й медіа-вкладення, інтерактивні елементи та кастомізований інтерфейс. Термін «rich» (багатий) відображає можливість включати в сповіщення зображення, відео, аудіо, кнопки дій та текстове введення, що перетворює просте оповіщення на повноцінний інтерактивний елемент.
Apple впровадила підтримку Rich Notification в iOS 10 разом з фреймворком UserNotifications. До цього push-сповіщення могли містити лише текст, звук та badge. iOS 10 представила UNNotificationServiceExtension та UNNotificationContentExtension, які відкрили можливість модифікації контенту та створення кастомних інтерфейсів. У пізніших версіях додалася підтримка SwiftUI в Content Extension, анімованих GIF та покращене масштабування медіа.
Rich Notification значно підвищує залученість користувачів. Дослідження Apple показують, що сповіщення із зображеннями отримують на 30–40% більше взаємодій порівняно з текстовими. Зображення товару, прев'ю відео або кнопка швидкої відповіді дозволяють користувачеві прийняти рішення прямо зі сповіщення, не відкриваючи додаток. Це скорочує шлях до цільової дії та покращує користувацький досвід.
UNNotificationAttachment підтримує три категорії медіа: зображення, відео та аудіо. Кожен тип має свої обмеження щодо формату, розміру та тривалості. Система автоматично масштабує зображення під розмір сповіщення та обмежує тривалість відео 30 секундами для оптимізації продуктивності.
| Тип медіа | Підтримувані формати | Максимальний розмір |
|---|---|---|
| Зображення | JPEG, PNG, GIF, TIFF | 10 MB на файл |
| Відео | MPEG, MP4, MOV | 10 MB, до 30 секунд |
| Аудіо | MP3, AAC, WAV, CAF | 10 MB |
Зображення автоматично обрізаються та масштабуються системою для відображення в компактному та розширеному вигляді сповіщення. Анімовані GIF підтримуються починаючи з iOS 12 та відтворюються автоматично при перегляді сповіщення. Рекомендований розмір зображення — 1024x1024 пікселі, що забезпечує чітке відображення на всіх пристроях, включаючи iPad з великим екраном.
Відео в Rich Notification відтворюється без звуку за замовчуванням — користувач може ввімкнути звук через кнопку в плеєрі. Максимальна тривалість відео становить 30 секунд, після чого відтворення зупиняється. Аудіо-вкладення можуть використовуватися для голосових повідомлень або звукових прев'ю та відтворюються при натисканні на сповіщення в розширеному вигляді.
Інтерактивні дії дозволяють користувачеві виконувати операції прямо зі сповіщення без відкриття додатка. Дії реєструються через UNNotificationCategory та UNNotificationAction при запуску додатка. Кожна дія може бути фоновою (без відкриття додатка) або форграундною (відкриває додаток для завершення операції).
UNNotificationAction представляє кнопку із заголовком та опціональними модифікаторами, такими як requiresAuthentication (потрібен Face ID/Touch ID) або destructive (виділяється червоним кольором). UNTextInputNotificationAction розширює цю можливість, додаючи текстове поле для введення — ідеально для швидкої відповіді на повідомлення або коментар. Дії відображаються при тривалому натисканні на сповіщення або змахуванні вниз.
Категорії сповіщень пов'язують тип контенту з набором доступних дій. Процес реєстрації виконується в AppDelegate при запуску додатка через UNUserNotificationCenter.current().setNotificationCategories. Категорія вказується на сервері в полі category JSON-пейлоуду, і система автоматично застосовує відповідний набір дій до сповіщення.
Коли користувач натискає кнопку або надсилає текст, система викликає делегат UNUserNotificationCenterDelegate з методом didReceive response. UNNotificationResponse містить ідентифікатор дії та введений текст (для UNTextInputNotificationAction). На основі цієї інформації додаток виконує відповідну бізнес-логіку: надсилає повідомлення, підтверджує дію або відкриває певний екран.
Розглянемо повний цикл створення Rich Notification: від реєстрації категорій в AppDelegate до обробки в Service Extension та відображення. AppDelegate реєструє категорію з кнопками, сервер надсилає сповіщення з URL зображення, Service Extension завантажує медіа, і Content Extension відображає кастомний інтерфейс з кнопками.
// AppDelegate — реєстрація категорій та дій
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let replyAction = UNTextInputNotificationAction(
identifier: "reply",
title: "Відповісти",
options: [.authenticationRequired])
let likeAction = UNNotificationAction(
identifier: "like",
title: "Подобається",
options: [])
let category = UNNotificationCategory(
identifier: "social_post",
actions: [replyAction, likeAction],
intentIdentifiers: [],
options: [])
UNUserNotificationCenter.current()
.setNotificationCategories([category])
return true
}
Після отримання push-сповіщення з категорією «social_post» та URL зображення в кастомному полі активується Service Extension. Розширення завантажує зображення по мережі, створює UNNotificationAttachment з унікальним ідентифікатором та додає його в контент. Важливо перевіряти розмір завантаженого файлу — якщо він перевищує 10 MB, attachment не створиться, і система покаже сповіщення без медіа.
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()
}
}
Для тестування Rich Notification без сервера використовуйте симулятор iOS та надсилайте push через термінал за допомогою xcrun simctl push. У пейлоуді обов'язково вкажіть mutable-content: 1 для активації Service Extension та category для відображення дій. Команда запускає push з JSON-файлу прямо на вибраний симулятор, що дозволяє швидко ітерувати без налаштування серверної інфраструктури.
UNNotificationContentExtension дозволяє повністю замінити стандартний інтерфейс сповіщення на довільний UIKit або SwiftUI view. Розширення активується, коли користувач розширює сповіщення (force touch або змахування вниз) і може містити кнопки, слайдери, анімації та будь-які інші UI-компоненти. Розмір інтерфейсу адаптується під контент за допомогою Auto Layout.
Content Extension базується на storyboard з представленням, що наслідує UIViewController. SwiftUI View інтегрується через UIHostingController починаючи з iOS 16, що дозволяє використовувати сучасні підходи до побудови інтерфейсу. Для зворотної сумісності з iOS 14–15 рекомендується використовувати UIKit з xib-файлами. Інтерфейс отримує модифікований контент від Service Extension через UNNotificationContent.
Content Extension реалізує протокол UNNotificationContentExtension з методом didReceive response. UNNotificationResponse містить інформацію про натиснуту кнопку або введений текст. Розширення може оновити інтерфейс без закриття сповіщення або викликати completion handler для його закриття. Це дозволяє створювати сценарії швидкої взаємодії, наприклад, «лайк» з візуальним зворотним зв'язком прямо в сповіщенні.
Apple рекомендує робити Content Extension лаконічним та функціональним, уникаючи надлишкових елементів. Максимальна висота розширеного сповіщення — близько 400 точок, після чого контент скролиться. Використовуйте системні шрифти та відступи для єдності з іншими сповіщеннями. Тестуйте на різних розмірах екрана, щоб переконатися, що інтерфейс коректно відображається як на iPhone, так і на iPad.
Часті запитання
Максимальний розмір одного медіа-вкладення — 10 MB. При перевищенні ліміту UNNotificationAttachment не створюється, і сповіщення відображається без медіа. Рекомендується оптимізувати зображення до 1–3 MB для швидкого завантаження в Service Extension.
Rich Notification підтримуються на всіх пристроях з iOS 10 та вище, включаючи iPhone 5s та новіші. Content Extension з кастомним UI доступний з iOS 12. SwiftUI в Content Extension — з iOS 16. На старіших версіях сповіщення відображається в стандартному вигляді.
Так, анімовані GIF підтримуються починаючи з iOS 12. GIF завантажується через UNNotificationAttachment як звичайне зображення та автоматично відтворюється при перегляді сповіщення. Розмір GIF обмежений тими ж 10 MB, що й інші формати.
Максимум 4 дії на одне сповіщення при реєстрації категорії. При більшій кількості система відображає перші 4, решту ігнорує. Рекомендується використовувати 2–3 кнопки для оптимального UX — занадто багато варіантів перевантажують інтерфейс.
Так, сервер повинен надсилати push через APNS (Apple Push Notification service) з JSON-пейлоудом, що містить URL медіа-файлу в кастомному полі та прапорець mutable-content: 1. Сервер також вказує category для активації Content Extension та дій.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також