Google云消息传递 – 即时或长时间收到消息

我在大学的最后一年项目中使用Google云消息。 一切正常,但我一直在GCM有点麻烦。 相当经常地,消息要么立即传递,要么拖延很长。

我读过这个,我真的不认为它适用于这种情况:

GCM通常会在发送消息之后立即发送消息。 但是,这可能不总是可能的。 例如,该设备可能被closures,脱机或不可用。 在其他情况下,发送方自己可能会要求在设备通过使用delay_while_idle标志变为活动状态之前不传递消息。 最后,GCM可能会故意拖延消息,以防止应用程序消耗过多资源并对电池寿命造成负面影响。

在我的项目中,每分钟最多只有5或6条消息。 如果GCM确实可以用于聊天应用程序,它们不能阻止以这种速率发送/接收的消息? 如果我的项目只有50%的时间工作,这已经变得非常烦人,而且会非常糟糕。

这是我的服务器发送的消息的代码:

@Override public void run() { Message.Builder messageBuilder = new Message.Builder().delayWhileIdle(false); Gson gson = new Gson(); messageBuilder.addData("profile", gson.toJson(profile)); databaseConnection.notifyDevices(messageBuilder.build()); } public void notifyDevices(Message message) { Sender sender = new Sender(xxx); List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("message", message.toString())); //LOG System.out.println("Notifying devices with the following message \n \"" +message+ "\""); List<String> deviceIDsList = new ArrayList<String>(); String [] deviceIDArray; //Get devices to notify List<JSONDeviceProfile> deviceList = getDevicesToNotify(); for(JSONDeviceProfile device : deviceList) { deviceIDsList.add(device.getDeviceId()); try { sender.send(message, device.getDeviceId(), 5); } catch (IOException e) { System.out.println("Error sending GCM message!"); e.printStackTrace(); } } } 

和我的Android onMessage方法:

 @Override protected void onMessage(Context arg0, Intent intent) { String message = intent.getStringExtra("profile"); Log.d(TAG + "Received Message: ", "Received Message: " + message.toString()); //CALL NEW INTENT WITH PROFILE DETAILS Intent displayProfileIntent = new Intent(arg0, DisplayProfile.class); displayProfileIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); displayProfileIntent.putExtra("message", message); startActivity(displayProfileIntent); /* //generateNotification(arg0, username); handler.post(new Runnable() { @Override public void run() { //Toast.makeText(getApplicationContext(), username, Toast.LENGTH_SHORT).show(); } }); */ } 

我希望有人有类似的问题,我只是想确认,问题是我正在做的事情,或者如果它是我的手中。

tl; dr GCM消息要么​​立即到达,要么大约在10分钟后(延迟通常是一致的)。

Solutions Collecting From Web of "Google云消息传递 – 即时或长时间收到消息"

客户端电话上的GCM框架部分在端口5228上使用TCP连接 。该连接用于推送通知,但是由于每个tcp连接都可以与一些应用严格策略的路由器/运营商进行超时,从而终止非活动的tcp连接TCP空闲超时 )。

5分钟后,大多数的无线路由器杀死不活跃的连接,例如,像我的。

GCM框架使用保活机制在wifi上每15分钟发送一次心跳networking数据包,在3G上每28分钟发一次心跳networking数据包。 对于所有用户来说,这种保持活力并不总是可靠的。

我在这里打开问题到谷歌: https : //productforums.google.com/forum/#!category-topic/ nexus/ connecting- to-networks-and-devices/ fslYqYrULto他们同意目前有一个问题。

编辑(2014/01/08) :目前谷歌更新的心跳间隔为8分钟的WiFi和移动连接。 这是一个影响所有Android设备的远程更改2.2+这是避免tcp push连接超时的一个很好的改进。 尽pipe如此,如果wifi路由器在5分钟后终止非活动连接,您将在推送通知中有3(8-5)分钟的延迟(如果没有其他通知保持活动连接)

编辑(2016/03/06) :现在谷歌似乎正在testing我2年前的反馈,有一个dynamic的机制来确定从networking的权利心跳间隔。 目前似乎是一个阶段性的推出,只为了我所知道的WiFi。 因此,根据wifi SSID,该algorithm通过逐步细化来确定特定wifi的正确心跳间隔。 这声音非常好! 这是一个影响每个有Google Play服务的Android手机的远程更改。