Реалізація 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







