| 

.NET C# Java Javascript Exception

5
Seit Android 2.2 gibt es in Android Apps die Möglichkeit auf Push-Nachrichten zu reagieren. Dieser Dienst wird Cloud to Device Messaging oder kurz C2DM genannt. Die App registriert sich dazu bei den C2DM Servern an und bekommt dafür eine DeviceRegistrationID. Ab dann wird die Verbindung zwischen dem Android Market (neuerdings Google Play genannt) und den [...]

Ähnliche Artikel:
  1. PayPal-Integration: Instant Payment Notifications (IPN) einbauen
  2. Verschiedene Möglichkeiten, mit PHP zu twittern

Seit Android 2.2 gibt es in Android Apps die Möglichkeit auf Push-Nachrichten zu reagieren. Dieser Dienst wird Cloud to Device Messaging oder kurz C2DM genannt.

Die App registriert sich dazu bei den C2DM Servern an und bekommt dafür eine DeviceRegistrationID. Ab dann wird die Verbindung zwischen dem Android Market (neuerdings Google Play genannt) und den Google-Servern genutzt um die Push-Nachrichten auf das Handy zu bekommen.

Die DeviceRegistrationID muss die App dann an unseren Server melden, und alle Nachrichten an diese DeviceRegistrationID kommen dann auf genau diesem Handy an. Sollte das Handy ausgeschaltet sein werden die Nachrichten zugestellt sobald das Handy (und die App) wieder gestartet sind. Falls alle Nachrichten den selben “Collapse Key” haben wird nur die neueste zugestellt.

Der Server, der eine Nachricht senden möchte, sendet dazu einen POST Request an Googles C2DM Dienst. Der Text der Nachricht ist auf maximal 1024 Byte beschränkt, sollte also nur für kurze “Aufweckpings” bzw. Nachrichten a la “Es gibt Neuigkeiten vom Typ X, frag beim Server nach” geeignet sein.

Hier das ganze Verfahren nochmal grafisch dargestellt:

  1. Die App meldet sich beim C2DM Dienst an
  2. Die App bekommt eine Device Registration ID
  3. Die App meldet diese Device Registration ID an den Applikationsserver der diese dann einem Benutzer zuordnet und abspeichert
  4. Wenn auf dem Applikationsserver ein Event passiert über das das Handy benachrichtig werden soll…
  5. … wird diese Nachricht bzw. die Eventbenachrichtung an den C2DM Dienst übergeben
  6. Google sendet dann diese Nachricht an das entsprechende Handy und die App kann auf die Nachricht reagieren

Ich möchte hier den Serverteil vorstellen, der die Nachrichten an Googles Gateway übergibt und die dann in der App ankommen sollen. Dazu benötigen wir einen Google-Account den wir beim C2DM Dienst registrieren. Etwas vorsichtig muss man sein was man dort angibt: Die Role E-Mail ID muss ein Google-Account sein der nicht auf einem Handy registriert ist, am besten legt man dafür also einen separaten Account ein, denn diese E-Mail-Adresse ist im App eingetragen und das Passwort dieses Accounts wird auch im Quelltext auf dem Server abgelegt.

Danach hat man einen Google-Account der Nachrichten an den C2DM Dienst senden kann (anfangs “nur” 200.000 pro Tag, das kann man aber erhöhen lassen). Für die Authentifizierung am C2DM Dienst benötigen wir einen AuthCode den wir mittels des sogenannten ClientLogin Dienstes bei Google bekommen.

function getGoogleAuthCodeHelper($username, $password, $source='Company-AppName-Version', $service='ac2dm')
{
 // get an authorization token
 $ch = curl_init();
 if(!$ch){
 return false;
 }

 curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin");
 $postFields = "accountType=" . urlencode('HOSTED_OR_GOOGLE')
 . "&Email=" . urlencode($username)
 . "&Passwd=" . urlencode($password)
 . "&source=" . urlencode($source)
 . "&service=" . urlencode($service);
 curl_setopt($ch, CURLOPT_HEADER, true);
 curl_setopt($ch, CURLOPT_POST, true);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
 curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
 curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

 // for debugging the request
 //curl_setopt($ch, CURLINFO_HEADER_OUT, true); // for debugging the request

 $response = curl_exec($ch);

 //var_dump(curl_getinfo($ch)); //for debugging the request
 //var_dump($response);

 curl_close($ch);

 if (strpos($response, '200 OK') === false) {
 throw new Exception('Error occurred');
 }

 // find the auth code
 preg_match("/(Auth=)([\w|-]+)/", $response, $matches);

 if (!$matches[2]) {
 throw new Exception('Error occurred');
 }

 return $matches[2];
}

Mit Hilfe dieser Funktion können wir uns einen AuthCode besorgen den wir für die eigentliche Sendefunktion benötigen:

function send($message, $authCode, $deviceRegistrationId, $msgType)
{
 $headers = array('Authorization: GoogleLogin auth=' . $authCode);
 $data = array(
 'registration_id' => $deviceRegistrationId,
 'collapse_key' => $msgType,
 'data.message' => $message
 );

 $ch = curl_init();

 curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send");
 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 curl_setopt($ch, CURLOPT_POST, true);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

 $response = curl_exec($ch);
 curl_close($ch);

 // Check the response. If the exact error message is needed it can be parsed here
 $responseArray = preg_split('/=/', $response);
 if (!isset($responseArray[0]) || !isset($responseArray[1]) || strtolower($responseArray[0]) == 'error') {
 throw new Exception('Error occurred');
 }
}

Das war es eigentlich schon, mit diesen beiden Requests kann man Push Notifications an die App senden. Wie genau die App aussieht um die Notifications zu empfangen und anfangs die DeviceRegistrationID zu beantragen möge man sich bei Google nachlesen.

Zusatzinfo: Das ganze ist zu Testzwecken auch mit dem curl-Kommando auf Shellebene machbar:

curl https://www.google.com/accounts/ClientLogin -d Email=**theEmailYouWhitelisted**
-d Passwd=**password** -d accountType=HOSTED_OR_GOOGLE -d source=Google-cURL-Example
-d service=ac2dm

 

curl --header "Authorization: GoogleLogin auth=**authFromRegistrationAbove**"
"https://android.apis.google.com/c2dm/send" -d registration_id=**deviceRegistrationId**
-d "data.message=StringToPass" -d collapse_key=something -k


Ähnliche Artikel:

  1. PayPal-Integration: Instant Payment Notifications (IPN) einbauen
  2. Verschiedene Möglichkeiten, mit PHP zu twittern
php android google curl c2dm android-app-push push-notifications
Weitere News:
Schreibe einen Kommentar:
Themen:
push-notifications android-app-push c2dm curl google android php
Entweder einloggen... ...oder ohne Wartezeit registrieren
Benutzername
Passwort
Passwort wiederholen
E-Mail