整合 Bmob 推送後,發現部分手機(特別是國產 ROM)收不到推送,無論指定推送還是廣播推送。本文提供系統性排查清單,涵蓋網路、廠商通道、ROM 限制、代碼配置四大維度。
Bmob 伺服器 → 廠商通道 (小米/華為/OPPO/vivo/魅族/FCM) → 手機系統級服務 → App 接收 → 展示/回調
任何一環斷裂皆導致「收不到」。
AndroidManifest.xml 權限齊全:INTERNET, ACCESS_NETWORK_STATE, WAKE_LOCK, RECEIVE_BOOT_COMPLETED。BmobPush.startWork(context) 在 Application.onCreate() 呼叫,且 context 為 getApplicationContext()。| 廠商 | 關鍵設定 | 代碼/引導 |
|---|---|---|
| 小米 (MIUI) | 自啟動管理、神隱模式、電池策略「無限制」 | 引導用戶:設定 → 權限 → 自啟動管理 → 開啟 App |
| 華為 (EMUI/HarmonyOS) | 受保護應用、電池優化「不優化」、通知權限 | Intent intent = new Intent(); intent.setAction("com.huawei.android.startup"); 跳轉設定 |
| OPPO/ColorOS | 凍結應用、通知管理、自啟動 | 引導開啟「允許自啟動」、「允許通知」 |
| vivo/FuntouchOS | 高耗電凍結、自啟動管理、i管家白名單 | 同 OPPO |
| 魅族 (Flyme) | 後台管理、通知權限、純淨模式 | 設定 → 權限管理 → 後台管理 → 允許 |
解決方案:集成 Bmob 官方廠商通道 SDK(或個推/極光等第三方推送聚合),自動喚醒廠商系統級通道,大幅提升到達率。
installationId 未正確綁定用戶(BmobInstallation.getCurrentInstallation().save())。BmobQuery 條件錯誤(如 whereEqualTo("channels", "news") 但安裝對象無此欄位)。BmobPushManager 發送時未指定 setQuery 或 setInstallationId,導致無目標。BroadcastReceiver 未在 Manifest 註冊或 exported=true 缺失(Android 12+ 必須顯式聲明)。BmobPush, PushService, MiPush, HwPush 等標籤。若不依賴廠商通道,需自行實作:
Service + Notification 保活(Android 8+ 必須前台)。ping/pong)。ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)。成本極高,強烈建議接入廠商通道 SDK。
// 在 Application.onCreate() 加入測試推送
BmobPushManager manager = new BmobPushManager();
manager.setQuery(BmobInstallation.getQuery());
manager.pushMessageAll("測試推送 " + System.currentTimeMillis());
若測試機收到,說明基礎鏈路通;若特定機型收不到,對應上表 ROM 設定引導用戶或接入廠商 SDK。
推送到達率本質是「系統級通道可用性」與「用戶授權」的博弈,技術手段儘可能,運營引導同樣關鍵。