2016-05-29 25 views

risposta

4

Non sei sicuro del motivo per cui questo accade a te (codice snippet forse?), Ma c'è una soluzione definitiva per il peso massimo: definisci il tuo c2dm ricevitore nel manifest e imposta la priorità alta (> 0) quindi interrompi la notifica dall'elaborazione .

messaggi GCM vengono elaborate come le trasmissioni ordinate, in modo da poter fermare la catena di elaborazione chiamando questo metodo:

https://developer.android.com/reference/android/content/BroadcastReceiver.html#abortBroadcast()

Se non fai nulla nel vostro ricevitore poi il ricevitore prossimo farà il elaborazione, che sarà il ricevitore Firebase.

Nota: sebbene sia possibile farlo con sicurezza, si presuppone che nient'altro venga inviato come notifica push da Firebase. Potrebbe essere vero ora (anche se non ne sono del tutto sicuro), ma potrebbe cambiare in futuro. Quindi, tieni questo a mente e prova la soluzione ampiamente.

+1

In realtà, docs Firebase consiglia di utilizzare i dati spingere invece di notifiche, se si vuole avere il controllo completo su come viene gestita: https://firebase.google.com/docs/cloud-messaging/concept-options #notifications_and_data_messages - quote: "Utilizza le notifiche quando vuoi che l'FCM gestisca la visualizzazione di una notifica per conto della tua app client. Utilizza i messaggi di dati quando vuoi che la tua app gestisca la visualizzazione o elabori i messaggi sulla tua app client Android ..." – racs

+0

Grazie tu. Usando il push dei dati (attraverso una richiesta POST) sono in grado di gestire la notifica anche se l'app è in background. Ora, come posso inviare dati a tutti i dispositivi senza specificare il token di ogni singolo dispositivo nel mio file JSON? Tramite la console di Firebase è possibile specificare "User Segment", ma se non si specifica l'elemento "a" nel file JSON, ricevo l'errore 400. – martinodecarlo

+0

Non sono un esperto in questo argomento, ma per quanto riguarda Posso dire quando fai il push dei dati quindi in pratica salti le caratteristiche di Firebase tutte insieme. Quindi non è disponibile alcuna trasmissione agli utenti di argomenti o analisi. In questo caso, FB funge da relay per GCM e non interagisce con i dati inviati. – racs

1

È possibile gestire tutti gli eventi push da tutti i servizi di differenza (con Firebase). In primo luogo creare YouUniversalFCM extends WakefulBroadcastReceiver

Ad esempio:

public class YourUniversalFCM extends WakefulBroadcastReceiver { 

    private static final String ACTION_REGISTRATION 
     = "com.google.android.c2dm.intent.REGISTRATION"; 
    private static final String ACTION_RECEIVE 
     = "com.google.android.c2dm.intent.RECEIVE"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     for (String key : intent.getExtras().keySet()) { 
      Log.d(
        "TAG", 
        "{UniversalFCM}->onReceive: key->" 
          + key + ", value->" + intent.getExtras().get(key) 
      ); 
     } 
     switch (action) { 
      case ACTION_REGISTRATION: 
       // TODO: 2016-08-06 
       break; 

      case ACTION_RECEIVE: 
       // TODO: 2016-08-06 
       break; 

      default: 
     } 

     abortBroadcast(); 
    } 
} 

Avanti nella AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.WAKE_LOCK"/> 

<application 
    ...> 

    ... 

    <receiver 
     android:name=".fcm.receivers.UniversalFCM" 
     android:permission="com.google.android.c2dm.permission.SEND"> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE"/> 
      <action android:name="com.google.android.c2dm.intent.REGISTRATION"/> 
      <category android:name="YOUR_PACKAGE"/> 
     </intent-filter> 
    </receiver> 

</application> 

Sostituire YOUR_PACKAGE dal pacchetto della vostra applicazione. È tutto. Se si desidera iscriversi per un altro servizio push, è necessario aggiungere YourTokenService

public class YourTokenService extends FirebaseInstanceIdService { 
    @Override 
    public void onTokenRefresh() { 
     String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
     L.d(TokenService.class, "onTokenRefresh() Refreshed token: " + refreshedToken); 
     // TODO: 2016-08-06 
     super.onTokenRefresh(); 
    } 
} 

e dichiarato in AndroidManifest.xml

<service android:name="YourTokenService"> 
    <intent-filter> 
     <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> 
    </intent-filter> 
</service> 
+0

WakefulBroadcastReceiver è ora obsoleto. Si prega di evitare questo metodo e fare riferimento alla risposta di Alvin Rusli –

1

mi capita di incontrare la stessa domanda. Io uso l'API subscribeToTopic per sottoscrivere la notifica.

FirebaseMessaging.getInstance().subscribeToTopic("APP"); 

e trovo l'altra API unsubscribeFromTopic annullare l'abbonamento.

FirebaseMessaging.getInstance().unsubscribeFromTopic("APP"); 

Forse sarebbe utile per applicazione utilizzando la notifica argomento. Non riceverebbe notifiche in primo piano e in background.

4

Non ho ancora potuto commentare, ma racs' comment mi ha aiutato molto.

In realtà, docs Firebase consiglia di utilizzare i dati spingere invece di notifiche, se si vuole avere il controllo completo su come viene gestita : firebase.google.com/docs/cloud-messaging/... - citazione: " utilizzare notifiche quando si vuole FCM per gestire la visualizzazione di una notifica a nome vostro client dell'applicazione. utilizzare i messaggi di dati quando si desidera la vostra applicazione per gestire il display o elaborare i messaggi sul vostro Android client app ..."

Quindi, in sostanza, ho cambiato il corpo per la richiesta di notifica push da:

{ 
    "data": { 
     "type" : "mytype" 
    }, 
    "notification": { 
     "title": "My Title", 
     "body": "My Notification Message" 
    }, 
    "to": "/topics/all" 
} 

A:

{ 
    "data": { 
     "type" : "mytype", 
     "title": "My Title", 
     "body": "My Notification Message" 
    }, 
    "to": "/topics/all" 
} 

Ora la mia app chiama onMessageReceived() ogni volta anche in background, e ho appena cambiato i metodi di usare il titolo di notifica ottenuto e il messaggio in spingere i dati.

3

ho avuto questa problem.and risolto mediante l'uso di codice di seguito:

Abilita Firebase Notifiche:

FirebaseInstanceId.getInstance().getToken(); 

Disattiva Firebase Notifiche: deleteInstanceId() è una chiamata di blocco. Non può essere chiamato sul thread principale.

FirebaseInstanceId.getInstance().deleteInstanceId(); 
+0

dove mothod è impostato 'FirebaseInstanceId.getInstance(). DeleteInstanceId();'? –

+0

Io uso AsyncTask e metto 'FirebaseInstanceId.getInstance(). DeleteInstanceId();' in 'doInBackground' – Better

Problemi correlati