开发者社区 问答 正文

应用研发平台EMAS中有的时候在后台(APP没被杀死)收不到推送是什么原因?

应用研发平台EMAS中有的时候在后台(APP没被杀死)收不到推送是什么原因?前台都能收到

展开
收起
陈幕白 2024-04-01 20:44:42 70 分享 版权
阿里云 AI 助理回答

在应用研发平台EMAS中,后台(APP未被杀死)收不到推送通知的问题可能由多种原因导致。以下是详细的原因分析及解决方案:


1. Channel进程未正确初始化

移动推送在初始化过程中会启动一个后台channel进程,用于维持长连接并接收推送消息。如果channel进程未正确执行初始化操作,可能导致后台无法接收到推送。

  • 问题表现:前台可以正常接收推送,但后台无法接收。
  • 排查方法
    • 检查日志中是否有以下输出,确认channel进程是否执行了初始化操作:
    [AMS]Initialize Mobile Push service...
    
    • 如果没有相关日志输出,则说明channel进程未正确初始化。
  • 解决方案
    • 确保PushServiceFactory.init方法在Application主线程中调用,不能放在Activity中或异步执行。
    • 避免在自定义Application中对推送SDK初始化进行进程判断,导致初始化仅在主进程执行。例如,以下代码会导致问题:
    if (isMainProcess()) {
        PushServiceFactory.init(context);
    }
    

    应移除进程判断逻辑,确保所有进程均执行初始化。


2. NotificationChannel未正确设置

从Android 8.0(API Level 26)开始,系统引入了NotificationChannel机制。如果未正确设置NotificationChannel,即使推送消息已到达客户端,也无法弹出通知。

  • 问题表现:推送消息到达客户端,但通知栏未显示。
  • 排查方法
    • 检查targetSdkVersion是否大于等于26。
    • 确认是否为推送创建了对应的NotificationChannel
  • 解决方案
    • ApplicationonCreate方法中注册NotificationChannel,示例代码如下:
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        String id = "1"; // 通知渠道ID
        CharSequence name = "notification channel"; // 渠道名称
        String description = "notification description"; // 渠道描述
        int importance = NotificationManager.IMPORTANCE_HIGH; // 重要性级别
        NotificationChannel mChannel = new NotificationChannel(id, name, importance);
        mChannel.setDescription(description);
        mChannel.enableLights(true); // 启用指示灯
        mChannel.setLightColor(Color.RED); // 设置指示灯颜色
        mChannel.enableVibration(true); // 启用震动
        mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500});
        mNotificationManager.createNotificationChannel(mChannel);
    }
    
    • 注意:修改NotificationChannel后,需卸载重装App才能生效。

3. 厂商通道限制或配置问题

部分厂商(如华为、小米、OPPO、vivo等)对推送消息有特定的分类和限制。如果未正确配置厂商通道的消息分类,可能导致后台无法接收到推送。

  • 问题表现:推送消息在某些厂商设备上无法弹出通知。
  • 排查方法
    • 检查是否为不同厂商通道设置了正确的消息分类参数,例如AndroidNotificationHuaweiChannelAndroidNotificationHonorChannel等。
    • 确认是否符合各厂商的推送QPS规则和数量限额。
  • 解决方案
    • 根据厂商要求申请并配置消息分类。例如:
    • 华为:使用AndroidMessageHuaweiCategory参数设置消息分类。
    • 荣耀:使用AndroidNotificationHonorChannel参数设置消息分类。
    • 参考厂商通道的使用指南,确保推送内容符合规范。

4. 推送类型设置问题

推送类型(PushType)决定了消息的下发方式。如果推送类型设置为MESSAGE而非NOTICE,消息将不会默认在通知栏弹出。

  • 问题表现:推送消息到达客户端,但未在通知栏显示。
  • 排查方法
    • 检查推送请求中的PushType参数是否设置为NOTICE
  • 解决方案
    • PushType设置为NOTICE,以确保消息通过厂商通道下发并在通知栏弹出。

5. 其他常见问题

  • 设备限制:部分设备可能对通知弹出进行了限制,例如关闭了通知权限或设置了省电模式。
    • 解决方案:引导用户检查设备的通知设置,确保允许App弹出通知。
  • SDK版本问题:如果使用的是旧版本SDK,可能存在兼容性问题。
    • 解决方案:升级到最新版本的推送SDK和服务端OpenApi SDK。

总结

后台收不到推送的原因可能涉及channel进程初始化、NotificationChannel设置、厂商通道配置、推送类型设置等多个方面。建议按照以下步骤逐一排查: 1. 确保PushServiceFactory.initApplication主线程中执行,并避免进程判断逻辑。 2. 检查并正确设置NotificationChannel。 3. 配置厂商通道的消息分类参数,确保符合各厂商的要求。 4. 确认推送类型设置为NOTICE。 5. 引导用户检查设备通知权限和设置。

通过以上步骤,可以有效解决后台收不到推送的问题。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答