本文汇总了接入及使用消息推送组件的过程中经常出现的一些问题及其解决方法。
通用问题
关于权限的说明
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 在前台时,消息可以达到,但是不会展示。如果需要在前台实现展示,需要自己做处理。