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







