Другое

Исправление OneSignal: уведомления с бэкенда не срабатывают в Flutter

Устраняем проблему, почему push-уведомления OneSignal работают из дашборда, но не срабатывают при отправке с бэкенда в приложениях Flutter. Узнайте о решениях аутентификации, шагах проверки API и методах отладки для надежных уведомлений.

Уведомления OneSignal не срабатывают при отправке с бэкенда в приложении Flutter

Я использую OneSignal в своем приложении Flutter для отправки push-уведомлений между клиентом и администратором при обмене сообщениями (как в службе поддержки).

Описание проблемы

  • Тестовые уведомления, отправленные непосредственно из дашборда OneSignal, работают идеально — и клиентские, и административные устройства их получают.
  • Однако, когда клиент отправляет сообщение в поддержку, push-уведомление не поступает на устройство администратора.
  • Аналогично, когда администратор отвечает, клиент также не получает никаких push-уведомлений.
  • Эти действия с сообщениями обрабатываются нашим бэкендом (API, размещенным на нашем сервере), а не непосредственно приложением Flutter.

Техническая настройка

  • Flutter SDK: 3.x
  • OneSignal Flutter SDK: ^5.3.4
  • App ID: правильно добавлен в AndroidManifest
  • И клиент, и администратор входят в систему с помощью OneSignal.login(userId) с использованием уникальных ID
  • Тестовый push из дашборда OneSignal → ✅ работает для обоих
  • Push через приложение (событие сообщения) → ❌ ничего не появляется в дашборде OneSignal или на устройствах

Вопрос

Что может вызывать отсутствие уведомлений OneSignal при отправке через мой бэкенд, хотя тестовые уведомления из дашборда работают нормально? Что мне следует проверить в моем бэкенде, чтобы подтвердить, что вызов API OneSignal действительно выполняется?

Ожидаемый вызов API

Вот вызов API, который я ожидаю, что бэкенд отправит в OneSignal:

json
POST https://onesignal.com/api/v1/notifications
{
  "app_id": "YOUR_APP_ID",
  "include_external_user_ids": ["TARGET_USER_ID"],
  "headings": {"en": "New Support Message"},
  "contents": {"en": "You've received a new message"},
  "data": {"messageId": "12345"}
}

Заголовки

json
Authorization: Basic YOUR_REST_API_KEY
Content-Type: application/json

Есть ли предложения по проверке или отладке этого с стороны бэкенда?

Проблема, при которой тестовые уведомления OneSignal работают из панели управления, но не отправляются через бэкенд, является распространенной проблемой, которая обычно связана с аутентификацией, конфигурацией или проблемами реализации в вашем API-вызове бэкенда. На основе результатов исследований и аналогичных случаев, вот наиболее вероятные причины и решения:

Содержание


Распространенные причины и решения

Несоответствие App ID и API ключа

Наиболее частая проблема - несоответствие учетных данных. Как обнаружили несколько разработчиков, их app_id в запросе не соответствовал фактической настройке приложения OneSignal [источник]. Это часто происходит, когда:

  • Тестирование с разными аккаунтами или приложениями OneSignal
  • Использование учетных данных разработки в продакшене
  • Копирование учетных данных из нескольких проектов

Решение: Дважды проверьте, что ваш app_id и REST API ключ в бэкенде точно соответствуют настройкам вашей панели управления OneSignal.

Неверный формат User ID

Уведомления OneSignal через бэкенд используют include_external_user_ids, которые должны точно соответствовать формату ID, используемому в вашем приложении Flutter с OneSignal.login(userId).

Решение: Убедитесь, что бэкенд отправляет точно такой же формат ID пользователя, который использует ваше приложение Flutter для входа.

Отсутствие обязательных заголовков

Неверные или отсутствующие заголовки могут привести к тихому сбою API-вызова.

json
// Обязательные заголовки
Authorization: Basic YOUR_REST_API_KEY  // Примечание: Basic + пробел + ключ в base64
Content-Type: application/json

Решение: Проверьте, что ваши заголовки правильно отформатированы, особенно заголовок Authorization, который должен использовать Basic аутентификацию с вашим REST API ключом.


Шаги проверки API бэкенда

1. Добавьте логирование отладки в ваш бэкенд

Перед API-вызовом добавьте комплексное логирование для проверки каждого компонента:

javascript
// Пример логирования в Node.js
console.log('Детали вызова API OneSignal:', {
  appId: process.env.ONESIGNAL_APP_ID,
  userId: externalUserId,
  timestamp: new Date().toISOString(),
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Basic ' + process.env.ONESIGNAL_REST_API_KEY.substring(0, 8) + '...' // Показать частично для безопасности
  }
});

2. Используйте инструменты тестирования API

Протестируйте ваш API-вызов с помощью curl или Postman для изоляции проблемы:

bash
curl -X POST \
  https://onesignal.com/api/v1/notifications \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Basic YOUR_REST_API_KEY' \
  -d '{
    "app_id": "YOUR_APP_ID",
    "include_external_user_ids": ["TARGET_USER_ID"],
    "headings": {"en": "Тестовое сообщение"},
    "contents": {"en": "Тестирование уведомления с бэкенда"}
  }'

3. Проверьте ответ в панели управления OneSignal

При совершении API-вызовов следите за панелью управления OneSignal на предмет:

  • Ответов API (200 OK против кодов ошибок)
  • Статуса доставки уведомлений
  • Любых сообщений об ошибках в логах панели управления

Проблемы аутентификации и конфигурации

Аутентификация по REST API ключу

Заголовок Authorization должен правильно использовать Basic аутентификацию. Многие разработчики допускают ошибки в формате base64 кодирования [источник].

Правильный формат:

