GCM implementieren

  • Antworten:67
  • Bentwortet
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.07.2014, 14:07:59 via Website

Wenn du in der developer colsole angemeldet bist, dann auf dein projekt klickst, dann steht dort oben die ProjectID:

image

Zudem wählst du einen ServerKey aus, der wird dann von der konsole selber erstellt

— geändert am 05.07.2014, 14:08:21

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

05.07.2014, 14:12:48 via Website

Übrigends benötigt man die Project Number nicht die Project ID ;)

Da muss man eine IP-Adresse angeben .. ich habe aber eine dynamische! Funktioniert das auch mit DDNS?

LG

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.07.2014, 14:21:40 via Website

Oh das meinte ich, tippfehler :)
DDns funzt glaube ich nicht, nimm zum testen erstmal 0.0.0.0/24. -> alles zulassen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

05.07.2014, 14:30:09 via Website

Funktioniert nicht ...

ERROR 401 - beim Message abschicken

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.07.2014, 14:44:37 via Website

Sorry muss so heissen:
0.0.0.0/0

Das Ding hat keine 24 Ports

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

05.07.2014, 14:51:34 via Website

Hat funktioniert :D freu mich

Ist jetzt aber nicht die schönste und sicherste variante oder?

LG

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.07.2014, 14:55:51 via Website

Nein, eigentlich brauchst du einen web server, der immer die gleiche ip hat, dann ist der Zugriff nur für diese IP.
Sonst musst du halt immer wenn deine IP sich ändert dort dirn ändern.
Macht aber keinen Sinn.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.07.2014, 15:13:10 via Website

Das mit dem /24 macht man garnicht, wenn dan: 0.0.0.0/0, aber das ist unsicher, da jeder der die ProjectNumber und die GCM id des Android Gerätes kennt, kann dann messages Versenen.
Per ip muss die Anfrage halt von der angegebenen IP kommen.
Das ergibt schon mehr sicherheit.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

05.07.2014, 15:45:34 via Website

Irgendwie bekomm ich dass nicht zum laufen mit dem BrowserKey ...

LG Jakob

Antworten
Jakob N.
  • Forum-Beiträge: 282

05.07.2014, 17:51:15 via Website

Weiß jemand wie man das mit einem BrowserKey hinbekommt? - Wär echt toll!!

Und noch etwas anderes ... wie kann man dann am besten in der App unterscheiden welchen "Typ" die Pushbenachrichtigung hat? kann man da ein eigene Felder mitschicken? zum Beispiel eine Spalte Typ wo dann der Wert 'Version' ist, wenn die Benachrichtigung dann anzeigen soll, dass eine neue Version verfügbar ist...

LG

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.07.2014, 17:52:01 via App

Dann lass den Serverkey und mache deine Gcm message in einem Bestimten textformat damit deine App auch weiss dass dei gcm message auch von dir kommt.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.07.2014, 18:02:27 via Website

Das mit dem Typ habe ich auch in meiner GCM implementation.
Ich mache dies über en GCM Message Format:

[MessageType]Message[optional Parameters]

Übergebe ich die Empfangene GCM Nachricht an einen GCM Message Parser, dieser Teilt mir die Message in den Typ (geht mit einer Enumeration), Nachricht und andere Parameter ein.
Nach dem parsen kannst du dann entsprechend auf den Typ reagieren.
PS: Wenn deine App im PlaySore ist, brauchst du keine GCM mit einer neuen Version

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

05.07.2014, 18:03:20 via Website

Findest du es besser wenn man der Pushnachricht zB nur eine Zahl mitschickt und in der App fixkodiert, was dann passieren soll wenn die Pushnachricht diese bestimmte Zahl hat?

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.07.2014, 18:06:50 via Website

Wahrscheinlich hast du meinen neueren Post noch nicht gelesen, aber so wie ich es oben geschrieben Habe ist es verständlich, nur der Parser muss halt entsprechend Programmiert sein.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

05.07.2014, 18:17:57 via Website

Habe ich das richtig verstanden dass du im PHP-File, die Message so zB festlegst:

$message = array("typ" => $typ, "message" => $message, ...);

Und dann in der GcmIntentService.java (die Klasse vom Tutorial) in der onHandleIntent(Intent intent)-Methode die Nachricht parst? Oder hast du dass wirklich fixkodiert? Verstehe ich noch nicht ganz

