GCM味精的交货时间是多余的

我已经设置了一个GCM支持的Android应用程序,并有一个testing应用程序发送一个味精的应用程序。 当我在模拟器中运行应用程序,我可以看到(通过日志消息),它注册GCM并获得一个令牌。

然后,当我将令牌放入testing应用程序并发送消息时,结果显示发送了1 msg,发生了0次失败,并且0发生了ID更改。

有时味精几乎立即显示,有时需要20分钟。 星期五,我的2个testing消息花了15到20分钟。 我今天早上送来的头两个是立即,下一个还没有出现 – 只有10分钟…

有什么我可以做的,使交货时间一贯快速? 随机20分钟的延迟将是一个非常不可接受的条件。

Solutions Collecting From Web of "GCM味精的交货时间是多余的"

我们有同样的问题,但是从networking到networking各不相同。 我们认为这是家庭中枢路由器(一个维珍超级中心)五分钟不活动后放下连接。 您可以通过每两分钟发送一个空的GCM消息来确认连接是否处于活动状态。

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

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

值为0秒表示消息将立即发送,如果传送失败,消息将在GCM服务器上丢弃。 这对于现实生活中的使用来说不是一个实际的价值,但是可以让你找出交付火车的哪一部分正在造成延误。

据报道GCM有一个非常严重的问题,保持活跃的心跳不是如此可靠。 因此,由于每隔15分钟(通过3G)或28分钟(通过Wifi)只发送一次,如果由于某种原因导致服务器连接中断,可能会在几分钟内不能恢复。

这些types的恶作剧提示开发一种解决scheme,不依赖于第三方networking向离线(后台)Android应用提供大规模可靠的推送通知。

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

这确实是由于Google云消息传递中不切实际的心跳间隔造成的。

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

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

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

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

Google Cloud Messaging的另一种select

Pushy( https://pushy.me/ )是一个独立的推送通知网关,完全独立于GCM。 它像GCM一样维护自己的后台套接字连接,以接收推送通知。 基础协议是MQTT,这是一个极轻的pub / sub协议,利用很less的networking带宽和电池。

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

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

这个事情对我很重要。

我已经在一秒定时器处理程序内设置了这个代码,每隔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是否停止。

现在工作了好几天,现在看起来还不错

有什么我可以做的,使交货时间一贯快速?

在生产中,由于移动设备是移动设备,因此交付时间将变化很大,因此具有可变的连接性,超出了GCM本身的任何交付问题。