20

Ich verwende Firebase Cloud Messaging zum Senden von Push-Benachrichtigungen. HierPush-Benachrichtigung funktioniert nicht korrekt, wenn App im Hintergrund oder nicht ausgeführt wird

ist mein FirebaseMessageService:

public class FireBaseMessageService extends FirebaseMessagingService { 


@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    Log.e("TAG", "From: " + remoteMessage.getFrom()); 
    Log.e("TAG", "Notification Message Body: " + remoteMessage.getData().get("CardName")+" : "+remoteMessage.getData().get("CardCode")); 
    sendNotification(remoteMessage.getNotification().getBody()); 
} 


private void sendNotification(String messageBody) { 
    Intent intent = new Intent(this, StartActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, 
      PendingIntent.FLAG_ONE_SHOT); 

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.mipmap.ic_launcher_final) 
      .setContentTitle("Notification") 
      .setContentText(messageBody) 
      .setTicker("Test") 
      .setAutoCancel(true) 
      .setDefaults(Notification.DEFAULT_SOUND) 
      .setContentIntent(pendingIntent); 

    NotificationManager notificationManager = 
      (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

     notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); 
    } 
} 

Und FirebaseInstanceServer:

public class FirebaseInstanceService extends FirebaseInstanceIdService { 


@Override 
public void onTokenRefresh() { 
    // Get updated InstanceID token. 
    String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
    Log.e("TAG", "Refreshed token: " + refreshedToken); 

    // TODO: Implement this method to send any registration to your app's servers. 
    sendRegistrationToServer(refreshedToken); 

} 

private void sendRegistrationToServer(String token) { 


     // Add custom implementation, as needed. 
     Log.e("TAG", "Refreshed token2: " + token); 
    } 
} 

, die in der AndroidManifest erklärt:

<service 
    android:name=".util.notifications.FireBaseMessageService"> 
    <intent-filter> 
     <action android:name="com.google.firebase.MESSAGING_EVENT"/> 
    </intent-filter> 
</service> 

<service 
    android:name=".util.notifications.FirebaseInstanceService"> 
    <intent-filter> 
     <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> 
    </intent-filter> 
</service> 

So Problem, das ist, wenn App ticker ausgeführt wird, Gut angezeigt und Benachrichtigung com e mit Standardton, aber wenn App im Vordergrund ist oder nicht läuft, wird die Benachrichtigung ohne Ton ausgegeben und ticker wird nicht in der Statusleiste angezeigt.
Warum passiert das und wie kann ich es beheben?

Antwort

47

Mit FCM geben Sie eine POST-Payload an, die an https://fcm.googleapis.com/fcm/send gesendet werden soll. In dieser Nutzlast können Sie einen data oder einen notification Schlüssel oder beides angeben.

Wenn Ihre Nutzdaten nur einen Schlüssel data enthält, verarbeitet Ihre App alle Push-Nachrichten selbst. Z.B. Sie werden alle an Ihren Handler onMessageReceived geliefert.

Wenn Ihre Nutzdaten einen Schlüssel notification enthält, wird Ihre App Push-Nachrichten selbst behandeln nur, wenn Ihre App aktiv ist/im Vordergrund. Wenn dies nicht der Fall ist (also im Hintergrund oder vollständig geschlossen ist), verarbeitet FCM die Benachrichtigung für Sie, indem die Werte verwendet werden, die Sie in die Schlüsselnutzlast notification eingegeben haben.

Beachten Sie, dass Benachrichtigungen von einer Konsole (wie Firebase-Konsole) gesendet werden, sie enthalten immer einen notification Schlüssel.

Sieht so aus, als ob Sie die FCM-Nachrichten selbst bearbeiten möchten, damit Sie die Benachrichtigung ein wenig mehr anpassen können. Daher wäre es besser, den Schlüssel notification nicht in die POST-Nutzdaten aufzunehmen onMessageReceived.

Sie können mehr darüber lesen Sie hier:
Advanced messaging options
Downstream message syntax

+1

Dank, Sie haben recht, wenn ich entfernen 'notification' Schlüssel beginne ich recieve Benachrichtigungen richtig – Ololoking

+0

Tim ist richtig, ich würde nur gerne hinzufügen, dass Nachrichten von der Firebase Konsole gesendet Es handelt sich um Benachrichtigungsmeldungen. Wenn Sie die Firebase-Konsole verwenden, müssen Sie sie entsprechend behandeln. –

+0

danke, es hilft mir sehr. –