LG

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.07.2014, 18:31:16 via Website

Also nehmen wir mal an du hast das Feld Version..
Dan muss du nach meinem Schema eine Message schreiben die So aussieht:

[Version]Es ist eine neue Version (1.2.3) Verfügbar![Intent:de.deinPackage.deineUpdateActivity]

So jetzt haben wir eine Nachricht die den Typ Version hat.
Dann noch eine GCM Message (Text) die dem User z.b. als Notification angezeigt wir.
Als optionalen Parameter haben wir eine Klassenbezeichnug zu deiner Update Activity, die die Neue Apk aus dem Internet herunterläd.
Wenn du daraus eine Norifcation machst, dann soll beim klick darauf die Update Activiy aufgerufen werden.
Ich mache das Intent mit in die Message rein, damit ich Flexibel bin, so kann ich auch ohne den Source Code der App zu ändern eine Andere Activity über GCM und über die Notification aufrufen lassen.

So jetzt kommt die GCM Message in einem Broadcasr Reciver in deiner app an.
Jetzt musst du diese Auswerten, dafür kannst du dir eine Parser Klasse scheiben, die die die Zusammenhängende GCM Nachricht in ihre Bestandteile zerlegt (Typ,intentname oder Usernachricht)

Jetzt muss du nurnoch die Message nach den Typen Filtern, z.b wenn es eine Message vom Typ Version ist, dann erstelle eine Notification damit der user informiert ist.
So kannst du unbegrenzt viele Typen definieren und in der App dann entsprechend reagieren.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

05.07.2014, 18:36:27 via Website

Das bedeutet aber, dass du deine Message nicht im JSON Format mitschickst oder?

Und du hast ja vorher geschrieben

mache deine Gcm message in einem Bestimten textformat damit deine App auch weiss dass dei gcm message auch von dir kommt.

wir würdest du dass dann genau machen? meinst du damit, dass ich eben auch so ein

[MessageType]Message[optional Parameters]

bestimmtes Message Format machen soll?

LG

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.07.2014, 18:41:47 via Website

Ja wieso nicht?
Was spricht dagegen?
Json könntest du auch benutzen, ich hatte keine List mich mit einem Json Parser auseinanderzusetzen, deswegen habe ich es so gelöst,
heißt aber nicht dass es nicht anders geht, bzw. dass du meine Methode übernehmen musst

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

05.07.2014, 18:57:05 via Website

Also hast du nur damit gemein, dass ich bestimmte Felder mitgebe und nur dann wenn diese mitgegeben wurden, schließe ich daraus dass diese Message von mir ist und zeige sie an!?

Deine Parser Klasse ist dann aber schon eine Erweiterte Klassen vom "IntentService" oder? Weil nur dann bekommt man die Message mit oder?

LG

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.07.2014, 19:20:26 via Website

