Интеграция push-уведомлений через Huawei Push Kit
Huawei устройства без Google Mobile Services (GMS) — реальность для значительной части рынка: Huawei P40, Mate 30/40/50, Honor после 2020 года. На этих устройствах FCM не работает. Push Notification просто не придёт. Если ваше приложение нацелено на СНГ, Китай или рынки с высокой долей Huawei — интеграция HMS Push Kit обязательна.
Huawei HMS vs Google GMS: архитектурный выбор
Ключевое решение — как обрабатывать оба сценария в одном приложении.
Вариант 1: Runtime detection. Проверяем при запуске, есть ли GMS или HMS, и регистрируемся в нужном сервисе:
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: gms и hms. Каждый флавор содержит только нужные зависимости. Распространяется через Google Play (gms) и AppGallery (hms) соответственно.
Для большинства проектов — вариант 1 проще и поддерживает один APK.
Подключение HMS SDK
В agconnect-services.json — аналог google-services.json. Скачивается из AppGallery Connect. Размещается в app/ директории.
// project build.gradle
classpath 'com.huawei.agconnect:agcp:1.9.1.301'
// app build.gradle
apply plugin: 'com.huawei.agconnect'
dependencies {
implementation 'com.huawei.hms:push:6.11.0.300'
}
Сервис для обработки сообщений
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
{
"message": {
"data": "{\"title\":\"Новое сообщение\",\"body\":\"Иван написал вам\"}",
"token": ["hms_device_token_here"],
"android": {
"notification": {
"title": "Новое сообщение",
"body": "Иван написал вам",
"click_action": {
"type": 1,
"intent": "myapp://message?id=123"
}
}
}
}
}
Аутентификация — OAuth2 Bearer token, получается через https://oauth-login.cloud.huawei.com/oauth2/v3/token с client_id и client_secret из AppGallery Connect. Токен живёт 1 час.
Сравнение 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 нужно физическое Huawei-устройство без GMS или эмулятор из Huawei DevEco Studio. AppGallery Connect → Push Kit → Test имеет встроенный интерфейс для отправки тестовых push на конкретный токен.
Что входит в работу
- Регистрация в 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 дня.







