【问题标题】:Device stops receiving GCM pushes until network is switched设备停止接收 GCM 推送,直到网络切换
【发布时间】:2023-03-25 19:36:02
【问题描述】:

我有一个依赖 GCM 推送通知的 Android 应用,有时,用户的设备会停止接收推送通知。这种行为是间歇性的:在某些设备上,它永远不会失败,只会持续工作数周或数月,而在其他设备上,它会工作几天,然后随机停止接收推送。

每次设备停止工作时,我都会验证设备是否具有来自 GCM 的有效 regId,并且我的服务器正在向该 regId 发送推送。但是,日志显示设备没有收到任何内容。正常推送接收的日志如下所示:

05-15 10:39:21.091: V/GCMBroadcastReceiver(13766): onReceive: com.google.android.c2dm.intent.RECEIVE
05-15 10:39:21.091: V/GCMBroadcastReceiver(13766): GCM IntentService class: com.medigram.v2.GCMIntentService
05-15 10:39:21.091: V/GCMBaseIntentService(13766): Acquiring wakelock
05-15 10:39:21.111: V/GCMBaseIntentService(13766): Intent service name: GCMIntentService-468134393228-13
05-15 10:39:21.131: V/GCMBaseIntentService(13766): Releasing wakelock
05-15 10:39:21.171: V/GCMBroadcastReceiver(13766): onReceive: com.google.android.c2dm.intent.RECEIVE
05-15 10:39:21.171: V/GCMBroadcastReceiver(13766): GCM IntentService class: com.medigram.v2.GCMIntentService
05-15 10:39:21.171: V/GCMBaseIntentService(13766): Acquiring wakelock
05-15 10:39:21.241: V/GCMBaseIntentService(13766): Intent service name: GCMIntentService-468134393228-14
05-15 10:39:21.271: V/GCMBaseIntentService(13766): Releasing wakelock

这些都不会出现在停止接收推送的设备上,因此,我的 GCMIntentService 的 onMessage() 方法也没有被调用。

奇怪的是,当我将设备连接从 3G/4G 切换到 wifi 或反之时,它又开始工作,并且设备立即获得所有积压的推送。到底发生了什么当连接类型改变时?

如果有帮助,以下是我在设备上尝试过的一些操作,其中 push 可以手动重现问题,但无济于事:

-我最初认为这可能是一个上下文问题,但是当简单地切换网络解决了这个问题时,很快就排除了这个问题。无论如何,我尝试通过使用“不保留活动”开发人员选项进行进一步调查,然后将应用程序置于后台,但这对推送没有影响。

-我尝试强制停止应用程序以查看它是否会导致推送停止工作,但问题似乎与应用程序被强制停止无关,因为它仍在工作。

-我尝试将手机设置为飞行模式并返回,但 push 仍然有效。

如果有人能指出我正确的方向,我将不胜感激,因为我已经用尽了 stackoverflow 和 google 上的所有资源。我仍然对这个问题一无所知,就像我开始时一样。

【问题讨论】:

  • this的可能重复
  • 您能提供一些关于您项目设置的见解吗?是图书馆项目吗?您的应用程序是否从库项目中调用 GCM 处理?您的应用在哪些情况下会在 GCM 上注册,是否会取消注册?
  • 您找到解决方案了吗?即使我面临同样的问题。
  • 仅供参考:您可以拨打*#*#426#*#* 并在设备停止接收推送通知时检查设备是否已连接到 Google Play 服务。还可以查看this thread on google forum,了解有关使用的端口、心跳间隔等的更多信息...
  • 我知道这篇文章真的很老了,但只是确认我也遇到了你用 GCM 描述的问题。一两周后,它会出现在一些具有长时间运行应用程序的设备上。它似乎是系统范围的:其他应用程序也停止接收推送通知。 WiFi 的开/关切换会导致再次发送推送通知。所以也许一个解决方案是以编程方式定期切换 WiFi?

标签: android push-notification google-cloud-messaging


【解决方案1】:

通常,Android 在移动连接上每 28 分钟发送一次心跳,在 Wifi 上每 15 分钟发送一次,因此您可以通过在应用中以较短的间隔广播这两个意图来解决此问题。

com.google.android.intent.action.MCS_HEARTBEAT

com.google.android.intent.action.GTALK_HEARTBEAT

        Intent intent = new Intent("com.google.android.intent.action.MCS_HEARTBEAT");
        Intent intent1 = new Intent("com.google.android.intent.action.GTALK_HEARTBEAT");
        sendBroadcast(intent);
        sendBroadcast(intent1);

可以详细阅读here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多