Push Notifications (Android): Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Die Seite wurde neu angelegt: „ Push Notifications laufen bei Android über die Cloud Dienste von Google, C2DM. Für die Benutzung muss sich bei Google…“
 
(kein Unterschied)

Aktuelle Version vom 23. Februar 2012, 09:49 Uhr

Push Notifications laufen bei Android über die Cloud Dienste von Google, C2DM. Für die Benutzung muss sich bei Google registriert werden, sowie bei C2DM (http://code.google.com/intl/de-DE/android/c2dm/signup.html)

In der Kommunikation für die PNs existieren 3 Parteien das Gerät, die Google Cloud (C2DM) und der eigene Server für die PNs.

Client meldet sich am C2DM an

[Bearbeiten | Quelltext bearbeiten]

Im 1. Schritt fragt der Client ein Token beim C2DM an, hier ist zu beachten das jede Anfrage ein neues Token generiert. <code=java>

       Intent registrationIntent = new Intent(GOOGLE_C2DM_REGISTER);
       registrationIntent.putExtra("app", PendingIntent.getBroadcast(context, 0, new Intent(), 0));
       registrationIntent.putExtra("sender", senderEMail);
       context.startService(registrationIntent);

</code=java> Für das Empfangen des Responses muss ein Receiver registriert werden <code=xml> <receiver

           android:name=".aos.pushnotification.C2DMListener"
           android:permission="com.google.android.c2dm.permission.SEND" >
           <intent-filter >
               <action android:name="com.google.android.c2dm.intent.RECEIVE" />
               <category android:name="<packagename>" />
           </intent-filter>
           <intent-filter >
               <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
               <category android:name="<packagename>" />
           </intent-filter>
       </receiver>

</code=xml>

<code=java> public class C2DMListener extends BroadcastReceiver {

   @Override
   public void onReceive(Context context, Intent intent)
   {
       System.out.println("C2DMListener.onReceive()");
       try
       {
           if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION"))
           {
               String registration = intent.getStringExtra("registration_id");
               if (intent.getStringExtra("error") != null)
               {
                   System.out.println("Error: " + intent.getStringExtra("error"));
               }
               else if (intent.getStringExtra("unregistered") != null)
               {
                   System.out.println("Unregistred: " + intent.getStringExtra("unregistered"));
               }
               else if (registration != null)
               {
                   System.out.println("RegId: " + registration);
               }
           }
           else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE"))
           {
               //push notification received
           }
           else
               System.out.println("Unknown action: " + intent);
           setResult(Activity.RESULT_OK, null /* data */, null /* extra */);
       }
       catch (Exception e)
       {
           e.printStackTrace();
       }
   }

} </code=java>

Registrierung am Server

[Bearbeiten | Quelltext bearbeiten]

Ist das Token erhalten kann man es an den eigenen Server schicken.


Senden von Daten

[Bearbeiten | Quelltext bearbeiten]

Hat sich der Client beim Server mit dem Token registriert, kann dieser über diese Adresse Notifications an den Client schicken. Der Header muss dazu das Feld "Authorization" mit dem Google Key enthalten, im Body des POST Requests werden die weiteren Informationen geschickt:

  • collapse_key - Key mit dem Nachrichten zusammen gefasst werden
  • data.<key> - Datenfeld das vom Anwender bestimmt werden, diese Datenfelder werden an die AOS App weitergereicht und können von dieser Ausgewertet werden
  • registration_id - Token des Gerätes

Diese Daten werden als POST Request an die C2DM Server geschickt (https://android.apis.google.com/c2dm/send). Den Key für die Authentifizierung muss gesondert angefragt werden, hierzu muss ein Google Account existieren und die App bei Google registriert sein (Wobei ich glaub das ist verarsche, Hauptsache der Account hat einmal einen Request für irgend ein Package an Google geschickt, die Keys gehen bisher für alle Apps, egal welchen Packagenamen sie haben) Dies erfolgt über die Webseite http://code.google.com/intl/de-DE/android/c2dm/signup.html Nach einigen Tagen erhält man eine EMail und man kann über den Request anfordern. Dazu muss ein POST Request mit dem Boddy

accountType=HOSTED_OR_GOOGLE&Email=<google ID>&Passwd=<password>&service=ac2dm&source=blabliblub

An https://www.google.com/accounts/ClientLogin geschickt werden.