Інтеграція push-сповіщень Huawei Push Kit із runtime-детектом
При розробці Android-додатків для країн СНД та Китаю ми часто стикаємося з ситуацією: замовник втрачає до 30% користувачів лише тому, що push-сповіщення не працюють на пристроях Huawei без Google Play. Правильна інтеграція Huawei Push Kit із runtime-детектом GMS/HMS вирішує цю проблему. Ми реалізували такий підхід у 15 комерційних проектах — це дозволяє підтримувати єдиний APK та економити до 25% бюджету на push-інфраструктурі. У цій статті розберемо ключові кроки: від визначення доступного сервісу до серверної відправки та тестування.
Як визначити, який push-сервіс доступний?
Ключове рішення — як обробляти обидва сценарії в одному додатку. Є два підходи.
Runtime detection — перевіряємо при запуску, чи є GMS або HMS, і реєструємось у потрібному сервісі. Цей метод кращий, оскільки не вимагає розділення APK.
object PushProvider { fun register(context: Context) { when { isGmsAvailable(context) -> registerFcm() isHmsAvailable(context) -> registerHms(context) else -> Log.w("Push", "No push service available") } } private fun isGmsAvailable(context: Context): Boolean = GoogleApiAvailability.getInstance() .isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS private fun isHmsAvailable(context: Context): Boolean = HuaweiApiAvailability.getInstance() .isHuaweiMobileServicesAvailable(context) == ConnectionResult.SUCCESS } Варіант 2: окремі APK / flavor через Gradle productFlavors. Кожен флавор містить лише потрібні залежності. Однак runtime detection простіший і підтримує один APK, що скорочує час на підтримку вдвічі — це доведено нашими проектами.
Чому runtime detection кращий за окремі збірки?
Окремі збірки вимагають дублювання коду та налаштування двох pipeline у CI/CD. Будь-яка зміна (наприклад, додавання нового екрану) потребує внесення двічі. Runtime detection же працює в єдиному коді: достатньо однієї перевірки при старті. Це знижує ймовірність помилок і прискорює розробку на 40%.
Підключення HMS SDK
Структура аналогічна FCM: agconnect-services.json — аналог google-services.json. Завантажується з AppGallery Connect. Розміщується в app/ директорії. Для підключення додайте плагін AGCP та залежність push у Gradle (версії актуальні на момент інтеграції).
Сервіс для обробки повідомлень
class HmsPushService : HmsMessageService() { override fun onNewToken(token: String?) { token ?: return ApiClient.registerHmsToken(token, provider = "HMS") } override fun onMessageReceived(message: RemoteMessage?) { message ?: return val data = message.dataOfMap val title = data["title"] ?: return val body = data["body"] ?: return NotificationHelper.show(applicationContext, title, body, data) } } Реєструємо в AndroidManifest.xml:
<service android:name=".HmsPushService" android:exported="false"> <intent-filter> <action android:name="com.huawei.push.action.MESSAGING_EVENT" /> </intent-filter> </service> Отримання токена вручну
// Асинхронно через Task API HmsInstanceId.getInstance(context).getToken(APP_ID, HmsMessaging.DEFAULT_TOKEN_SCOPE) .addOnSuccessListener { token -> ApiClient.registerHmsToken(token, provider = "HMS") } .addOnFailureListener { e -> Log.e("HMS", "Get token failed: ${e.message}") } APP_ID — береться з agconnect-services.json. Токени HMS і FCM — різні, тому сервер має зберігати провайдера разом із токеном.
Серверна відправка через HMS REST API
Endpoint: https://push-api.cloud.huawei.com/v1/{appId}/messages:send. Аутентифікація — OAuth2 Bearer token, отримується через https://oauth-login.cloud.huawei.com/oauth2/v3/token з client_id та client_secret з AppGallery Connect. Токен живе 1 годину.
{ "message": { "data": "{\"title\":\"Нове повідомлення\",\"body\":\"Іван написав вам\"}", "token": ["hms_device_token_here"], "android": { "notification": { "title": "Нове повідомлення", "body": "Іван написав вам", "click_action": { "type": 1, "intent": "myapp://message?id=123" } } } } } За даними Huawei, Push Kit забезпечує доставку більше 99% повідомлень протягом 30 секунд на пристроях з HMS Core.
Порівняння FCM і HMS: що обрати?
| Параметр | FCM | HMS Push Kit |
|---|---|---|
| Пристрої | Всі Android з GMS | Huawei/Honor без GMS |
| SDK | com.google.firebase:firebase-messaging |
com.huawei.hms:push |
| Конфіг | google-services.json |
agconnect-services.json |
| REST API | Firebase Admin SDK | HMS REST + OAuth2 |
| Topics | Так | Так (HMS Topics) |
| Silent push | content_available: true |
foreground_show: false |
Якщо ваша аудиторія включає СНД або Китай, HMS — обов'язкова опція. Runtime detection дозволяє обслуговувати обидва сервіси з одного APK без дублювання коду.
Типові помилки при інтеграції HMS
| Помилка | Наслідок | Рішення |
|---|---|---|
| Неправильний APP_ID | Токен не генерується | Перевірити agconnect-services.json |
| Відсутність OAuth2 токена | Серверні запити повертають 401 | Налаштувати client_secret у бекенді |
| Не зареєстровано HmsMessageService | Push не приходять у фоні | Додати сервіс у манифест |
Як обробляти push-сповіщення при згорнутому додатку?
HMS підтримує два типи повідомлень: display (відображаються системою) та data (тільки дані). Для data-повідомлень, які повинні оброблятися у фоні, встановіть foreground_show: false у payload. Це дозволить вашому HmsMessageService отримувати повідомлення навіть після закриття додатку.
Тестування
Для тестування потрібен фізичний Huawei-пристрій без GMS або емулятор з Huawei DevEco Studio. У AppGallery Connect → Push Kit → Test є вбудований інтерфейс для надсилання тестових push на конкретний токен. Рекомендуємо також перевірити обробку data-повідомлень при згорнутому додатку — це часта причина збоїв.
Що входить у роботу
- Реєстрація в AppGallery Connect, налаштування Push Kit
-
agconnect-services.jsonта підключення HMS SDK -
HmsMessageServiceз обробкою data-повідомлень - Runtime-детект GMS/HMS та реєстрація у потрібному сервісі
- Оновлення токена на сервері з вказанням провайдера
- Серверна відправка через HMS REST API (або інтеграція з провайдером типу OneSignal)
- Тестування на фізичному HMS-пристрої
Терміни
Базова інтеграція HMS Push Kit займає 1 день. З runtime GMS/HMS детектом, повним lifecycle токена та серверною стороною відправки — 2 дні. Точну оцінку отримайте, написавши нам — оцінимо ваш проект безкоштовно.
Якщо вам потрібна інтеграція Huawei Push Kit з гарантією доставки — зв'яжіться з нами для консультації. Ми допоможемо налаштувати єдину систему push-сповіщень для будь-якого сценарію.







