准备工作
已开通EMAS服务,已创建项目和应用,具体操作请参见:移动研发平台EMAS > 快速入门
已经按照Android SDK接入完成了移动推送Android SDK的接入。
Android推送通知收不到的可能原因
端侧配置错误或者设备不能注册厂商token
EMAS控制台配置错误
推送参数错误
厂商通道推送报错
手机权限设置
所以接下来从上面几个方面逐步排查推送收不到的原因。
第一步:端侧接入排查
确认端侧日志级别为debug:PushServiceFactory.getCloudPushService().setLogLevel(CloudPushService.LOG_DEBUG)
1 自有通道接入排查
1.1 确认端侧启动正常
在Logcat中使用tag:MPS过滤,查看是否有如下输出:
I init agoo config appkey:xxxxxxxxx
D register agoo result 错误码:PUSH_00000, 错误:success
错误码为PUSH_00000表示成功,其他错误码代表注册异常,请对照此链接排查:错误码表
1.2 确认cloud channel初始化正常
在Logcat中输入awcn关键字,查看是否有AUTH_SUCC成功日志输出:
E [awcn.Session]|[seq:335407993.AWCN1_1] notifyStatus status:AUTH_SUCC
2 厂商通道接入排查
2.1 确认是否生成厂商token
小米
在Logcat日志中,过滤MPS:MiPush关键字,出现下面日志代表token注册成功
华为
在Logcat日志中,过滤MPS:Hua关键字,出现下面日志代表token注册成功
荣耀
在Logcat日志中,,过滤MPS:Honor关键字 ,出现下面日志代表token注册成功
VIVO
在Logcat日志中,过滤MPS:vPush关键字,出现下面日志代表token注册成功
OPPO
在Logcat日志中,过滤MPS:OPush关键字,出现下面日志代表token注册成功
魅族
在Logcat日志中,过滤MPS:MeizuPush关键字,出现下面日志代表token注册成功
谷歌
在Logcat日志中,过滤MPS:GcmRegister关键字,出现下面日志代表token注册成功
厂商注册失败
在Logcat日志中,过滤MPS关键字,出现下面日志代表当前设备不支持当前厂商
2.2 确认token上报成功
在Logcat日志中,过滤ThirdPushManager关键字出现下面日志,代表token上报成功
第二步:EMAS控制台排查
如果没有进行各厂商通道配置,则厂商通道通知在推送时无法准确到达设备。
1 获取厂商密钥
2 EMAS平台配置
检查EMAS平台是否配置厂商通道密钥,如果没有配置则无法使用厂商通道,配置的内容与各平台获取的一致。
3 回执ID配置
部分厂商通道需要额外配置回执ID。
没有配置回执ID,则无法获知消息推送的抵达情况和失败原因。
第三步:推送参数排查
消息推送有两种方式:1、EMAS控制台推送 2、使用api调用方式推送
EMAS控制台推送
1 通道ID:
此处为OPPO 通道私信通道 channel_id,以及通用安卓 channel_id
必须设置并且与端侧代码保持一致否则收不到通知
EMAS控制台截图:
端侧示例代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// 通知渠道的id。
String channelId = "8.0up"; // 这个id值需要给后端开发和运维人员,推送的时候对应 AndroidNotificationChannel 参数。
// 用户可以看到的通知渠道的名字。
CharSequence name = "我的测试通道";
// 用户可以看到的通知渠道的描述。
String description = "我的测试通道";
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel mChannel = new NotificationChannel(channelId, name, importance);
// 配置通知渠道的属性。
mChannel.setDescription(description);
// 设置通知出现时的闪灯(如果Android设备支持的话)。
mChannel.enableLights(true);
mChannel.setLightColor(Color.RED);
// 设置通知出现时的震动(如果Android设备支持的话)。
mChannel.enableVibration(true);
// 自定义铃声
mChannel.setSound(Uri.parse("android.resource://"
+ this.getPackageName() + "/" + R.raw.push_hongbao), Notification.AUDIO_ATTRIBUTES_DEFAULT);
mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
// 最后在notificationmanager中创建该通知渠道。
mNotificationManager.createNotificationChannel(mChannel);
}
2 离线保存
在设备离线的时候进行消息存储
如果不设置离线消息将无法到达。
EMAS控制台截图:
3 设置辅助弹窗
EMAS控制台截图:
辅助弹窗仅在厂商通道时生效,如果不设置设备离线时厂商通道辅助弹窗不会展示。
AndroidPopupActivity:辅助弹窗通知打开时跳转的Activity值为activity全路径
4 通知通道及通知分类
即厂商通道通知分类,此分类决定通知在用户设备上的展示情况,需要向各个厂商申请。
EMAS控制台截图:
小米通道:通知类型的 channelId,需要去小米平台申请,详见:申请链接
荣耀通道:通知消息分类importance参数,需要在荣耀平台申请,详见:申请链接
华为通道:服务与通讯类通知需向华为通道申请权限,需要在华为平台申请,详见:申请链接
vivo通道:系统消息需向vivo通道申请权限,需要去vivo平台申请,详见:申请链接
api 调用方式推送
1 通道ID:
必须设置且与端侧设置的一致否则收不到通知
pushRequest.setAndroidNotificationChannel("8.0up"); // OPPO 通道私信通道 channel_id,以及通用安卓 channel_id
2 离线保存
在设备离线的时候进行消息存储,如果不设置离线消息将无法到达。
pushRequest.setStoreOffline(true); // 离线消息是否保存,若保存, 在推送时候,用户即使不在线,下一次上线则会收到,安卓中若为 false 则只走阿里云自有在线通道
3 设置辅助弹窗
如果不设置设备离线时厂商通道辅助弹窗不会展示。
pushRequest.setAndroidPopupActivity("com.alibaba.push.PopupActivity"); //设置该参数后启动辅助弹窗功能, 此处指定通知点击后跳转的 Activity(辅助弹窗的前提条件:1. 集成第三方辅助通道;2. StoreOffline 参数设为 true)
pushRequest.setAndroidPopupTitle("Popup Title"); //设置辅助弹窗通知的标题
pushRequest.setAndroidPopupBody("Popup Body"); //设置辅助弹窗通知的内容
4 通知通道及通知分类
即厂商通道通知分类,此分类决定通知在用户设备上的展示情况,需要向各个厂商申请。
// 厂商通道通知分类
pushRequest.setAndroidNotificationXiaomiChannel("user_define"); //小米通道通知类型 channel_id
pushRequest.setAndroidNotificationHonorChannel("NORMAL"); // 荣耀通道消息分类参数,对应荣耀通道 importance 参数
pushRequest.setAndroidMessageHuaweiCategory("ACCOUNT"); // 华为通道的通知分类参数,服务与通讯类通知需向华为通道申请权限
pushRequest.setAndroidMessageVivoCategory("ACCOUNT"); // vivo 通道的通知分类参数,系统消息需向 vivo 通道申请权限
第四步: 消息链路排查
1 排查消息
查看消息详情以及消息的推送链路的全过程
2 推送消息参数排查
离线存储 StoreOffline:设置消息是否离线存储
辅助弹窗标题 AndroidPopupTitle:厂商通道下发的标题
辅助弹窗内容 AndroidPopupBody:厂商通道下发的内容
辅助弹窗activity AndroidPopupActivity:厂商通道下发时点击通知后的跳转路径
推送时设备状态:消息推送是设备是在线或离线
推送状态:代表消息抵达的状态(已发送:阿里云服务器推送已经下发-> 已到达:已经到达终端设备)
通知栏状态:关闭,则需要检查手机端侧的权限配置
3 推送链路排查
右侧链路失败会显示失败原因(部分厂商需要配置回执ID才会显示)
链路中显示厂商通道相关的错误信息可以查看文档:移动推送厂商通道部分错误码和错误原因说明获的对应的详细报错信息
4 排查设备
查看设备有效性(设备从最后一次活跃时间开始90天内没活跃过就会被删除),以及设备基本信息 如:是否注册对应的厂商token 通知栏状态 等
第五步: 部分厂商特殊权限排查
背景:从 Android8.0(API ≥ 26)开始,Android要求开发者必须为所有的通知分配通道,可以对指定通道分配不一样的权限,默认可能被归类为“不重要通知”会有不弹窗、无声音等或者被归类到通知中心等。因此,可以从下面排查一下手机权限。
1 小米
通知过滤规则:全部设为重要
2 oppo
当前通知分类中的"不重要通知"点击后关闭“设为不重要通知”
3 魅族
通知收纳:全部不收纳
4 其他厂商
部分厂商的静默通知权限是否关闭,通知类别中指定的类别是否允许通知
第六步: 其他辅助排查供参考
1 获取推送消息的完整链路
可以使用数据统计-> 回执日志 获得更详细的分析报错,接入和使用文档如下:回执日志
2 推送消息的注意事项
推送消息中还有一些限制请参考文档如下:
3 各厂商上架要求参考
厂商通道 | 是否需要上架 | 角色 | 是否需要单独开通推送服务 |
华为 | 否 | 个人开发者 | 是 |
荣耀 | 否 | 企业开发者 | 否 |
小米 | 是 | 企业开发者 | 是 |
OPPO | 是 | 企业开发者 | 是 |
vivo | 是 | 企业开发者 | 是 |
魅族 | 否 | 个人开发者 | 否 |
FCM | 否 | 个人开发者 | 否 |