在服务器端,我使用谷歌提供的GCM服务器1.0.2库。在客户端方面,我按照官方文档设置了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存在,但错误代码名称为空(这表明推送成功)。
我已经尝试了几乎所有的设置,包括TTL、折叠键、延迟和闲置等设置。
都有哪些情况可能会导致GCM推送被阻止?我该如何解决这个问题?
编辑
我不知道为什么,但下面的临时解决方案解决了我的问题。
在GcmIntentService#onHandleIntent中,只需删除以下内容:
GcmBroadcastReceiver.completeWakefulIntent(intent);
这行代码释放了唤醒服务。然而我很好奇,因为在其他设备上,即使没有删除此行代码,推送消息也会持续发送。
这不是一个解决方案,因为此文档指出每次工作后都应该调用completeWakeFulIntent方法。另外,我的方法会显著消耗电池。
有什么建议吗?