Ich mache das mit keinem intentservice ich mache das mit einem BroadcastReciver, der mir dannDie Message Parst.
Sieht in etwa so aus:

     public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {       
    Context ctx; 


@Override
                public void onReceive(Context context, Intent intent) {

                    ctx = context;//Context als Klassenvariable setzen





                        String result = intent.getStringExtra("action");//Bekomme komplette GCM Message
                        GcmMessage msg = new GcmMessage(result); //Parse GCmMessage
                        NotificationBuilder.BuildNotification(context, msg);//Gebe GCM aus, + Filter nach GCM Typen



                    setResultCode(Activity.RESULT_OK);
                }

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

05.07.2014, 21:25:32 via Website

Warum verwendest du einen WakefulBroadcastReceiver?

Wie Filterst du da?

LG

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

05.07.2014, 21:41:56 via Website

Da filtere ich über die Manifest:

<receiver

de.deinPackage.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />

            <category android:name="de.deinPackage" />
        </intent-filter>
    </Receiver>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
 <permission
    android:name="de.deinPackage.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />

<uses-permission android:name="de.deinPackage.permission.C2D_MESSAGE" />

— geändert am 06.07.2014, 11:16:55

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

06.07.2014, 11:13:59 via App

Was der intent-filter bewirkt, verstehe ich nicht.

LG

LG Jakob

Antworten
Markus B.
  • Forum-Beiträge: 636

06.07.2014, 15:35:37 via Website

Tachen,
google liefert in dem GCM tutorial eigentlich alles mit:
http://developer.android.com/google/gcm/index.html
Gut ist jetzt ein bissel viel zum Lesen aber danach verstehst du es im Detail. Dann kannst du dir später bei Problemen selber helfen.

Des weiteren gibt es zu dem ganzen code Schnipseln im tutorial auch ein google code Projekt wo du dir alles im Zusammenhang anschauen kannst:
https://code.google.com/p/gcm/

Gruß,
Markus

Georg C.

Antworten
Jakob N.
  • Forum-Beiträge: 282

08.07.2014, 21:46:45 via App

Hallo!

@Pascal: Wie kann man sichergehen ab welchen Zeitpunkt der User die neue Version installiert hat?

LG

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.07.2014, 17:07:36 via Website

Du kannst z.b. in der App dann einen Post auf eine Seite machen, die Versionsnummer posten.
In der Datenbank müsstest du dann pro Userinstallation einen Eintrag haben.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

09.07.2014, 17:22:42 via App

Soll ich dass beim Start der App immer einfügen? Oder wann meinst du dass ich es einfügen soll?

LG

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.07.2014, 17:31:05 via Website

Oder Die Versionsnummer in die Shared Preferences Schreiben und beim Start immer vergleichen .
Wenn es unterschiedliche sind, dann ist es die Neuere Version und du kannst deine Dinge ausführen (z.b. post an dB)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

09.07.2014, 17:40:48 via App

Stimmt! Gute Idee! Danke :)

Noch etwas ... gibt es eine Möglichkeit eine Benachrichtigung wieder zurück an den Server zu schicken? bzw. obwohl der User die Benachrichtigung vom Server schon erhalten hat, zu sagen dass der Client die Benachrichtigung noch nicht erhalten hat.

Und vielleicht auch die Benachrichtigungen erst um eine bestimmte Zeit abzusenden?

LG

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.07.2014, 17:51:47 via Website

Nein vor implementiert ist sowas nicht, aber du kannst das leicht über http requests lösen.
Wenn der Cleint sagt, dass die Nachricht falsch oder nicht angekommen sei (was er wenn wirklich nicht angekommen nicht wissen kann)
kannst du über ein HHT request ein ein php script noch eine GCM Nachricht rausschicken lassen, aber was bringt dir das?
Bei der Zeitverzögerung könnte das ein Problem werden.
Entweder der Client macht eine Zeitverzögerung und schickt dann erst zum Server die Nachricht, dass er "eine neue will".
Sonst müsstest du eine art Warteschleifen DB anlegen.
Und ein PHP schreiben, dass von einem Cronjob alle Minute aufgerufen wird.
Diese PHP liest dann die DB und prüft die in der DB gepeicherten Zeit mit der aktuellen.
Wenn diese übereinstimmen kannst du eine GCM raussenden und dann den Eintrag löschen.
Bei der nächsten Minute wir das Skript erneut aufgerufen und behandelt somit den nächsten Eintrag zu einer bestimmten Zei.

Diese beiden Methode würden mir Spontan zu diesem Zeitverzögerungsthema einfallen.
Wahrscheinlich gibt es aber noch einige weitere.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

09.07.2014, 19:59:37 via App

Okeee ... Aufen jeden Fall vielen Danke für deine Antworten :)

LG

LG Jakob

Antworten
Jakob N.
  • Forum-Beiträge: 282

11.07.2014, 17:30:45 via Website

Muss das Device bei einer neuen App-Version wirklich neu registriert werden?

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.07.2014, 22:45:11 via Website

Nein eigentlich nicht.
Habe ich das irgendwo gesagt?
Ich meinte, eine Zuordnung in der du die Version des Benutzers speicherst, damit du weisst, wieviele user die neue/neueste Version installiert habeb.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

12.07.2014, 13:21:16 via Website

Nein aber im Tutorial ist es so ausprogrammiert ...

private String getRegistrationId(Context context) {
 final SharedPreferences prefs = getGCMPreferences(context);
 String registrationId = prefs.getString(PROPERTY_REG_ID, "");
 if (registrationId.isEmpty()) {
     Log.i(TAG, "Registration not found.");
     return "";
 }
 // Check if app was updated; if so, it must clear the registration ID
 // since the existing regID is not guaranteed to work with the new
 // app version.
 int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
 int currentVersion = getAppVersion(getApplicationContext());
 if (registeredVersion != currentVersion) {
     Log.i(TAG, "App version changed.");
     return "";
 }
 return registrationId;

}

