Інтеграція 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 дні.







