2015-04-19 8 views
13

Ciao stiamo lavorando su un'applicazione Android in cui GCM gioca un ruolo molto importante nella quale finalità di marketing, spingere alcune informazioni importanti per gli utenti, eccQuali sono le ragioni ID GCM non è disponibile in alcuni casi in Android

Funziona bene nel 60-70% dei casi, ma altri 30-40% non funziona. Quindi il resto degli utenti non riceve mai alcuna notifica utile solo a loro.

Questo è il motivo per cui perdiamo utenti ogni giorno. Di seguito è riportato il mio codice per ottenere l'ID di registrazione di 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++; 
    } 
} 

Cerchiamo quali sono i motivi per cui GCM id non è disponibile per alcuni utenti.

Sappiamo solo una ragione per cui se il dispositivo dell'utente non dispone di un Google Play Services installato sul telefono dell'utente, allora non funziona.

Stiamo cercando altri motivi per risolvere questo problema.

+0

Ciao Williams, stai lavorando a Telegram il messaggero? –

+1

Gli ID GCM dell'utente possono cambiare, se cambiano devi recuperare! –

+0

Sì, abbiamo aggiornato GCM se di tutti gli utenti. Intendo dire che quando provo a chiamare il metodo di registrazione, a volte potrebbe non riuscire a ottenere l'ID. Voglio sapere perché lo è così –

risposta

1

I membri del nostro team stanno tentando di inviare la notifica, se non riesce, attendono circa 60 millisecondi o secondi (non sono sicuro) perché questa notifica push venga inviata di nuovo, se ancora non funziona, aspettano il doppio del tempo, e così via ...

e si deve valutare la risposta da parte di Google, c'è una stringa di errore sotto:

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

che vi dà le informazioni se un conto di utenti ha stato spostato su, in tal caso è possibile utilizzare:

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

per ottenere il nuovo ID.

1

se GCM id è provare nulla per avviare un'attività in background e ottenere l'id.check il codice qui sotto

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); 
    } 
2

Una delle ragioni più comuni per cui non è disponibile è che l'utente non dispone di google riprodurre i servizi installati o utilizza un blocco.

Si dovrebbe anche notare che l'ID GCM dovrebbe essere aggiornato se la versione dell'applicazione è cambiata. Dovresti salvare un ID dispositivo univoco su SharedPreferences e controllare sempre se è uguale, altrimenti dovresti iniziare di nuovo il processo di registrazione.

È anche una buona idea aggiornare l'ID di volta in volta.

1
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. 

Quando la versione dell'applicazione cambia, anche l'ID di registrazione dovrebbe cambiare. quindi dovresti salvare l'ultimo ID di registrazione sulla dimensione del back-end. Forse il tuo problema è questo.

1

Se la tua domanda si concentra sulla registrazione dell'ID, puoi ignorare la mia risposta .. Spiacente, la mia risposta potrebbe essere la risposta sbagliata alla tua domanda.

Voglio solo mostrare che potrebbe esserci qualche altro fattore di influenza sulla consegna del messaggio ..

  1. Inviate tutto il messaggio solo a singoli destinatari?

    Una delle funzionalità più utili in GCM è il supporto per un massimo di 1.000 destinatari per un singolo messaggio. http://developer.android.com/training/cloudsync/gcm.html#

    A volte il nostro PHP perdere anche l'invio di messaggi al dispositivo registrato ...

  2. Il messaggio deve meno di 4K (fare il vostro GCM contiene immagini?)

  3. si può avere già leggere questo ..

    Implementazione client GCM su Android

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

+1

Penso che tu abbia una buona risposta, ma il suo problema è che non può ottenere l'ID utente e il suo server non conosce gli ID di tutti i suoi utenti. Se gli utenti non possono inviare al server i propri ID, non importa se il server invia cattive notifiche. – eloibm

1

E 'questo pezzo di codice all'interno di un'AsyncTask, se non che potrebbe essere il vostro errore in alcune versioni (non ricordo quale) registrazione GCM dà NetworkOnMainThreadException per qualche motivo, hanno aggiornato che più tardi, ma ho avuto che lo stesso problema qualche tempo fa, questo è il pezzo di codice che ho usato spero che ti aiuta:

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); 
} 

Nota che i checkPlayServices mi ha dato anche un sacco di problemi che ho avuto in questo modo:

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; 
} 

poi cambiato come si può vedere nella prima parte del codice, perché per qualche motivo quando cade in isUserRecoverableError (risultato) si dà un sacco di mal di testa ... Tutto qui è da un progetto effettivo di lavoro e i frammenti di codice sono stati ottenuti inhttp://developer.android.com/google/gcm/client.htmle modificati per funzionare correttamente. Spero che questo ti aiuti, Buona fortuna ...

+0

Il mio codice è in esecuzione in 'AsycTask' –

+0

quindi dovrebbe essere la roba dei servizi di riproduzione provare questa riga del mio codice' GooglePlayServicesUtil.getErrorDialog (stato, questo, RQS_GooglePlayServices) .show(); ' – Eefret

1

E il backend? Se elimini l'ID dal database del server, l'utente non riceverà mai una notifica se non aggiorni la versione dell'app?