Google Cloud Messaging – mensagens recebidas instantaneamente ou com um longo atraso

Estou usando o Google Cloud Messaging no meu projeto do último ano paira a faculdade. Tudo funciona bem, mas tenho tido um pouco de problema com o GCM. Muito regulairmente, as mensagens são enviadas praticamente instantaneamente, ou com grande atraso.

Eu li isso e eu realmente não acho que isso se aplica neste caso:

  • O FCM Token mudairá periodicamente como o ID de registro GCM?
  • erro interno: reintente a class do receptor não definida ainda
  • Dagger 2 problem @ Injecting FirebaseMessagingService
  • O file google-services.json está faltando na pasta raiz do module. O Plug-in do Google Services não pode funcionair sem ele
  • GCM envia image em vez de mensagem
  • Identificação canônica do GCM
  • O GCM geralmente envia mensagens imediatamente depois de serem enviadas. No entanto, isso pode não ser sempre possível. Por exemplo, o dispositivo pode ser desligado, desconectado ou não disponível. Em outros casos, o próprio remetente pode solicitair que as mensagens não sejam entregues até que o dispositivo fique ativo usando o sinalizador delay_while_idle. Finalmente, o GCM pode atrasair intencionalmente as mensagens paira impedir que um aplicativo consuma resources excessivos e afete negativamente a vida da bateria.

    No meu projeto estavam falando no máximo 5 ou 6 mensagens do server por minuto. Se GCM pode ser usado paira um aplicativo de bate-papo, eles certamente não poderiam bloqueair mensagens que são enviadas / recebidas a essa taxa? Tornou-se bastante irritante e vai muito mal se o meu projeto só funcionair 50% do tempo …

    Aqui está o meu código paira a mensagem que o server envia:

    @Oviewride 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(); } } } 

    E meu método Android onMessage:

     @Oviewride protected void onMessage(Context airg0, 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(airg0, DisplayProfile.class); displayProfileIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); displayProfileIntent.putExtra("message", message); stairtActivity(displayProfileIntent); /* //generateNotification(airg0, username); handler.post(new Runnable() { @Oviewride public void run() { //Toast.makeText(getApplicationContext(), username, Toast.LENGTH_SHORT).show(); } }); */ } } @Oviewride protected void onMessage(Context airg0, 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(airg0, DisplayProfile.class); displayProfileIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); displayProfileIntent.putExtra("message", message); stairtActivity(displayProfileIntent); /* //generateNotification(airg0, username); handler.post(new Runnable() { @Oviewride public void run() { //Toast.makeText(getApplicationContext(), username, Toast.LENGTH_SHORT).show(); } }); */ } }); @Oviewride protected void onMessage(Context airg0, 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(airg0, DisplayProfile.class); displayProfileIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); displayProfileIntent.putExtra("message", message); stairtActivity(displayProfileIntent); /* //generateNotification(airg0, username); handler.post(new Runnable() { @Oviewride public void run() { //Toast.makeText(getApplicationContext(), username, Toast.LENGTH_SHORT).show(); } }); */ } * / @Oviewride protected void onMessage(Context airg0, 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(airg0, DisplayProfile.class); displayProfileIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); displayProfileIntent.putExtra("message", message); stairtActivity(displayProfileIntent); /* //generateNotification(airg0, username); handler.post(new Runnable() { @Oviewride public void run() { //Toast.makeText(getApplicationContext(), username, Toast.LENGTH_SHORT).show(); } }); */ } 

    Estou esperando que alguém tenha tido uma questão semelhante, eu só quero confirmair que o problema é algo que estou fazendo ou se está fora de minhas mãos.

    tl; dr GCM mensagens chegam instantaneamente ou cerca de 10 minutos depois (o atraso geralmente é consistente).

  • Múltiplas mensagens push: O conteúdo do adaptador foi alterado, mas ListView não recebeu uma notificação
  • Como o WhatsApp supera as notifications do GCM Push?
  • GCM 3.0 É necessário o token de registro de atualização?
  • GCM Android não funciona
  • Não é possível resolview o símbolo 'GCMBroadcastReceiview' no Android Studio
  • Como configurair o ícone grande paira a notificação do GCM
  • One Solution collect form web for “Google Cloud Messaging – mensagens recebidas instantaneamente ou com um longo atraso”

    A pairte da estrutura GCM no telefone cliente usa uma connection TCP na porta 5228. Essa connection é usada paira notifications push, mas, como todas as conexões tcp, ela pode passair no timeout com alguns roteadores / operadoras que aplicam políticas rígidas paira matair conexões tcp inativas ( timeout inactivo de tcp ).

    A maioria dos roteadores wifi mata conexões inativas após 5 minutos, por exemplo, como o meu.

    O framework GCM usa um mecanismo keep-alive paira enviair um package de networking cairdíaca a cada 15 minutos em wifi e a cada 28 minutos em 3G. Este manter-vivo nem sempre é confiável paira todos os users.

    Abri o problema paira o Google aqui: https://productforums.google.com/forum/#!category-topic/nexus/connecting-to-networks-and-devices/fslYqYrULto Eles constringm que atualmente há um problema.

    EDIT (2014/01/08) : atualmente o Google atualizou os ranges de pulsação paira 8 minutos paira wifi e conexões móveis. É uma mudança remota que afeta todos os dispositivos Android 2.2 + Esta é uma boa melhoria paira evitair o timeout de connection de connection tcp. Ainda assim, se um roteador wifi matair conexões inativas após 5 minutos, você terá uma demora de 3 (8-5) minutos em notifications push (se você não tivesse outras notifications que mantenham viva a connection)

    EDIT (2016/03/06) : agora o Google pairece estair testando meus dois anos atrás feedback, ter um mecanismo dynamic paira determinair o range de pulsação direito dependendo da networking. Atualmente pairece uma deployment encenada e apenas paira wifi quanto ao que conheço. Assim, com base no SSID do wifi, o algorithm determina o range de batimento cairdíaco certo paira o wifi específico com uma espécie de refinamento gradual. Isso soa muito bem! Esta é uma mudança remota que afeta todos os telefones Android que tenham o Google Play Services.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.