German Wechsel von GCM auf FCM

Andie

Member
Licensed User
Longtime User
Hallo,
nach einem Jahr Pause in Sachen B4A will ich mich nun wieder mit B4A beschäftigen und habe gesehen, dass es jetzt den FirebaseCloudMessaging-Service gibt. Da ich das mit GCM vor Jahren hinbekommen hatte (ich kann mich noch an die Verwirrung mit Api-Key und Browser-Key erinnern), dachte ich mir, FCM zu implementieren kann nicht so schwer sein, auch aufgrund von Erels Tutorial. Ich habe also Android Support Repository und Google Repository mit dem SDK Manager installiert, die Manifest-Datei um die beiden Snipptes "Always required when using Firebase" und "Manifest snippet for Notifications/FCM" erweitert, das Service-Modul "Firebase Messaging" angelegt und den Starter Service um CallSubDelayed() erweitert. Außerdem ein Firebase-Projekt angelegt und die entsprechende json-Datei heruntergeladen.

Da tauchen zwei Probleme auf: Erst mal wird im FirebaseMessaging-Modul der Typ FirebaseMessaging nicht erkannt, also die Variablendeklaration - Private fm As FirebaseMessaging - klappt nicht. Und dann: Es gibt keine Funktion wie RegisterDevice, die es unter GCM im Service-Modul PushService noch gab. Aber eine Registrierung ist doch notwendig, um hinterher Pushnachrichten zu erhalten. Für ein paar Infos wäre ich echt dankbar!!

Noch einen schönen Heiligabend-Vorabend!
Andie
 

An Schi

Well-Known Member
Licensed User
Zu 1: hast du auch die library heruntergeladen und aktiviert?
Zu 2: erels Beispiel zeigt, wie man an ein Thema/Topic sendet, für das sich der Empfänger registriert (subscribetotopic). Der Sender sendet dann an dieses topic.
Du kannst auch an einzelne Handys via token senden, siehe hierfür vor allem @KMatle posts. Für den Anfang würde ich aber beim topic bleiben.

Generellist zu empfehlen, nicht via firebase Homepage, sondern http request und einem kleinen b4j Programm zu senden.
 

Andie

Member
Licensed User
Longtime User
Danke An Schi für den Tipp mit der Library. Dieses Problem ist gelöst. :)

Ich will ja gar nicht via firebase homepage senden, sondern über ein php-Script (bei GCM habe ich das mit der Download2()-Methode der HttpUtils2-Lib gemacht). Aber dazu braucht man ja das Registrierungs-Token der Devices, die sich dazu allerdings vorher registriert haben müssen. Und da vermisse ich eine Funktion wie RegisterDevice(), wie es sie beim PushService-Modul gab. Oder mache ich gedanklich einen Fehler?
 

DonManfred

Expert
Licensed User
Longtime User
Aber dazu braucht man ja das Registrierungs-Token der Devices
Das musst du Dir irgendwie nach der Registrierung merken bzw. an deinen Server übermitteln (token + device id ) um dann später gezielt einzelne Geräte ansprechen zu können.

RegisterDevice oder so gibt es nicht explizit.

Deine App macht für den aktuellen Anwender eine registrierung durch das verwenden der FCM

Jedes Device bekommt also eine ID zugewiesen. Diese brauchst Du.
 

An Schi

Well-Known Member
Licensed User
Nur damit das nicht untergeht: du kannst auch via php an topics senden.
Du musst also erstmal wissen, ob du an breitere Massen (eher mit topic) oder einzelne Geräte (token) senden willst.
 

Andie