javascript
const base64 = Buffer.from(`${ONESIGNAL_REST_API_KEY}:`).toString('base64');
const headers = {
  'Authorization': `Basic ${base64}`,
  'Content-Type': 'application/json'
};

Переменные окружения

Убедитесь, что ваш бэкенд считывает правильные переменные окружения для разработки и продакшена:

javascript
// Проверьте, загружены ли переменные окружения
console.log('Конфигурация OneSignal:', {
  appId: process.env.ONESIGNAL_APP_ID,
  apiKey: process.env.ONESIGNAL_REST_API_KEY ? 'Установлена' : 'Отсутствует'
});

Валидация формата API запроса

Убедитесь, что ваш JSON-запрос точно соответствует требованиям OneSignal:

json
{
  "app_id": "YOUR_APP_ID",
  "include_external_user_ids": ["TARGET_USER_ID"],
  "headings": {"en": "Новое сообщение поддержки"},
  "contents": {"en": "Вы получили новое сообщение"},
  "data": {"messageId": "12345"}
}

Распространенные ошибки:

  • Отсутствие кавычек вокруг строковых значений
  • Неверный синтаксис JSON
  • Неправильные типы данных (числа против строк)

Соображения по среде и платформе

iOS Разработка против Продакшена

Для устройств iOS уведомления, отправленные с вашего бэкенда, могут задерживаться или не доходить, если вы используете тестовый сервер Apple (Sandbox) вместо сервера Продакшена [источник].

Решение: Тестируйте с релизной сборкой (ad-hoc или TestFlight), чтобы убедиться, что ваше приложение использует сервер APN Apple в режиме Продакшена.

Конфигурация Android

Проверьте, что ваш AndroidManifest.xml имеет правильную конфигурацию OneSignal:

xml
<application ...>
    <meta-data
        android:name="com.onesignal.AppId"
        android:value="YOUR_APP_ID"/>
</application>

Ограничения ресурсов сервера

Если ваш сервер становится недоступным после отправки уведомлений, это может быть связано с увеличенной нагрузкой от ресурсов уведомлений или ограниченными ресурсами сервера [источник].

Решение: Мониторьте использование ресурсов вашего сервера и убедитесь, что он может обрабатывать API запросы к OneSignal.


Техники отладки и мониторинга

Мониторинг сетевых запросов

Используйте инструменты разработчика браузера или сетевой мониторинг для проверки:

  • Фактического совершения API-вызова
  • Правильности отправляемых заголовков
  • Статуса ответа и тела ответа

Аналитика панели управления OneSignal

Проверяйте вашу панель управления OneSignal на предмет:

  • Кодов ответов API и сообщений об ошибках
  • Статистики доставки уведомлений
  • Статуса подписки устройства

Логирование на стороне устройства

Добавьте логирование в вашем приложении Flutter для проверки регистрации устройства:

dart
OneSignal.shared.setLogLevel(OSLogLevel.verbose);

// Проверьте статус подписки
OneSignal.shared.getDeviceState().then((deviceState) {
  print('Состояние устройства: ${deviceState.toJson()}');
  print('Push токен: ${deviceState.pushToken}');
});

Рекомендации, специфичные для Flutter

Совместимость версий SDK

Убедитесь, что версии вашего Flutter SDK и OneSignal SDK совместимы:

yaml
dependencies:
  onesignal_flutter: ^5.3.4

Реализация входа пользователя

Проверьте реализацию входа пользователя:

dart
// Правильная реализация входа
OneSignal.login('unique_user_id');

// Проверьте, вошел ли пользователь
OneSignal.getDeviceState().then((deviceState) {
  print('Внешний ID пользователя: ${deviceState?.externalUserId}');
});

Обработка событий сообщений

Если вы используете события сообщений, убедитесь в правильной обработке:

dart
OneSignal.shared.setNotificationWillShowHandler((OSNotificationReceivedEvent event) {
  // Обработка входящего уведомления
  event.complete(event.notification);
});

Кроссплатформенное тестирование

Тестируйте на устройствах как Android, так и iOS, так как проблемы могут быть специфичны для платформ. Некоторые пользователи сообщают, что уведомления отображаются как “полученные” в панели управления, но на самом деле не доходят до устройства, что указывает на проблемы с подпиской или расширением службы уведомлений [источник].


Источники

  1. OneSignal push notifications not triggered when sending messages from Flutter app
  2. Notifications not triggering · GitHub Issue
  3. WordPress troubleshooting - OneSignal
  4. How do I send a push notification via the OneSignal API?
  5. Notifications delayed - OneSignal Documentation
  6. [Bug]: v5.0.1 Android - Push Notifications are not received after first app opening

Заключение

Сбой уведомлений OneSignal через бэкенд при работающих тестовых уведомлениях из панели управления обычно связан с проблемами аутентификации, неверным форматированием API или несоответствием сред. Для решения этой проблемы:

  1. Проверьте учетные данные: Дважды проверьте, что ваш app_id и REST API ключ точно совпадают между бэкендом и панелью управления
  2. Добавьте комплексное логирование: Отслеживайте каждый аспект ваших API-вызовов, чтобы определить, где они происходят сбои
  3. Тестируйте с помощью прямых инструментов API: Используйте curl или Postman для изоляции проблем бэкенда от проблем приложения Flutter
  4. Проверьте подписки устройств: Убедитесь, что ваше приложение Flutter правильно регистрирует устройства в OneSignal
  5. Мониторьте различия сред: Тестируйте в условиях, приближенных к продакшену, чтобы исключить проблемы разработки против продакшена

Систематически проверив эти области, вы должны сможете определить, почему ваши уведомления через бэкенд не срабатывают, и правильно настроить уведомления для вашего чата поддержки.

Авторы
Проверено модерацией
Модерация