Push (Remote) Notification für Jedermann
Nachdem ich jetzt doch recht lange Zeit daran gesessen habe meine App mit Push-Notifications auszurüsten und ich mir dafür alles mögliche von den verschiedensten Stellen im Internet zusammen suchen musste und dennoch Fragen offen blieben dachte ich, ich schreibe mal ein Komplett-Tutorial. Da ich selber ja noch sehr neu in dieser Materie bin und sicher nicht alles perfekt gelöst ist, mag eventuell ja der eine oder andere Crack hier noch seine Meinung dazu abgeben und so wird daraus ein rundes Paket das allen hilft.
Angemerkt sei noch, dass dieses Tutorial PHP und SQL zum Versenden der Notifications , Registrieren der Devices und Abfragen des Feedback-Services verwendet. Sicher ist das auch mit anderen Scriptsprachen und Datenbanken möglich, aber ich denke diese beiden sind am weitesten verbreitet.
Das ist keine Anleitung für absolute iOs-Programmier-Anfänger. Es wird davon ausgegangen, dass klar ist wie man AppID‘s, Provisioning Profiles u.ä. anlegt und das Grundlagen in PHP und SQL vorhanden sind.
Das erste was man benötigt um überhaupt Push-Notifications in seiner App implementieren zu können ist das Push-Zertifikat, welches unser PHP Server benötigt um sich beim Apple-Push-Notification-Service anzumelden.
Sollte es für die App noch keine AppID geben, dann sollten wir jetzt eine neue anlegen. Danach müssen wir diese erweitern. Dazu klicken wir einfach unter App IDs auf den „Configure“ Button neben unserer AppID und aktivieren dann „Enable for Apple Push Notifcation service“ und klicken dann wieder auf den gerade aktiv gewordenen „Configure“ Button neben dem Zertifikatsnamen. Diese führt uns durch den uns schon bekannten „Certificate Assistant“. Nachdem wir das Zertifikat erstellt und heruntergeladen haben, importieren wir es durch Doppelklick in unseren Schlüsselbund.
Nun müssen wir dieses Zertifikat ins PEM Format konvertieren.
Dazu starten wir die Schlüsselbundverwaltung und aktivieren die „Zertifikate“ Kategorie. Dort sehen wir einen aufklappbaren Eintrag „Apple Development Push Services“. Den klappen wir und klicken dann mit der rechten Maustaste auf Apple Development Push Services->“Apple Development Push Services: XXXXXXX“ exportieren und speichern das als apns-dev-cert.p12
Das gleiche machen wir für den privaten Schlüssel der beim Öffnen erschienen ist und speichern diesen unter apns-dev-key.p12
Jetzt öffnen wir ein Terminal und konvertieren die beiden Dateien ins PEM Format und verbinden sie miteinander:
Der Rest ist relativ einfach. Die PEM Datei muss im gleichen Ordner liegen wie das folgende PHP Script zum Schicken der Notification:
Alles anzeigen
Als weiteres brauchen wir ein PHP Script, bei dem sich die Devices mit Ihrem DeviceToken anmelden. Das ist ebenfalls recht einfach:
Alles anzeigen
Ein drittes PHP Script dient dazu den Feedback service abzufragen. Hier werden uns z.B. die Tokens der Devices mitgeteilt, die über längere Zeit keine Notifikation angenommen haben. Bei diesen können wir davon ausgehen, dass dort unsere App wieder deinstalliert wurde. Wir können dann also diese DeviceTokens aus unserer DB entfernen. Wie das geht wird hier nicht weiter erklärt. In dem Script geht es nur darum den Feedback richtig abzufragen:
Alles anzeigen
Nachdem ich jetzt doch recht lange Zeit daran gesessen habe meine App mit Push-Notifications auszurüsten und ich mir dafür alles mögliche von den verschiedensten Stellen im Internet zusammen suchen musste und dennoch Fragen offen blieben dachte ich, ich schreibe mal ein Komplett-Tutorial. Da ich selber ja noch sehr neu in dieser Materie bin und sicher nicht alles perfekt gelöst ist, mag eventuell ja der eine oder andere Crack hier noch seine Meinung dazu abgeben und so wird daraus ein rundes Paket das allen hilft.
Angemerkt sei noch, dass dieses Tutorial PHP und SQL zum Versenden der Notifications , Registrieren der Devices und Abfragen des Feedback-Services verwendet. Sicher ist das auch mit anderen Scriptsprachen und Datenbanken möglich, aber ich denke diese beiden sind am weitesten verbreitet.
Das ist keine Anleitung für absolute iOs-Programmier-Anfänger. Es wird davon ausgegangen, dass klar ist wie man AppID‘s, Provisioning Profiles u.ä. anlegt und das Grundlagen in PHP und SQL vorhanden sind.
Das erste was man benötigt um überhaupt Push-Notifications in seiner App implementieren zu können ist das Push-Zertifikat, welches unser PHP Server benötigt um sich beim Apple-Push-Notification-Service anzumelden.
Sollte es für die App noch keine AppID geben, dann sollten wir jetzt eine neue anlegen. Danach müssen wir diese erweitern. Dazu klicken wir einfach unter App IDs auf den „Configure“ Button neben unserer AppID und aktivieren dann „Enable for Apple Push Notifcation service“ und klicken dann wieder auf den gerade aktiv gewordenen „Configure“ Button neben dem Zertifikatsnamen. Diese führt uns durch den uns schon bekannten „Certificate Assistant“. Nachdem wir das Zertifikat erstellt und heruntergeladen haben, importieren wir es durch Doppelklick in unseren Schlüsselbund.
Nun müssen wir dieses Zertifikat ins PEM Format konvertieren.
Dazu starten wir die Schlüsselbundverwaltung und aktivieren die „Zertifikate“ Kategorie. Dort sehen wir einen aufklappbaren Eintrag „Apple Development Push Services“. Den klappen wir und klicken dann mit der rechten Maustaste auf Apple Development Push Services->“Apple Development Push Services: XXXXXXX“ exportieren und speichern das als apns-dev-cert.p12
Das gleiche machen wir für den privaten Schlüssel der beim Öffnen erschienen ist und speichern diesen unter apns-dev-key.p12
Jetzt öffnen wir ein Terminal und konvertieren die beiden Dateien ins PEM Format und verbinden sie miteinander:
Der Rest ist relativ einfach. Die PEM Datei muss im gleichen Ordner liegen wie das folgende PHP Script zum Schicken der Notification:
Quellcode
- // notifocation vars
- $title='I got news!'; // This is the text shown in the notification
- $section=0; // just an example for user data
- $type=1;
- /* db connect */
- define("SQL_HOST","myDBURL"); // host name
- define("SQL_USER","UserName"); // user name
- define("SQL_PASSWORD","Password"); // password
- define("SQL_DBNAME","Database"); // database name
- /* connect to db */
- function db_connect()
- {
- global $db;
- $db = mysql_connect(SQL_HOST,SQL_USER,SQL_PASSWORD);
- if(!$db)
- {
- echo "Cannot connect to database #1";
- die();
- }
- mysql_select_db(SQL_DBNAME,$db);
- }
- db_connect();
- // create notification string
- $payload['aps']=array('alert' => $title, 'badge' => 1,'sound' => 'default');
- // this ist just an example how to add userdata to the notification
- $payload['data']=array('section' => $section, 'type' => $type);
- $payload=json_encode($payload);
- // connect data for the apns
- $apnsHost='gateway.sandbox.push.apple.com';
- $apnsPort=2195;
- $apnsCert='apns-dev.pem';
- // open stream
- $streamContext=stream_context_create();
- stream_context_set_option($streamContext,'ssl','local_cert',$apnsCert);
- $apns=stream_socket_client('ssl://'.$apnsHost.':'.$apnsPort,$error,$errorString,2,STREAM_CLIENT_CONNECT,$streamContext);
- if($error!=0)
- {
- echo 'Error open stream: '.$error;
- echo $errorString;
- die();
- }
- // now push a notification for every registered token
- $out = mysql_query("SELECT * FROM uppco_token");
- if(!$out)
- {
- echo "Error reading database. #2 uppco_token";
- die();
- }
- echo 'Start notifying...
- ';
- while($data=mysql_fetch_array($out))
- {
- $deviceToken=$data[0];
- echo 'Notify: '.$deviceToken.'
- ';
- $apnsMessage=chr(0).chr(0).chr(32).pack('H*',$deviceToken).chr(0).chr(strlen($payload)).$payload;
- fwrite($apns,$apnsMessage);
- }
- echo '
- Notifying done.
- ';
- fclose($apns);
- ?>
Als weiteres brauchen wir ein PHP Script, bei dem sich die Devices mit Ihrem DeviceToken anmelden. Das ist ebenfalls recht einfach:
Quellcode
- /* db connect */
- define("SQL_HOST","myDBURL"); // host name
- define("SQL_USER","UserName"); // user name
- define("SQL_PASSWORD","Password"); // password
- define("SQL_DBNAME","DataBase"); // database name
- /* connect to db */
- function db_connect()
- {
- global $db;
- $db = mysql_connect(SQL_HOST,SQL_USER,SQL_PASSWORD);
- if(!$db)
- {
- echo "Error: Cannot connect to database #1";
- die();
- }
- mysql_select_db(SQL_DBNAME,$db);
- }
- db_connect();
- $token=$_GET['token'];
- // first check db if token already exists
- $out = mysql_query("SELECT * FROM uppco_token WHERE token='".$token."'");
- if(!$out)
- {
- echo "Error: reading database. #2 uppco_token";
- die();
- }
- if($data=mysql_fetch_array($out))
- {
- echo "Done: token already registered";
- die();
- }
- // if not, insert token in db
- $out = mysql_query("INSERT INTO uppco_token (token) VALUES('".$token."')");
- if(!$out)
- {
- echo "Error: writing database. #3 uppco_token";
- die();
- }
- echo 'Done: token registered';
- ?>
Ein drittes PHP Script dient dazu den Feedback service abzufragen. Hier werden uns z.B. die Tokens der Devices mitgeteilt, die über längere Zeit keine Notifikation angenommen haben. Bei diesen können wir davon ausgehen, dass dort unsere App wieder deinstalliert wurde. Wir können dann also diese DeviceTokens aus unserer DB entfernen. Wie das geht wird hier nicht weiter erklärt. In dem Script geht es nur darum den Feedback richtig abzufragen:
Quellcode
- // create stream
- $streamContext = stream_context_create();
- stream_context_set_option($streamContext, 'ssl', 'local_cert', 'apns-dev.pem');
- stream_context_set_option($streamContext, 'ssl', 'verify_peer', false);
- // assume the private key passphase was removed.
- // stream_context_set_option($streamContext, 'ssl', 'passphrase', $pass);
- $apns = stream_socket_client('ssl://feedback.sandbox.push.apple.com:2196', $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext);
- // production server is ssl://feedback.push.apple.com:2196
- if (!$apns || $error)
- {
- echo 'Failed to connect feedback server: $err $errstr
- ';
- die();
- }
- else
- {
- echo 'Connection to feedback server OK
- ';
- }
- echo 'APNS feedback results:
- ';
- while ($devcon = fread($apns, 38))
- {
- $arr = unpack("H*", $devcon);
- $rawhex = trim(implode("", $arr));
- $feedbackTime = hexdec(substr($rawhex, 0, 8));
- $feedbackDate = date('Y-m-d H:i', $feedbackTime);
- $feedbackLen = hexdec(substr($rawhex, 8, 4));
- $feedbackDeviceToken = substr($rawhex, 12, 64);
- echo 'TIMESTAMP:' . $feedbackDate . '
- ';
- echo 'DEVICE ID:' . $feedbackDeviceToken. '
- ';
- }
- echo 'All results done.';
- fclose($apns);
- ?>
2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.
Pre-Kaffee-Posts sind mit Vorsicht zu geniessen
Pre-Kaffee-Posts sind mit Vorsicht zu geniessen