Avec un peu de mal j’ai enfin réussi à comprendre quelque chose sur l’envoi des notifications sur iPhone.
Si cela peu aider quelqu’un, voici la methode que j’ai adopté.
Dans cette article je ne montre que la partie serveur en PHP qui doive être completé par l’inscription au service de notification côté Objective-C (ou autre…).
Tout d’abord il faut obtenir un certificat SSL pour le service d’envoi (APNS):
Il faut faire une demande de certificat à l’aide du Trousseau d’accès (dans Applications->Utilitaires->Trousseau d’accès)
Cliquez sur le menu « Trousseau d’accès » et sélectionner « Assistant de certification » et « Demander un certificat à une autorité de certificat … »
Insérez votre adresse email et sélectionnez « Enregistrer sur le disque » et « Me laisser indiquer les informations sur la bi-clé ».
Choisissez ensuite 2048 bits dans « Dimension de la clé » et RSA dans « Algorithme ».
Le fichier sera ainsi enregistré sur l’ordinateur et prêt à être uploadé sur le portail de Apple.
Activez dans AppId de votre application le service APNS, Cliquez sur le bouton « Configure » et environnement de développement.
Suivez les instruction du portail et uploadé le fichier que vous avez creé.
Après quelques secondes le certificat de Apple est disponible pour le téléchargement.
Enregistrez le fichier sur votre ordinateur et faites double click.
Le certificat est maintenant installé sur votre trousseau d’accès.
Dans votre trousseau d’accès sélectionnez le certificat et la clé et allez dans « fichier » > « Exporter des éléments ».
Choisissez le format P12. Le trousseau d’accès vous demande un mot de passe, laissez le mot de passe vide.
Maintenant il faut transformer le fichier dans un format qui soit compatible avec PHP.
Utilisez le terminal pour vous positionner dans le dossier où vous avez exporté le certificat et écrivez ceci :
> openssl pkcs12 -clcerts -nokeys -out pushcert.pem -in MonCertifExporte.p12
> openssl pkcs12 -nocerts -out key.pem -in MonCertifExporte.p12
> openssl rsa -in key.pem -out key.nocrypted.pem
> cat pushcert.pem key.nocrypted.pem > pushcertification.pem
Pour verifier que le certificat generé soit correct vous pouvez lancer la commande:
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert pushcertification.pem
Si tout est ok, vous devriez pouvoir taper du texte.
Vous devez maintenant envoyer le fichier pushcertification.pem sur votre serveur dans un dossier protegé (et éviter ainsi que n’importe qui puisse envoyer des notifications)
Il reste maintenant à développer la partie PHP pour envoyer les notifications.
Créez un fichier php dans le même dossier où vous avez mis le certificat « pushcertification.pem » avec ces lignes :
// contexte SSL
$ctx = stream_context_create();
//ouverture du fichier PEM
stream_context_set_option($ctx, 'ssl' , 'local_cert', './pushcertification.pem');
//ouverture d'une connexion
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195',$err,$errstr, 60 , STREAM_CLIENT_CONNECT,$ctx);
if(!$fp){
print "Erreur de connexion : $err $errstr
";
}
else{
print "OK
";
}
//CREATION DU MESSAGE ET ENVOI
$body = array();
$body['aps'] = array();
$body['aps']['alert'] = "Hello World.";
$body['aps']['badge'] =1;
$body['aps']['sound'] = "default";
$payload = json_encode($body);
$devicetoken = $token;// token récuperé par la base de données au moment de l'inscription par Objective-c
//construction de donnees a envoyer
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ','',$devicetoken)) . pack("n",strlen($payload)) . $payload;
print "Message: " . $payload . "n";
//envoi des donnees
fwrite($fp,$msg);
fclose($fp);
Pour finir, il nous reste à gérer les désinscriptions. Cela est très important car si vous continuez à envoyer des notification à des utilisateurs qui ont désactivé leur inscription ou bien désinstallé l’application, Apple pourras refuser tous vos futures envois.
POur les désinscription il faut ajouter cette partie PHP:
/////FEEDBACK
function send_feedback_request() {
//connect to the APNS feedback servers
//make sure you're using the right dev/production server & cert combo!
$stream_context = stream_context_create();
stream_context_set_option($stream_context, 'ssl', 'local_cert', './ck.pem');
$apns = stream_socket_client('ssl://feedback.sandbox.push.apple.com:2196', $errcode, $errstr, 60, STREAM_CLIENT_CONNECT, $stream_context);
if(!$apns) {
echo "ERROR $errcode: $errstr
";
return;
}else{
print "Connection OK
";
//var_dump($apns);
}
$feedback_tokens = array();
//and read the data on the connection:
while(!feof($apns)) {
$data = fread($apns, 38);
//var_dump($data);
if(strlen($data)) {
$feedback_tokens[] = unpack("N1timestamp/n1length/H*devtoken", $data);
}
}
fclose($apns);
return $feedback_tokens;
}
$feed_back = send_feedback_request();
var_dump($feed_back);
En alternative, vous pouvez utiliser le webservice de Urban AirShip http://urbanairship.com/
