¿Cuáles son las razones por las que el ID de GCM no está disponible en algunos casos en android

Hola estamos trabajando en una aplicación de Android en la que GCM desempeña un papel muy importante en el propósito de marketing, empujar algunos información importante a los usuarios, etc

Está funcionando bien en 60-70% casos, pero otros 30-40% no funciona. Así que el resto de los usuarios nunca reciben ninguna notificación que sea útil sólo para ellos.

Esta es la razón por la que estamos perdiendo usuarios todos los días. A continuación se muestra mi código para obtener el ID de registro de GCM.

String msg = ""; int exceptionOccurRetry = 0; while (exceptionOccurRetry < 5) { try { if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(context); } int retry = 0; while (retry < 5 && regid.length() == 0) { regid = gcm.register(SENDER_ID); ++retry; } msg = "Device registered, registration ID=" + regid; if (!regid.equals("")) { // You should send the registration ID to your // server // over HTTP, so it // can use GCM/HTTP or CCS to send messages to your // app. sendRegistrationIdToBackend(); } break; } catch (IOException ex) { msg = "Error :" + ex.getMessage(); exceptionOccurRetry++; } } 

Estamos buscando cuáles son las razones por las que el ID de GCM no está disponible para algunos usuarios.

Sabemos una sola razón de que si el dispositivo de usuario no tiene un servicio de Google Play instalado en el teléfono del usuario, entonces no funciona.

Estamos buscando más razones para resolver este problema.

Una de las razones más comunes por las que no está disponible es que el usuario no tiene instalados los servicios de Google Play o está usando un bloqueador.

También debe tener en cuenta que el ID de GCM debe actualizarse si la versión de la aplicación ha cambiado. Debe guardar un ID de dispositivo exclusivo en SharedPreferences y comprobar siempre si es el mismo, de lo contrario debe iniciar el proceso de registro de nuevo.

También es una buena idea actualizar el ID de vez en cuando.

Los miembros de nuestro equipo están tratando de enviar la notificación, si falla, esperan unos 60 milisegundos o segundos (no estoy seguro) para que esta notificación push se envíe de nuevo, si todavía no funciona, esperan dos veces el tiempo, y así …

Y tienes que evaluar la respuesta de google, hay una cadena de error en:

std::string error = response["results"][0]["error"].asString();

Que le da la información si una cuenta de usuario se ha movido a, si es así que puede utilizar:

Json::Value newRegistrationId = response["results"][0]["registration_id"];

Para obtener el nuevo ID.

Si gcm id es nulo intenta iniciar una tarea en segundo plano y obtener el id.check el código a continuación

  private void registerInBackground() { new AsyncTask() { @Override protected String doInBackground(Object[] params) { String msg = ""; try { if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(context); } regid = gcm.register(SENDER_ID); msg = "Device registered, registration ID=" + regid; sendRegistrationIdToBackend(); // Persist the regID - no need to register again. storeRegistrationId(context, regid); } catch (IOException ex) { msg = "Error :" + ex.getMessage(); } return msg; } @Override protected void onPostExecute(Object msg) { // mDisplay.append(msg + "\n"); } }.execute(null, null, null); } 
 Check if app was updated; if so, it must clear the registration ID since the existing registration ID is not guaranteed to work with the new app version. 

Cuando la versión de la aplicación cambia, el ID de registro también debe cambiar. Por lo que debe guardar el último identificador de registro en el tamaño del backend. Tal vez su problema es esto.

Si su pregunta se centran en el registro de la identificación puede ignorar mi respuesta .. Lo siento mi respuesta puede ser la respuesta equivocada a su pregunta.

Sólo quiero mostrar que puede haber algún otro factor influir en la entrega de mensajes.

  1. ¿Envía todo el mensaje sólo a destinatarios individuales?

    Una de las características más útiles de GCM es la compatibilidad con hasta 1.000 destinatarios para un único mensaje. http://developer.android.com/training/cloudsync/gcm.html#

    A veces nuestro PHP también pierde el envío de mensajes al dispositivo registrado …

  2. El mensaje debe tener menos de 4K (¿su GCM contiene imágenes?)

  3. Es posible que ya hayas leído esto.

    Implementación del cliente GCM en Android

    http://developer.android.com/google/gcm/client.html

¿Es ese pedazo de código dentro de un asyncTask si no que podría ser su error en la versión determinada (no recuerdo cuál) gcm registro da NetworkOnMainThreadException por alguna razón, se actualizaron que más tarde, pero tuve el mismo problema hace algún tiempo, esta es la pieza de Código que he utilizado la esperanza que te ayuda a cabo:

 private void performRegisterGCM(){ //Check for GCM availability if(checkPlayServices(this)){ // If this check succeeds, proceed with normal processing. // Otherwise, prompt user to get valid Play Services APK. gcm = GoogleCloudMessaging.getInstance(this); String regId = mPreferences.getGcmRegistrationId(); if (regId.isEmpty()){ RegisterGCM(); }else{ log.d("regId: "+regId); } } else { // Status is a random integer GooglePlayServicesUtil.getErrorDialog(status, this, RQS_GooglePlayServices).show(); } } public static boolean checkPlayServices(Activity mActivity){ int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(mActivity); return resultCode == ConnectionResult.SUCCESS } private void RegisterGCM(){ new AsyncTask<Void,Void,String>() { @Override protected String doInBackground(Void... params) { String regid = ""; try{ if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(mContext); } regid = gcm.register(Util.SENDER_ID); }catch(Exception e){ log.e(e.getMessage()); } return regid; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); mPreferences.setGcmRegistrationId(s); //TODO send regid to server with all the other info sendGCMIDtoBackend(s); } }.execute(null, null, null); } 

Tenga en cuenta que el checkPlayServices también me dio un montón de problemas que tenía como este:

 public static boolean checkPlayServices(Activity mActivity){ int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(mActivity); if(resultCode!= ConnectionResult.SUCCESS) { if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)){ GooglePlayServicesUtil.getErrorDialog( resultCode, mActivity, PLAY_SERVICES_RESOLUTION_REQUEST ).show(); } else{ log.d("DEVICE NOT SUPPORTED"); exit(true); } return false; } return true; } 

Entonces lo cambió como se puede ver en el primer pedazo de código, porque por alguna razón cuando cae en isUserRecoverableError (resultado) que da un montón de dolores de cabeza … Todo aquí es de un proyecto de trabajo real y los fragmentos de código se obtuvieron en http://developer.android.com/google/gcm/client.html y modificado para que funcione correctamente. Espero que esto te ayude, buena suerte …

¿Qué tal el backend? Si elimina el ID de la base de datos del servidor, el usuario nunca recibirá una notificación a menos que actualice la versión de la aplicación.

  • Cómo enviar notificaciones push de Android a través de GCM en C # .Net
  • Google-services.json en el árbol del proyecto
  • GCM ¿Cómo puedo detectar si la aplicación está abierta y, de ser así, aparece un cuadro de alerta en lugar del flujo normal de notificaciones?
  • Parse push notificación token del dispositivo android no guardado en algunos casos
  • El envío de un mensaje GCM (del lado del servidor) falla a menudo - pero lejos de ser siempre
  • ¿El servicio GCM es confiable para notificaciones push a gran escala?
  • Respuesta de Google Cloud Messaging Server lenta (1 minuto)
  • ¿Cómo funciona el servicio de mensajería de Google Cloud en Android?
  • GCM: Cómo enviar latido al servidor GCM
  • GcmListenerService no se llama Cuando la aplicación está en segundo plano
  • ¿Qué servicios basados ​​en la nube puedo usar para alojar el servidor XMPP requerido para conectarse a GCS CCS?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.