.. und es wird die App-Version eben in SharedPreferecnes abgespeichert.

LG Jakob

— geändert am 12.07.2014, 13:29:25

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.07.2014, 17:02:43 via Website

Ob das einen Unterschied macht, weiss icht nicht, müsstest du in denem Fall einmal überprüfen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

12.07.2014, 17:27:17 via App

Hast du es bei dir implementiert?

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

12.07.2014, 17:33:10 via Website

Nein, ich habe das nicht geändert, und noch keinen Fehler bemerkt, kann natürlich sein, dass sich die Registration ID bei einem App update ändert.
Glaube ich aber nicht.
Also vlt. mal eine Zeit lang überwachen und prüfen ob diese sich irgendwann ändert.
Wen ja bitte hier posten, dann müsste ich das auch noch implementieren.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

12.07.2014, 17:36:29 via App

Oke!

Bin gerade noch am implemtieren! Bekomme einen Fehler beim Libary importieren, wenn du vielleicht meinen neuen Thread noch nicht gesehen hast!

LG Jakob

LG Jakob

Antworten
Jakob N.
  • Forum-Beiträge: 282

14.07.2014, 22:14:42 via Website

Gibt es eigentlich von Google ein Tool wo man gesendete Push-Notifications anschauen kann oder so ähnlich?

Und wie schaffe ich, dass jede Notification die ich von einer Pushnotification erzeuge, eine eindeutige ID bekommt?

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.07.2014, 06:14:29 via App

Für was brauchst du eine eindeutige id?
Wenn du eine willst dann must du diese in dein MessageFormat einbinden.
Nein so weit ich weiss gibt es vong google keine gcm history.
Ist auch gut so denk mal An WhatsApp etc.
Dann würde google ja noch mehr wissen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.07.2014, 06:14:31 via App

Für was brauchst du eine eindeutige id?
Wenn du eine willst dann must du diese in dein MessageFormat einbinden.
Nein so weit ich weiss gibt es vong google keine gcm history.
Ist auch gut so denk mal An WhatsApp etc.
Dann würde google ja noch mehr wissen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.07.2014, 06:14:33 via App

Für was brauchst du eine eindeutige id?
Wenn du eine willst dann must du diese in dein MessageFormat einbinden.
Nein so weit ich weiss gibt es vong google keine gcm history.
Ist auch gut so denk mal An WhatsApp etc.
Dann würde google ja noch mehr wissen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.07.2014, 06:14:35 via App

Für was brauchst du eine eindeutige id?
Wenn du eine willst dann must du diese in dein MessageFormat einbinden.
Nein so weit ich weiss gibt es vong google keine gcm history.
Ist auch gut so denk mal An WhatsApp etc.
Dann würde google ja noch mehr wissen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.07.2014, 06:14:36 via App

Für was brauchst du eine eindeutige id?
Wenn du eine willst dann must du diese in dein MessageFormat einbinden.
Nein so weit ich weiss gibt es vong google keine gcm history.
Ist auch gut so denk mal An WhatsApp etc.
Dann würde google ja noch mehr wissen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

15.07.2014, 16:45:42 via Website

Falls mehrer Push-Notification mit demselben Typ kommen, die Notification dann nicht überschrieben werden und auch keine verloren gehen, ohne dass der User sie gehen hat.

Google / WhatsApp / Facebook weiß sowieso alles :P

LG Jakob

LG Jakob

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.07.2014, 17:03:08 via Website

Ok verstanden, dann kannst du aber auch die notification ID über den Manager prüfen ob sie existiert.
Wenn ja dann Id+1 noch mal prüfen etc.
Das so lange bis zu eine Freie ID gefunden hast.
Dann brauchst du dir den Aufwand mit der ID im MessageFormat nicht machen.

PS: @Jakob: Nein nicht ganz: Meine Gedanken sind noch Privat :)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jakob N.
  • Forum-Beiträge: 282

15.07.2014, 19:26:27 via App

Oke passt! Danke :)

@Pascal: Glaub mir die Zeit wird noch kommen ;)

LG Jakob

LG Jakob

Antworten