Android GCM 发送成功但在某些设备上未收到
Posted
技术标签:
【中文标题】Android GCM 发送成功但在某些设备上未收到【英文标题】:Android GCM sent successfully but not received on some devices 【发布时间】:2013-12-11 08:19:32 【问题描述】:在服务器端,我使用的是 Google 提供的 GCM 服务器 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 存在,但错误代码名称为 null(这是 successful push 的标志)。
我几乎尝试了所有设置。已使用 TTL、折叠键、空闲设置开启和关闭时的延迟进行测试。
哪些情况会导致阻塞(?)GCM 推送?我该如何解决这个问题?
编辑
我不知道为什么,但下面的临时解决方案解决了我的问题。
在 GcmIntentService#onHandleIntent 中删除
GcmBroadcastReceiver.completeWakefulIntent(intent);
此行释放唤醒服务。不过我很好奇,因为在其他设备上,即使没有删除这条线,推送消息也会连续发送。
这不是一个解决方案,因为this document 声明我应该在每次工作后调用 completeWakeFulIntent。另外,我的方法会大量消耗电池。
有什么建议吗?
【问题讨论】:
你在 WiFi 上测试吗? @Apoorv 不,在 LTE 网络上。刚刚用WIFI测试了一下,没有收到推送... 如果消息发送成功,则 regID 必须是错误/无效的,并且谷歌云消息传递无法传递消息。 @artworkadshi。但是,即使 regId 错误/无效,result.getErrorCodeName() 是否也会返回 null? @JeeSeokYoon developer.android.com/google/gcm/http.html 没有。 【参考方案1】:-
确保您已正确设置您从 Google 收到的
SENDER ID
。
确保您的设备已正确注册到 Google 的 GCM 服务。
确保将推送发送到您从 Google 收到的正确 reg id。并且您没有收到来自 Google GCM 服务的错误消息。
您是否设置了delay_while_idle = 1
?这意味着如果设备处于空闲状态(关闭、离线、锁定屏幕等),消息将不会到达设备。如果您希望您的唤醒锁定权限有所作为,请将其更改为 delay_while_idle = 0
。请阅读更多here。
有时推送到达需要时间(但永远不会有太多时间,那么就会出现问题)。检查您发送的推送的“生存时间”。
【讨论】:
虽然你的方法将是每个有 GCM 问题的人都应该首先采用的方法,但我已经检查并尝试了所有方法。更改了 GCM 提供的所有设置,但似乎没有任何效果。问题不是 GCM,而是“特定手机”上的 GCM。另外,请注意,不释放唤醒锁解决了这个问题。还有其他想法吗? 我也有同样的问题,就像@JeeSeokYoon 一样,这些步骤都没有为我解决。 您是否检查过 Play 服务是否已连接?如果不是,您需要调用 Play 服务问题解决方案。 我有类似的问题,但对我来说,消息只是“有时”收到。为什么 Google 不为此过程提供一些调试工具? 发件人 ID = 项目编号【参考方案2】:您是否有正确版本的 Playstore 来接收通知? 您是否在这些设备上使用功能正常的 Google 帐户登录?
当我“强制停止”一个应用程序时,我也遇到了一个问题,在“强制停止”(从 android 3.1 开始)之后,您无法在任何应用程序上收到通知,所以也要小心。
【讨论】:
我是pretty sure playstore 或 Google 帐户没有任何问题。此外,GCM 只是不起作用(无论我是否强制停止应用程序)。 你在防火墙后面吗?看起来有些人对此有疑问。 没有防火墙或防病毒应用程序...是否有任何 android 设置会阻止 GCM? 我不这么认为......就像我说的是正确版本的 PlayStore 和连接的 Google 帐户。你也可以发布你的清单吗? 我正在使用谷歌官方文档中的演示代码进行测试。除了我删除了“GcmBroadcastReceiver.completeWakefulIntent(intent);”之外没有任何改变(甚至包名也没有)【参考方案3】:如果您使用的是 wifi,可能是 Internet 防火墙阻止了 gcm。尝试使用您的移动 sim 卡上网。
【讨论】:
请阅读上面的 cmets...我已经用 LTE、3 种不同的 WIFI 进行了测试。【参考方案4】:清单
确保 Google Play 商店已更新到最新版本 确保没有针对阻止通知的系统范围设置 进入应用程序管理器中的应用并取消选中/重新选中“通知” 如果使用 Wifi,请将 Wifi 连接切换到其他 AP(如果可能) 重启设备 安装“推送通知修复程序”(无论如何都要安装)首次运行通知设置可能非常随意,需要以其中一种或多种方式“踢”设备。
【讨论】:
安装“推送通知修复程序”(无论如何都要安装)此步骤有效以上是关于Android GCM 发送成功但在某些设备上未收到的主要内容,如果未能解决你的问题,请参考以下文章
对于某些 android 设备,GCM 消息在 GCM 服务器上停留在“已接受”状态