web-dev-qa-db-de.com

Fehler bei ungültiger Registrierung in Firebase Cloud Messaging für Android

Ich entwickle eine Android-App, die die Push-Benachrichtigungsfunktion verwendet. Ich muss vom Server schieben. Ich benutze dafür Firebase. Ehrlich gesagt, dies ist meine erste Verwendung von Firebase. Ich bin Neuling bei Firebase. Wenn ich jedoch mit PHP und CURL vom Server aus pusche, gibt es einen ungültigen Registrierungsfehler.

Ich bekomme den Firebase-Token in Android so

String token = FirebaseInstanceId.getInstance().getToken();

Dann speichere ich das Token an den Server und speicherte es in der Datenbank.

Am Server schiebe ich so vor

class Pusher extends REST_Controller {

    function __construct()
    {
        parent::__construct();
    }

    public function notification_get()
    {
        $rows = $this->db->get('device_registration')->result();
        $tokens= array();
        if(count($rows)>0)
        {
            foreach($rows as $row)
            {
                $tokens[] = $row->token;
            }
        }
        $message = array("message"=>"FCM Push NOTIFICATION TESTING");
        if(count($tokens)>0)
        {
            $result = $this->send_notification($tokens,$message);
            if(!$result)
            {
                die("Unable to send");
            }
            else{
                $this->response($result, REST_Controller::HTTP_OK);
            }
        }

    }

    function send_notification($tokens,$message)
    {
        $url = 'https://fcm.googleapis.com/fcm/send';
        $fields = array(
                'registration_ids'=>$tokens,
                'data'=>$message
            );

        $headers = array(
                'Authorization:key = AIzaSyApyfgXsNQ3dFTGWR6ns_9pttr694VDe5M',//Server key from firebase
                'Content-Type: application/json'
            );
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
        $result = curl_exec($ch);
        if($result==FALSE)
        {
            return FALSE;
        }
        curl_close($ch);
        return $result;
    }
}

Ich verwende CodeIgniter 3-Framework zum Erstellen der Rest-API. Wenn ich per Push auf die URL vom Browser aus zugreife, werden JSON-Daten mit Fehlern wie in der Abbildung unten angezeigt.

 enter image description here

Wie Sie sehen, wird ein InvalidRegistration-Fehler ausgegeben und die Nachricht wird nicht an Geräte weitergeleitet. Was stimmt nicht mit meinem Code?

Zusätzlich

Dies ist meine FirebaseMessagingService-Klasse, die Benachrichtigungen in Android anzeigt

public class FirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        showNotification(remoteMessage.getData().get("message"));
    }

    private void showNotification(String message)
    {
        Intent i = new Intent(this,MainActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setAutoCancel(true)
                .setContentTitle("FCM Test")
                .setContentText(message)
                .setSmallIcon(R.drawable.info)
                .setContentIntent(pendingIntent);

        NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        manager.notify(0,builder.build());
    }
}
5
Wai Yan Hein

Ungültige Registrierungs-ID Überprüfen Sie die Formatierung der Registrierungs-ID dass Sie an den Server übergeben. Stellen Sie sicher, dass es mit der Registrierungs-ID übereinstimmt Das Telefon empfängt in com.google.firebase.INSTANCE_ID_EVENT Absicht und dass Sie es nicht abschneiden oder zusätzliche .__ hinzufügen. Zeichen. Wird ausgelöst, wenn der Fehlercode InvalidRegistration lautet.

Überprüfen Sie sowohl auf der Seiten-App-Seite als auch auf Ihrer Seite, ob auf dem Server genau dieselbe Registrierungs-ID gespeichert ist, in der Application on Mobile diese auf der onTokenRefresh-Methode erhält. Sie sollten genau das gleiche Registrierungs-Token erhalten haben, das der Entwickler in FirebaseInstanceId.getInstance().getToken() bekam.

Als ich Ihren Kommentar erhielt und Sie den Code aktualisiert haben, gibt es einige Änderungen in Ihrem Code. Er stammt von Google Doc. 

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    // TODO(developer): Handle FCM messages here.
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());
    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

Firebase hat drei Nachrichtentypen:

Benachrichtigungsnachrichten : Die Benachrichtigungsnachricht funktioniert im Hintergrund oder Vordergrund. Wenn sich die App im Hintergrund befindet, werden Benachrichtigungsnachrichten mit .__ angezeigt. wird in die Taskleiste geliefert. Wenn sich die App im Vordergrund befindet, Nachrichten werden von onMessageReceived () oder .__ verarbeitet. Rückrufe von didReceiveRemoteNotification. Dies ist im Wesentlichen das, was .__ ist. als Anzeigenachrichten bezeichnet.

Datennachrichten : Auf Android-Plattformen können Datennachrichten auf .__ arbeiten. Hintergrund und Vordergrund. Die Datennachricht wird von .__ verarbeitet. onMessageReceived (). Eine plattformspezifische Anmerkung wäre hier: On In Android kann die Datennutzlast in der für .__ verwendeten Absicht abgerufen werden. Starten Sie Ihre Aktivität. 

Nachrichten mit Benachrichtigungs- und Datennutzlasten : Wenn in der Hintergrund erhalten Apps die Benachrichtigungs-Nutzdaten in der Benachrichtigung und behandeln die Datennutzdaten nur, wenn der Benutzer auf die .__ tippt. Benachrichtigung. Im Vordergrund erhält Ihre App eine Nachricht Objekt mit beiden verfügbaren Nutzlasten. Zweitens die click_action Der Parameter wird häufig in Benachrichtigungsnutzdaten und nicht in Daten verwendet Nutzlast. Bei Verwendung innerhalb der Daten-Payload wird dieser Parameter behandelt als benutzerdefiniertes Schlüssel-Wert-Paar und daher müssen Sie .__ implementieren. benutzerdefinierte Logik, damit es wie beabsichtigt funktioniert.

2
Arpit Patel

Obwohl ich keinen Codeigniter verwende und beim Senden an ein InvalidRegistration-Gerät auf den Fehler iOS gestoßen ist, dachte ich, ich würde mitteilen, wie ich die Situation hier gelöst habe.

Ich musste registration_ids in to in PHP ändern, wenn ich einen Notification message an ein single - Gerätetoken schickte, und sicherstellen, dass der Wert von to eine Zeichenfolge und ist kein Array.

Ändere das:

'registration_ids'=>$tokens,

Zu diesem:

'to'=>$tokens[0],
1