Реализация Rich Push Notifications в мобильном приложении
Стандартное уведомление — заголовок и текст. Клиенты жалуются, что такие уведомления игнорируют. Мы внедряем Rich Push: изображения, кнопки действий, иногда видео. На iOS это требует Notification Service Extension, на Android — BigPictureStyle. Наш опыт: такие уведомления повышают CTR на 40%, а вовлечённость — до 70%. Ниже разберём оба пути с реальными примерами. Стоимость интеграции Rich Push — от $450–650. на одну платформу, экономия от повторных разработок достигает 30%.
Как настроить 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 и аналитика — обсуждается отдельно. Стоимость реализации — от $450–650. за одну платформу, рассчёт индивидуально.
Типичные ошибки
- 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