Member
Licensed User
Longtime User
Hi DonManfred, herzlichen Dank für Deine Antwort. Aber ich habe da echt noch Verständnisprobleme - leider. :(
Jedes Device bekommt also eine ID zugewiesen. Diese brauchst Du.
Meinst Du die Reg-ID oder die Device-ID?

Das musst du Dir irgendwie nach der Registrierung merken bzw. an deinen Server übermitteln (token + device id ) um dann später gezielt einzelne Geräte ansprechen zu können
Ich nehme an, token ist die Registrierungs-ID.

Also, ich schreibe eine App mit dieser FCM-Funktionalität und verteile sie an mehrere User. Wenn diese User meine App verwenden, erfolgt für jeden einzelnen User die Zuweisung einer Reg-ID (token). Aber wenn ich jetzt an einen bestimmten User eine Push-Nachricht schreiben möchte, brauche ich doch seine Reg-ID. Allein die Tatsache, dass jedem Device eine Reg-ID zugewiesen wird, bedeutet ja nicht, dass ich sie kenne und nutzen kann.

Oder ist es vielleicht so: Durch Verwendung der App wird automatisch eine Registrierungs-ID durch Firebase erzeugt und zusammen mit der Device-ID irgendwie gespeichert. Dann bin ich in der Lage, über die Device-ID, die ich ja innerhalb der App auslesen kann und beim ersten Verwenden der App in einer Datenbank auf meinem Webspace speichern kann, dem User eine Push-Nachricht zu schreiben. Ist das der Weg?
 

Andie

Member
Licensed User
Longtime User
DonManfred, jetzt kam noch eine zweite Antwort von Dir, während ich auf deine erste Antwort geschrieben habe. Ich möchte beides, also zum einen via Topics an alle User eine Nachricht senden, als auch zum anderen gezielt an einzelen User eine Nachricht schicken. Hast Du entsprechende php-Dateien? Das wäre mega hilfreich für mich und - ja, wie soll ich sagen - wie ein Weihnachtsgeschenk!
 

DonManfred

Expert
Licensed User
Longtime User
Also, ich schreibe eine App mit dieser FCM-Funktionalität und verteile sie an mehrere User.
Korrekt
Wenn diese User meine App verwenden, erfolgt für jeden einzelnen User die Zuweisung einer Reg-ID (token).
Korrekt.

HIER musst du nun - in deiner App - eingreifen und dieses Token an deinen Server schicken.
Zusammen mit einer ID, die dieses Device kennzeichnet.

Beides schickst Du also zu deinem Server wo dein Server-Script Dir die Tokens alle in einer Datenbank sammelt.

Hast Du entsprechende php-Dateien?
Nicht wirklich. Ich kenne halt nur die Gegebenheiten...

ja, wie soll ich sagen - wie ein Weihnachtsgeschenk!
Ja, wie soll ich sagen. Das am 24.12. zu sagen ist - gelinde ausgedrückt - etwas spät, oder?

Das ist ein Problem, mit dem Du fertig werden musst. ;-)
 
Last edited:

An Schi

Well-Known Member
Licensed User
Bin mir ziemlich sicher, dass hier im forum ein php gibt (wahrscheinlich von kmatle).
Erweiter mal deine Suche auf den englischen Bereich ;)
 

An Schi

Well-Known Member
Licensed User
Obwohl ich schon merke, dass du dich auf php und tokens versteift hast, würde ich dir folgendes empfehlen:

1) Mach ne neue cleane App zum Testen.
2) Befolge Erels Beispiel und mach ein B4J Programm, mit dem du Zeug an ein Topic deiner neuen App schicken kannst.
(wenn das funtkioniert und du das Prinzip verstanden hast, bist du schonmal sehr viel weiter)
3) Darauf aufbauend dann ein php script, welches Zeug an ein topic sendet
4) Darauf aufbauend dann die Sache, wo sich die Geräte einzeln mit tokens bei dir registrieren
5) Und wenn das läuft, dann nutze zum verschicken mit php nicht mehr topics sondern die registrierten tokens.

Ebenso frohe Weihnachten! :)
 

Andie

Member
Licensed User
Longtime User
Da hast Du Recht: Ich wollte sozusagen alles sofort haben. ;) Ich werde jetzt, genauso wie Du es geschrieben hast, schrittweise vorgehen. Nochmal Danke! :)
 

KMatle

Expert
Licensed User
Longtime User
Here you go:

B4X:
function notify ($devt, $myid, $mess)
    {
    print 'In';
    // API access key from Google API's Console
        if (!defined('API_ACCESS_KEY')) define( 'API_ACCESS_KEY', 'AAAAMxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' );
        $tokenarray = array($devt);
        $data = array
        (
            'fromid' => $myid,
            'mess' => $mess
        );
        // prep the bundle
        $msg = array
        (
            'message'     => $mess   
        );
        $fields = array
        (
            'to'     => $devt,
            'data'    => $data
        );
        
        $headers = array
        (
            'Authorization: key=' . API_ACCESS_KEY,
            'Content-Type: application/json'
        );
        
        $ch = curl_init();
        curl_setopt( $ch,CURLOPT_URL, 'fcm.googleapis.com/fcm/send' );
        curl_setopt( $ch,CURLOPT_POST, true );
        curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
        curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
        curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
        $result = curl_exec($ch );
        curl_close( $ch );
       
        return $result;
    }

Sendet an eine Data Nachricht an ein Token (= im Prinzip Device). Wenn Du an Topics senden willst, einfach die Zeile

B4X:
'to'     => $devt

in

B4X:
'to'    => '/topics/{' . $topic . '}'

ändern (hab ich noch nicht probiert, sollte aber gehen)

Wie Manfred schon geschrieben hat, muss man sich selbst eine Zuordnung bauen (Datenbank) User zu Token (im Sinne "ich brauche etwas Sprechendes, wie eine Mailadresse oder einen eindeutigen Namen und nicht einen abstraktes Token, das sich auch ändern kann").

Unbenannt.JPG


Hier meine Zuordnungstabelle. Jedes device regisitriert sich bei FCM und sendet dann per OkHttpUtils das aktuelle Token an mein php script. Der Eintrag wird dann neu angelegt oder aktualisiert.
 

Andie

Member
Licensed User
Longtime User
Hallo KMatle, wow, da habe ich doch noch ein Weihnachtsgeschenk bekommen. Super! Herzlichen Dank für Deinen Code und Deine Erklärungen! :) Da werde ich mich doch gleich mal dransetzen ...
 
Top