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

在服务器端,我使用的是由Google提供的GCM服务器1.0.2库。 在客户端,我根据官方文档提供了GCM。

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

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()); 

从上面的代码的testing中我可以看到,没有错误。 消息ID存在,但错误代码名称为空(这是成功推送的标志)。

我尝试了几乎所有的设置。 用TTL进行testing,折叠键,空闲时延时设定为开和关。

什么是可能导致阻止(?)GCM推的一些情况? 我该如何解决这个问题?

编辑

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

在GcmIntentService#onHandleIntent中删除

 GcmBroadcastReceiver.completeWakefulIntent(intent); 

这一行释放清醒的服务。 我很好奇,因为在其他设备上,即使这条线路没有被移除,推送消息也会连续发送。

这不是一个解决scheme,因为这个文件指出,我应该在每次工作后调用completeWakeFulIntent。 另外,我的方法会显着消耗电池。

任何build议?

Solutions Collecting From Web of "Android GCM已成功发送,但未在某些设备上收到"

  1. 确保您已经正确设置了您从Google收到的SENDER ID
  2. 确保您的设备已正确注册Google的GCM服务。
  3. 确保您将推送到您从Google收到的正确的注册ID。 而且您没有收到来自Google GCM服务的错误。
  4. 你有没有设置delay_while_idle = 1 ? 这意味着如果消息闲置(离线,离线,locking屏幕等),则消息不会到达设备。 将其更改为delay_while_idle = 0如果你想让你的wakelock权限有所作为。 请在这里阅读更多。
  5. 有时候推送到达需要时间(但是不要太多的时间,那么就有问题了)。 检查您发送的推送的“生存时间”是什么。

你有正确版本的Playstore来接收通知吗? 您是否在这些设备上使用function性Google帐户login?

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

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

清单

  • 确保Google Play商店已更新到最新版本
  • 确保没有阻止通知的系统范围设置
  • 在应用程序pipe理器中进入应用程序,取消选中/重新检查“通知”
  • 如果在Wifi上,将Wifi连接切换到不同的AP(如果可能的话)
  • 重新启动设备
  • 安装“推送通知修复程序”(反正安装)

首次运行的通知设置可以是任意的,并且需要以这些方式中的一个或多个“踢”设备。