15

我已经设置了一个支持 GCM 的 Android 应用程序,并且有一个小测试应用程序可以向应用程序发送消息。当我在模拟器中运行应用程序时,我可以看到(通过记录消息)它向 GCM 注册并获得了一个令牌。

然后当我将令牌放入我的测试应用程序并让它发送一条消息时,结果显示发送了 1 条消息,0 失败,0 有 ID 更改。

有时味精几乎立即出现,有时需要 20 分钟。周五,我的 2 条测试消息用时 15 和 20 分钟。我今天早上发送的前2个是立即发送的,下一个还没有出现-才10分钟...

我能做些什么来使交货时间始终如一地快吗?随机延迟 20 分钟几乎是不可接受的情况。

4

5 回答 5

30

我们遇到了同样的问题,但它因网络而异。我们认为这是家庭集线器路由器(维珍超级集线器)在五分钟不活动后断开连接。您可以通过每两分钟发送一条空的 GCM 消息来保持连接处于活动状态。

这是对我们所做工作的更深入解释:https ://groups.google.com/d/msg/android-gcm/Y33c9ib54jY/YxnCkaPRHRQJ

于 2012-12-19T09:53:43.960 回答
4

您不能保证快速交付,因为正如 CommonsWare 所指出的那样,GCM 到设备的连接性可能很差。然而,传送列车有两种可能的延迟:1)GCM 连接到手机(如前所述)和 2)实际从 GCM 服务器发出的消息的延迟。如果您在发送应用程序中将“time_to_live”参数设置为 0 秒,那么您至少可以测试延迟发生的位置。

值为 0 秒意味着消息将立即发送,如果发送不成功,消息将在 GCM 服务器上丢弃。对现实生活没有实用价值,但可以让您找出是送货列车的哪个部分造成了延误。

于 2012-10-23T13:39:13.827 回答
3

这确实是由Google Cloud Messaging 中不切实际的心跳间隔造成的。

这可能是 GCM 中最令人沮丧的错误。GCM 的工作原理是维护从 Android 设备到 Google 服务器的空闲套接字连接。这很棒,因为它几乎不消耗电池电量(与轮询相反),并且它允许在消息到达时立即唤醒设备。为确保连接保持活动状态,Android 将在移动连接上每 28 分钟发送一次心跳,在 WiFi 上每 15 分钟发送一次。如果心跳失败,则连接已终止,GCM 将重新建立它并尝试检索任何未决的推送通知。心跳间隔越高,消耗的电池越少,设备从睡眠中唤醒的次数就越少。

然而,这是有代价的:心跳间隔越长,识别断开的套接字连接所需的时间就越长。在部署 GCM 之前,谷歌没有在现实生活中对这些间隔进行足够彻底的测试。这些间隔的问题是由网络路由器和移动运营商引起的,他们在几分钟不活动后断开空闲套接字连接。通常,这在廉价的家用路由器中更为常见,其制造商决定了空闲套接字连接的最长寿命,并终止它以节省资源。这些路由器只能处理有限数量的并发连接,因此采取这种措施是为了防止过载。这会导致 GCM 套接字终止,并且当传递 GCM 消息时,它不会到达设备。设备只会在发送心跳的时间(0 到 28 分钟后)才意识到连接已断开,这会在某些情况下(例如,当消息对时间要求严格时)使推送通知变得无用。根据我的经验,大多数便宜的路由器会在大约 5 到 10 分钟不活动后终止空闲连接。

我写了一篇关于这个和其他 GCM 问题的完整文章:

http://eladnava.com/google-cloud-messaging-extremely-unreliable/

谷歌云消息传递的替代方案

Pushy ( https://pushy.me/ ) 是一个独立的推送通知网关,完全独立于 GCM。它维护自己的后台套接字连接,就像 GCM 一样,以接收推送通知。底层协议是 MQTT,一种极其轻量级的发布/订阅协议,占用的网络带宽和电池非常少。

Pushy 的一个巨大优势在于,用于发送推送通知(从服务器)和注册设备以获取推送通知的代码实际上在 GCM 和 Pushy 之间是可互换的。这使得在实施 GCM 之后切换到 Pushy 变得非常容易,并且因为它的不稳定性而不得不放弃它。

(全面披露:我为自己的项目创建了 Pushy,并意识到许多应用程序将从这样的服务中受益)

于 2015-04-08T09:16:01.900 回答
2

据报道,GCM 存在一个非常严重的问题,即保持活动心跳不那么可靠。因此,由于它仅每 15 分钟(超过 3G)或 28 分钟(通过 Wifi)发送一次,如果由于某种原因导致服务器连接断开,则可能需要很长时间才能恢复。

这些类型的恶作剧促使开发了一种不依赖第三方网络的解决方案,以向离线(后台)Android 应用程序提供可大规模扩展且可靠的推送通知。

https://help.pubnub.com/entries/21720011-Can-my-Android-App-Receive-Messages-While-Inactive

于 2013-07-10T18:35:25.850 回答
0

这件事对我很重要。

我已经在一秒计时器处理程序中设置了此代码,以每 2 分钟发送一条 GCM 消息。希望它能让事物保持活力

            if ((mOneSecondTick %120) == 0){
            // q 1 minute check when we got last call....
            long lDiff = System.currentTimeMillis() - GCMlastCall;
            if (PushAndroidActivity.GCMAvailable){
                Log.d("pushAndroidActivity",String.format("(mOneSecondTick %d",lDiff));
                if (lDiff > 122 * 1000){ // more than a minute
                    Intent intent = new Intent(StayInTouch.this,PushAndroidActivity.class);
                    2startActivity(intent);
                }else{ // every 2 minutes send out a gcm message...
                    asyncWebCall(String.format(AgeingLib.GCMTICKLE,androidid),0);
                    return; // only if it sends a tickle and all is well...
                }
            }else{
                Log.d("pushAndroidActivity",String.format("(mOneSecondTick mod60 no GCM on this device"));
            }
        }

GCMlastCall 是最后一次收到消息,因此我们可以判断 gcm 是否停止。

工作了几天现在感觉还可以

于 2013-01-10T16:49:56.740 回答