Android GCM已成功发送但未在某些设备上收到

时间:2013-12-11 08:19:33

标签: android google-cloud-messaging

在服务器端,我使用的是Google提供的GCM server 1.0.2库。在客户端,我按照official documentation提供的GCM设置。

我的问题是大多数设备上的一切正常,但在少数设备上,推送没有收到。

if (case1)
    message = new Message.Builder()
        .timeToLive(0)
        .collapseKey("0")
        .delayWhileIdle(false)
        .addData("msg", msg).build();
else if (case2)
    message = new Message.Builder()
        .collapseKey("2")
        .addData("msg", msg).build();
else
    message = new Message.Builder().addData("msg", msg).build();

Result result = sender.sendNoRetry(message, regId);
System.out.println("Message ID:"+result.getMessageId());
System.out.println("Failed:" + result.getErrorCodeName());

从上面代码的测试中我可以看到,没有错误。消息ID存在,但错误代码名称为空(这是successful push的标志)。

我几乎尝试了所有设置。测试TTL,折叠键,空闲时设置开启和关闭延迟。

哪些情况可能导致阻止(?)GCM推送?我该如何解决这个问题?

修改

我不知道为什么,但下面的临时解决方案解决了我的问题。

在GcmIntentService#onHandleIntent中删除

GcmBroadcastReceiver.completeWakefulIntent(intent);

此行发布了清醒服务。我很好奇,因为在其他设备上,即使未删除此行,也会连续发送推送消息。

这不是一个解决方案,因为this document声明我应该在每次工作后调用completeWakeFulIntent。此外,我的方法将显着耗尽电池。

有什么建议吗?

4 个答案:

答案 0 :(得分:18)

  1. 确保您已正确设置从Google收到的SENDER ID
  2. 确保您的设备已正确注册Google的GCM服务。
  3. 确保您将推送发送到您从Google收到的正确注册码。并且您没有收到来自Google GCM服务的错误。
  4. 您是否设置了delay_while_idle = 1?这意味着如果设备处于空闲状态(关闭,离线,锁定屏幕等),则消息将无法到达设备。如果您希望获得wakelock许可,请将其更改为delay_while_idle = 0。请阅读更多here
  5. 有时候推送到达需要时间(但从来没有太多时间,那就有问题)。检查你发送的推送的“生存时间”是什么。

答案 1 :(得分:2)

您是否拥有正确版本的Playstore来接收通知? 您是否在这些设备上使用功能强大的Google帐户登录?

当我“强制停止”一个应用程序时,我也遇到了问题,在“强制停止”(从android 3.1开始)后,你无法收到任何应用程序的通知,所以也要小心。

答案 2 :(得分:2)

如果你使用wifi,可能是互联网防火墙阻止了gcm。尝试使用移动SIM卡上网。

答案 3 :(得分:1)

清单

  • 确保Google Play商店已更新至最新版本
  • 确保没有阻止通知的系统范围设置
  • 进入应用程序管理器中的应用程序并取消选中/重新检查'通知'
  • 如果在Wifi上,请将Wifi连接切换到其他AP(如果可能)
  • 重新启动设备
  • 安装'推送通知修复程序' (无论如何安装)

首次运行的通知设置可能会令人烦恼,并且需要设备被踢“#”。在一种或多种方式中。