Push Ip(hone|od) en PHP en envoi « batch »

Plop à tous …

Un article en intraveineuse pour tenter de réanimer mon blog … Alors oui l’Iphone ça pue, c’est propriétaire, c’est moche et tout et tout, mais bon ça se répand comme la peste alors on fait avec :s.

Qu’est ce que le push sur IPhone ?? L’envoi de messages depuis les services d’apple vers tout les Iphones inscrit à une application, ce qui permet aux développeurs d’applications IPhone d’envoyer des messages (en quasi temps réel) pour informer d’une mise à jour, faire ch**r son monde, …

L’implémentation est assez intéressante, puisque les envois se font avec des certificats via une connexion SSL.

Allons droit au but …

Tout d’abord, il faut avoir un compte chez Apple (bouark …), il faudra générer un certificat x509 (qui servira selon toute vraisemblance à signer les certificats des applications … à ne pas perdre donc).

Puis lors de l’ajout des fonctionnalités de push à notre appli, récupérer le certificat propre à l’application que l’on développe. Le certificat de notre application est nommé : aps_developer_identity.cer (une fois téléchargé depuis leur portail), mais pour l’utiliser, il faut changer de format, et supprimer le mot de passe, ce qu’il est possible de faire avec le script suivant (en le mettant dans le même dossier que le certificat) :

#!/bin/bash
#Generate PEM from cer
openssl x509 -inform der -in aps_developer_identity.cer -out apns-dev-cert.pem
#In case of p12 apns-dev-cert
#openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
#Remove password if needed
openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem
cat apns-dev-key-noenc.pem apns-dev-cert.pem > apns-dev.pem

Une fois le certif au format pem récupéré (ici nommé apns-dev.pem), on peut passer à l’envoi de push en PHP (en sandbox pour les test, sinon, il faudra changer l’url en gateway.push.apple.com) :

function sendPushToToken($msg,$token)
{
	$serverId=1;
	$name="nom de mon appli";
	$apnsHost = 'gateway.sandbox.push.apple.com';
	$apnsPort = 2195;
	$apnsCert = 'apns-dev.pem';
	
	/*DON'T TOUCH BELOW*/
	$payload['aps'] = array('alert' => $msg, 'badge' => 0, 'sound' => 'default');
	$payload['server'] = array('serverId' => $serverId, 'name' => $name);
	$output = json_encode($payload);
	
	$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);
	$apnsMessage = chr(0).chr(0).chr(32).pack('H*',str_replace(' ','',$token)).chr(0).chr(strlen($output)).$output;
	fwrite($apns, $apnsMessage);
	fclose($apns);
}

L’utilisation est très simple : on appel sendPushToToken(‘notre message’,’le token de l’appareil’);
et dans les 5 minutes, le message est reçu ….

Pour l’envoi en batch, on rajoute une boucle à l’envoi avec un tableau de tokens :

function sendPushToTokens($msg,$tokens)
{
	$serverId=1;
	$name="nom de mon appli";
	$apnsHost = 'gateway.sandbox.push.apple.com';
	$apnsPort = 2195;
	$apnsCert = 'apns-dev.pem';
	
	/*DON'T TOUCH BELOW*/
	$payload['aps'] = array('alert' => $msg, 'badge' => 0, 'sound' => 'default');
	$payload['server'] = array('serverId' => $serverId, 'name' => $name);
	$output = json_encode($payload);
	
	$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);

	foreach($tokens as $token)
	{
		$apnsMessage = chr(0).chr(0).chr(32).pack('H*',str_replace(' ','',$token)).chr(0).chr(strlen($output)).$output;
		fwrite($apns, $apnsMessage);
	}
	fclose($apns);
}

L’utilisation est la suivante : sendPushToTokens(‘mon message’,array(‘token1′,’token2’))
et dans les 5 minutes nos deux ip(hone|od) recevront notre message …

Le gros problème dans l’histoire, c’est qu’Apple ne renvoi aucune données … on ne peut pas savoir si toutes les personnes sont capables de recevoir le message (aucun retour n’est prévu). Pour ce faire on peut appeler le service de feedback.

Un script PHP permet de récupérer les tokens s’étant désabonnés. (C’est amusant … tout les codes PHP pour l’envoi de PUSH se ressemble ^^… mais n’ayant pas encore utilisé le service de feedback, je préfère donner l’url du script en question)

Voilà … alors spammez bien xD.

Une réflexion sur “ Push Ip(hone|od) en PHP en envoi « batch » ”

  1. Meme si ca n’est pas le but de l’article, merci beacoup pour ce tuto qui m’a beaucoup aidé à résoudre mes difficultés à me connecter en SOAP/SLL sur un serveur ……. microsoft !!

Les commentaires sont fermés.