מדריך מלא: התראות Push מאוחדות עם זיהוי HMS ו-GMS
תרחיש נפוץ בפיתוח אפליקציות אנדרואיד לשווקי CIS וסין הוא אובדן של עד 30% מהמשתמשים מכיוון שהתראות push לא עובדות במכשירי Huawei ללא Google Play. שילוב Huawei Push Kit עם זיהוי GMS/HMS בזמן ריצה פותר בעיה זו, וחוסך עד 30% מתקציב ה-push (בדרך כלל $1,500–$3,000 לשילוב, או $2,000 בשנה). יישמנו גישה זו ביותר מ-15 פרויקטים מסחריים — היא מאפשרת לשמור על APK יחיד ומייעלת את התחזוקה. מדריך זה עובר על השלבים המרכזיים: מקביעת השירות הזמין ועד לשליחה מצד השרת ובדיקות.
כיצד פועל זיהוי בזמן ריצה?
ההחלטה המרכזית היא כיצד לטפל בשני התרחישים באפליקציה אחת. ישנן שתי גישות. זיהוי בזמן ריצה בודק בעת ההפעלה אם GMS או HMS זמינים ונרשם לשירות המתאים. שיטה זו מפחיתה את מאמץ התחזוקה פי 2 בהשוואה ל-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
}זיהוי בזמן ריצה מקצר את זמן התחזוקה בחצי בהשוואה למבנים נפרדים — יתרון מוכח מ-15+ פרויקטים. גרסאות נפרדות מכפילות את מאמץ ה-CI/CD.
שלב 1: חיבור HMS SDK
המבנה מקביל ל-FCM: 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 } הוא האנלוגי של agconnect-services.json. הורידו אותו מ-AppGallery Connect. הניחו אותו בתיקיית google-services.json. הוסיפו את תוסף AGCP ואת תלות ה-push ב-Gradle לפי התיעוד העדכני של HMS.
שלב 2: כיצד להשיג את ה-HMS Token?
צרו מחלקת שירות הודעות:
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)
}
}רשמו אותה ב-app/:
<service android:name=".HmsPushService" android:exported="false">
<intent-filter>
<action android:name="com.huawei.push.action.MESSAGING_EVENT" />
</intent-filter>
</service> שלב 3: קבלת Token ידנית
// Асинхронно через 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}")
}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. ה-HMS וה-FCM tokens שונים, ולכן השרת חייב לאחסן את הספק לצד ה-token.
שלב 4: שליחה מצד השרת באמצעות HMS REST API
נקודת קצה: <service android:name=".HmsPushService" android:exported="false"> <intent-filter> <action android:name="com.huawei.push.action.MESSAGING_EVENT" /> </intent-filter> </service> . אימות דורש OAuth2 Bearer token, המתקבל מ-// Асинхронно через 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 מ-AppGallery Connect. ה-token פג לאחר שעה.
{ "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.
שלב 5: טיפול בהתראות ברקע
HMS תומך בשני סוגי הודעות: תצוגה (מוצגות על ידי המערכת) ונתונים (בלתי נראות למשתמש). עבור הודעות נתונים ברקע, הגדירו https://push-api.cloud.huawei.com/v1/{appId}/messages:send ב-payload. זה מאפשר ל-https://oauth-login.cloud.huawei.com/oauth2/v3/token לקבל הודעות גם לאחר סגירת האפליקציה.
שלב 6: בדיקות על מכשירים
בדקו על מכשיר Huawei פיזי ללא GMS או על אמולטור מ-Huawei DevEco Studio. ב-AppGallery Connect → Push Kit → Test, השתמשו בממשק המובנה לשליחת push לבדיקה ל-token ספציפי. כמו כן, ודאו עיבוד הודעות נתונים כשהאפליקציה ברקע.
מלכודות נפוצות ופתרונותיהן
| בעיה | השלכה | פתרון |
|---|---|---|
| APP_ID שגוי | Token לא נוצר | בדקו את agconnect-services.json |
| חסר OAuth2 token | בקשות שרת מחזירות 401 | הגדירו client_secret בקצה האחורי |
| HmsMessageService לא רשום | Push לא מתקבל ברקע | הוסיפו שירות ל-manifest עם intent filter נכון |
| intent שגוי ב-click_action | ההתראה פותחת אקטיביטי שגוי | ודאו את פורמט ה-intent URI |
השוואה בין תכונות FCM ו-HMS
| פרמטר | FCM | HMS Push Kit |
|---|---|---|
| מכשירים נתמכים | כל אנדרואיד עם GMS | Huawei/Honor ללא GMS (100M+ מכשירים) |
| SDK | client_id |
client_secret |
| קובץ הגדרות | { "message": { "data": "{\"title\":\"Новое сообщение\",\"body\":\"Иван написал вам\"}", "token": ["hms_device_token_here"], "android": { "notification": { "title": "Новое сообщение", "body": "Иван написал вам", "click_action": { "type": 1, "intent": "myapp://message?id=123" } } } } } |
com.google.firebase:firebase-messaging |
| REST API | Firebase Admin SDK | HMS REST + OAuth2 |
| תמיכה בנושאים | כן | כן (HMS Topics) |
| דגל push שקט | com.huawei.hms:push |
google-services.json |
| עלות | תשלום לפי שימוש | חינם (עם AppGallery) – זול פי 3 משירותי צד שלישי |
תוצרי שילוב ולוחות זמנים אופייניים
שילוב בסיסי של HMS Push Kit אורך יום אחד. עם זיהוי GMS/HMS בזמן ריצה, מחזור חיים מלא של token ושליחה מצד השרת — יומיים. התוצרים כוללים:
- רישום ב-AppGallery Connect, הגדרת Push Kit
-
agconnect-services.jsonוחיבור HMS SDK -
content_available: trueעם טיפול בהודעות נתונים - זיהוי GMS/HMS בזמן ריצה ורישום
- עדכון token בשרת עם ציון ספק
- שליחה מצד השרת באמצעות HMS REST API (או שילוב עם ספק כמו OneSignal)
- בדיקות על מכשיר HMS פיזי
עם ניסיון מוסמך של למעלה מ-5 שנים בשילוב push ו-15+ פרויקטים מוצלחים, אנו מבטיחים הגדרה אמינה המותאמת לקהל שלכם.







