Реалізація Rich Push Notifications у мобільному застосунку
Стандартне сповіщення — заголовок і текст. Клієнти скаржаться, що такі сповіщення ігнорують. Ми впроваджуємо Rich Push: зображення, кнопки дій, іноді відео. На iOS це вимагає Notification Service Extension, на Android — BigPictureStyle. Наш досвід: такі сповіщення підвищують CTR на 40%, а залученість — до 70%. Нижче розберемо обидва шляхи з реальними прикладами. Вартість інтеграції визначається після аналізу.
Як налаштувати Rich Push на iOS?
Без NSE зображення в push на iOS не працює. NSE — окремий таргет в Xcode, що перехоплює сповіщення до показу. Він завантажує медіа та прикріплює як UNNotificationAttachment. Ми гарантуємо сумісність з останніми версіями iOS.
// NotificationService.swift
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["image_url"] as? String, let url = URL(string: urlString) else {
contentHandler(content)
return
}
downloadImage(from: url) { localURL in
if let localURL, let attachment = try? UNNotificationAttachment(identifier: "image", url: localURL) {
content.attachments = [attachment]
}
contentHandler(content)
}
}
private func downloadImage(from url: URL, completion: @escaping (URL?) -> Void) {
URLSession.shared.downloadTask(with: url) { tempURL, _, _ in
completion(tempURL)
}.resume()
}
}NSE має ліміт виконання близько 30 секунд. Якщо медіа не завантажилося, iOS покаже сповіщення без зображення. Оптимізуємо медіа: розмір до 1 МБ, формат JPEG або PNG. Згідно з документацією Apple, перевищення ліміту приховує зображення.
Кнопки дій на iOS. Реєструємо категорії під час старту застосунку:
let likeAction = UNNotificationAction(identifier: "LIKE", title: "Лайк", options: [])
let replyAction = UNNotificationAction(identifier: "REPLY", title: "Відповісти", options: [.foreground])
let category = UNNotificationCategory(identifier: "POST_CATEGORY", actions: [likeAction, replyAction], intentIdentifiers: [])
UNUserNotificationCenter.current().setNotificationCategories([category])У payload сповіщення вказуємо category: "POST_CATEGORY" — iOS покаже кнопки. Обробка натискання:
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
switch response.actionIdentifier {
case "LIKE":
likePost(id: response.notification.request.content.userInfo["post_id"] as? String)
case "REPLY":
openReplyScreen(for: response.notification.request.content.userInfo)
default:
break
}
completionHandler()
} Чому Data Message переважніший за Notification Message на Android?
На Android кастомний UI нативно:
val bitmap = BitmapFactory.decodeStream(
URL(imageUrl).openConnection().getInputStream()
)
val notification = NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(title)
.setContentText(body)
.setStyle(
NotificationCompat.BigPictureStyle()
.bigPicture(bitmap)
.setSummaryText(body)
)
.addAction(
R.drawable.ic_like,
"Лайк",
getLikePendingIntent(postId)
)
.addAction(
R.drawable.ic_reply,
"Відповісти",
getReplyPendingIntent(postId)
)
.build()Завантаження bitmap не можна робити на main thread. Використовуємо Glide або WorkManager. FCM Data Message — правильний підхід, оскільки Notification Message обробляється системою без виклику коду. Data Message завжди йде в onMessageReceived. У реальних проєктах Data Message надійніший: при вбитому застосунку Notification Message не гарантує показ зображення, а Data Message — гарантує.
Формати медіа
| Платформа | Зображення | Відео | GIF |
|---|---|---|---|
| iOS NSE | JPEG, PNG, GIF (прев'ю), HEIC | MP4 (до 50 МБ) | Немає нативно |
| Android | JPEG, PNG | Немає | Немає нативно |
Покрокова інструкція інтеграції Rich Push
- Оцінка архітектури push — з'ясовуємо, чи використовується FCM або сторонній сервіс.
- Проєктування категорій і payload — визначаємо типи сповіщень, кнопки, поля для медіа.
- Реалізація NSE на iOS — створюємо таргет, додаємо код завантаження та прикріплення.
- Реалізація BigPictureStyle на Android — налаштовуємо Data Message, використовуємо NotificationCompat.
- Тестування на реальних пристроях — перевіряємо всі сценарії (активний/фоновий/вбитий застосунок).
- Деплой і моніторинг — публікація в сторах, відстеження кліків.
Терміни та що входить в роботу
| Етап | Опис | Термін |
|---|---|---|
| Аналітика | Оцінка поточної архітектури push, вибір підходу | 1 день |
| Проєктування | Створення схеми категорій, payload, дизайн медіа | 1–2 дні |
| Реалізація | Написання NSE, BigPictureStyle, кнопок, обробників | 2–3 дні |
| Тестування | Перевірка на реальних пристроях, сценарії помилок | 1 день |
| Деплой | Публікація в App Store/Google Play, моніторинг | 0,5 дня |
Входить: налаштування NSE, реєстрація категорій та обробка натискань на iOS; інтеграція FCM Data Message і BigPictureStyle на Android; тестування на обох платформах; документація. Не входить: кастомний Notification Content Extension та аналітика — обговорюється окремо. Вартість визначається індивідуально.
Типові помилки
- OneSignal і NSE. Якщо використовуєте OneSignal, додайте таргет OneSignalNotificationServiceExtension в App Groups. Інакше зображення не з'являться без помилок у логах.
- Подвійний payload на Android. При одночасному використанні notification і data полів в FCM, коли застосунок вбито, onMessageReceived не викликається. Використовуйте лише data payload.
- Розмір медіа. На iOS медіа понад 1 МБ може не встигнути завантажитися за 30 секунд. На Android великі зображення викликають OutOfMemoryError. Оптимізуйте до 500 КБ.
Чому варто довірити нам
Ми маємо понад 7 років досвіду в мобільній розробці, реалізували більш ніж 30 проєктів з push-сповіщеннями. Гарантуємо сумісність з останніми версіями iOS та Android, дотримання App Store Review Guidelines. Обробляємо до 1000 сповіщень на хвилину без втрати продуктивності. Замовте впровадження Rich Push у вашому застосунку — і ми підготуємо пропозицію за 1 день. Отримайте консультацію щодо вашого проєкту — це допоможе оцінити економію бюджету.
Джерела: UNNotificationServiceExtension — Apple Developer Documentation, BigPictureStyle — Android Developers







