webentwicklung-frage-antwort-db.com.de

Push-Benachrichtigung funktioniert nicht ordnungsgemäß, wenn die App im Hintergrund ausgeführt wird oder nicht ausgeführt wird

Ich verwende Firebase Cloud Messaging, um Push-Benachrichtigungen zu senden.

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

Was im AndroidManifest deklariert ist:

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

Das Problem ist also, dass, wenn die App ausgeführt wird, ticker gut angezeigt wird und die Benachrichtigung mit dem Standardton erfolgt. Wenn die App jedoch im Hintergrund ausgeführt wird oder nicht, erfolgt die Benachrichtigung ohne Ton und ticker wird nicht angezeigt in der Statusleiste.
Warum passiert das und wie kann ich das beheben?

30
Ololoking

Mit FCM geben Sie eine POST an https://fcm.googleapis.com/fcm/send Zu sendende Nutzlast an. In dieser Nutzlast können Sie einen data oder einen notification Schlüssel angeben, oder beide.

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

Wenn Ihre Payload einen notification -Schlüssel enthält, verarbeitet Ihre App Push-Nachrichten selbst nur , wenn Ihre App aktiv ist/im Vordergrund steht. Ist dies nicht der Fall (also im Hintergrund oder vollständig geschlossen), zeigt FCM die Benachrichtigung anhand der Werte an, die Sie in die Schlüsselnutzdaten von notification eingegeben haben.

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

Sieht so aus, als ob Sie die FCM-Nachrichten selbst bearbeiten möchten, damit Sie die Benachrichtigung ein bisschen weiter anpassen können. Daher ist es besser, den notification -Schlüssel nicht in POST Nutzlast, damit alle Push-Nachrichten an Ihr onMessageReceived gesendet werden.

Hier können Sie mehr darüber lesen:
Erweiterte Nachrichtenoptionen
Downstream-Nachrichtensyntax

67
Tim Castelijns

Ich habe 2 Wochen gebraucht, um zu verstehen, warum meine Anwendung keine Datennachricht mehr empfangen kann, wenn sie sich im Hintergrund befindet und so seltsam es auch sein mag. Ich bin zu dem Schluss gekommen, dass Android-Studio 2.1.2 das Problem ist!

Ich kann im Hintergrund keine FCM-Nachricht mehr empfangen

https://github.com/firebase/quickstart-Android/issues/89

2
fralbo