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

30

在服务器端,我使用谷歌提供的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方法。另外,我的方法会显著消耗电池。

有什么建议吗?


你是在测试 WiFi 吗? - Apoorv
@Apoorv 不是在 WIFI 网络上,是在 LTE 网络上。刚刚测试了一下 WIFI,但没有收到推送... - Jee Seok Yoon
@artworkadシ。然而,即使regId无效或错误,result.getErrorCodeName()返回null的情况是否存在? - Jee Seok Yoon
@Eran 嗯...我正在使用官方Google文档中的演示代码进行测试。除了删除"GcmBroadcastReceiver.completeWakefulIntent(intent);"之外,没有任何更改(甚至包名也没有更改)。 - Jee Seok Yoon
我有同样的问题。演示代码似乎在Android 4.4上运行良好,但其他设备(已测试过Android 2.3.4、4.0.3、4.1)无法接收推送通知。 - sockeqwe
显示剩余10条评论
4个回答

18
  1. 请确保您正确设置了从Google收到的SENDER ID
  2. 请确保您的设备已经成功注册到Google的GCM服务中。
  3. 请确认您将推送发送到了从Google获取的正确的注册ID,并且没有从Google GCM服务收到错误信息。
  4. 请确认您设置了delay_while_idle = 1。这意味着如果设备处于空闲状态(关闭、离线、锁定屏幕等),则消息将无法到达设备。如果要使用wakelock权限,请将其更改为delay_while_idle = 0。请在此处阅读更多信息。
  5. 有时候,推送需要一些时间才能到达(但不会太长时间,那就是问题了)。请检查您发送的推送的“存活时间”是什么。

1
虽然你的方法是所有遇到GCM问题的人应该采取的第一步,但我已经检查并尝试了所有这些方法。改变了GCM提供的每个设置,但似乎没有任何作用。问题不在于GCM,而是在于“特定手机上的”GCM。此外,请注意,释放唤醒锁可以解决此问题。还有其他想法吗? - Jee Seok Yoon
我有同样的问题,就像@JeeSeokYoon一样,这些步骤都没有解决我的问题。 - Mark Whitaker
你检查过Play服务是否已连接吗?如果没有,你需要调用Play服务的问题解决方法。 - Assaf Gamliel
8
我有类似的问题,但对我来说,信息只是“偶尔”被接收。为什么 Google 不提供一些调试工具来解决这个问题呢? - bashan
发送者 ID = 项目编号 - Arpit Patel

2

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

当我“强制停止”应用程序时,我也遇到了问题,在“强制停止”(从Android 3.1开始)后,任何应用程序都无法接收通知,因此请注意。


我相当确定Play商店或Google账户没有问题。此外,无论我是否强制停止应用程序,GCM都不起作用。 - Jee Seok Yoon
你是否在防火墙后面?看起来有些人遇到了这个问题。 - Andros
没有防火墙或反病毒应用程序...是否有任何Android设置会阻止GCM? - Jee Seok Yoon
我正在使用官方谷歌文档中的演示代码进行测试。除了删除“GcmBroadcastReceiver.completeWakefulIntent(intent);”之外,没有做任何更改(甚至包名称也没变)。 - Jee Seok Yoon
所以你的应用程序包名称是“com.example.gcm”吗? - Andros
显示剩余2条评论

2

如果您正在使用WiFi,可能是因为互联网防火墙阻止了GCM。请尝试使用您的手机SIM卡连接互联网。


请阅读上面的注释...我已经用LTE、3种不同的WIFI进行了测试。 - Jee Seok Yoon

2

检查清单

  • 确保Google Play商店已更新到最新版本
  • 确保没有系统通知阻止的全局设置
  • 进入“应用程序管理器”中的应用,并取消选中/重新选中“通知”
  • 如果在Wifi上,请将Wifi连接切换到另一个接入点(如果可能)
  • 重新启动设备
  • 安装“推送通知修复程序”(无论如何都要安装此程序)

首次运行通知设置可能会随意出现问题,需要通过以上一种或多种方式来“唤醒”设备。


安装“推送通知修复程序”(无论如何都要安装) 这一步成功了。 - Bam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接