本文匯總了接入及使用消息推送組件的過程中經常出現的一些問題及其解決方法。
通用問題
關于權限的說明
Android 6.0 后,需要用戶手動授予手機權限,如讀寫 SD 卡。為了更加精準的發送推送,建議開發者引導獲取消息推送所需權限。
日志無法打印
使用魅族手機測試時,如 log.d
和 log.i
日志無法打印,您可通過在 設置 > 輔助功能 > 開發者選項 中打開 高級日志輸出。如遇開發問題,可設置 tag=mpush
,對日志進行過濾。
Android 相關問題
在 10.1.60.5 ~ 10.1.60.7 版本基線中存在的端口解析問題
如果是專有云環境,對于非 443 端口的推送服務器配置會出現解析失敗導致連接錯誤。
解決方法:
如果使用 config 文件打包,請在 config 文件中按如下方式修改:
//config 文件中其他部分省略,在自定義端口號前加上\\{空格} { "pushPort":"\\ 8000", }
如果不使用 config 文件打包,請在
AndroidManifest.xml
中將rome.push.port
的值按如下方式修改://在端口號前加上\{空格} <meta-data android:name="rome.push.port" android:value="\ 8000" />
接入華為、小米等第三方渠道后,無法發送推送
這是由于沒有打開 mPaaS 推送控制臺的渠道的設置開關。請參見 代碼示例 以獲取代碼示例以及使用方法和注意事項。
關于 push ad-token (deviceId) 的生成
服務端依賴 IMSI 和 IMEI 生成 deviceId。因此,建議開發引導用戶獲取所需的 READ_PHONE_STATE
權限。
實現 PUSH 通知欄消息,對 EMUI 和華為移動服務是否有版本限制
對 Emotion UI(簡稱 EMUI,是華為基于 Android進行開發的情感化操作系統)和華為移動服務有版本限制,詳細版本要求請參見 設備接收華為推送消息的條件。
華為手機無法打印日志
在手機撥號界面輸入 *#*#2846579#*#* 進入工程菜單 > 后臺設置 > LOG 設置 > 選中 AP 日志。重啟手機后,logcat 開始生效。
華為手機推送錯誤碼
如需了解錯誤碼詳情,請至華為官網查看 客戶端錯誤碼詳解 及 服務端錯誤碼詳解。
OPPO 推送支持哪些機型和系統版本
目前支持 ColorOS 3.1 及以上系統的 OPPO 機型,一加 5/5T 及以上機型以及 realme 所有 機型。
ColorOS 是由 OPPO 推出的基于 Android 系統深度定制并優化的手機操作系統。
OPPO 手機推送錯誤碼
當 OPPO 推送不生效時,您可在客戶端日志中搜索 OPPO onRegister error =
,獲取錯誤碼,并對照 OPPO 錯誤碼查詢相應的錯誤原因。
vivo 推送支持哪些機型和系統版本
目前,SDK 支持的機型和最低系統版本如下表所示。有關 vivo 推送的其它相關問題,請參見 vivo 推送常見問題匯總。
vivo 手機推送錯誤碼
當 vivo 推送不生效時,您可在客戶端日志中搜索 fail to turn on vivo push state =
,獲取狀態碼,并對照 公共狀態碼 定位具體原因。
Android 常見問題排查步驟
檢查
Manifest
文件是否配置正確。檢查 appId(華為、小米、vivo)、appSecret(小米、OPPO)、appKey(OPPO、vivo)、ALIPUSH_APPID(mPaaS)是否與對應開發平臺的注冊應用一致。
查看 tag 為 mpush 的 logcat 日志。
iOS 相關問題
當 App 處于前臺時, 消息推送是否會有橫幅或聲音提示
蘋果的默認機制是,當 App 在前臺時,消息可以達到,但是不會展示。如果需要在前臺實現展示,需要自己做處理。
消息狀態是 NoBindInfo
NoBindInfo 表示用戶通過 UserId 去推送,但根據 UserId 沒有找到對應的信息。請先確認客戶端是否有調用綁定接口,并且對應的 appId 和 workspaceId 是否一致。
消息狀態是 BadDeviceToken
此狀態只會出現在 iOS 的推送,表示實際推送的 token 非法。先檢查證書的環境是否正確。
如果 App 打包使用開發證書,那么 push 控制臺配置需使用開發環境證書;Xcode 連真機調試,需要使用開發者證書。
如果 App 打包使用生產證書,那么 push 控制臺配置需要使用生產環境證書。
消息狀態是 DeviceTokenNotForTopic
此狀態只會出現在 iOS 的推送,表示此 token 與推送的證書的 BundleId 不匹配。先檢查證書是否正確,并且與客戶端打包的 BundleId 是否一致。
iOS 手機無法收到消息,但消息狀態是 ACKED
對于 iOS 的推送,如果消息狀態是 ACKED,表示已經成功推送給蘋果的推送服務。請先確認是否開啟推送權限,是否有將應用切到后臺。
蘋果的默認機制是,當 App 在前臺時,消息可以達到,但是不會展示。如果需要在前臺實現展示,需要自己做處理。