Push Notifications (Android)

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen

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)

Ablauf

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.

PN-Kommunikation.png

Client meldet sich am C2DM an

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

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


Senden von Daten

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.