idrill 1 Introduction Le but de ce projet est de faire un prototype permettant de démontrer le fonctionnement du système de notification push offert par Apple pour les iphone. Ce système de notification permet à un serveur(public ou privé) d envoyer une notification à une application iphone sans que celle-ci soit démarrée. 1.1 Architectures L architecture pour ce projet est très simple. Elle comprend : iphone (Client iphone sur Figure 1) Client mobile qui recevra les notifications push Serveur de notification (idrill Server sur Figure 1) Serveur qui notifiera les différents clients mobiles. 1.2 Apple Push Notification Afin d utiliser le service de notification proposé par Apple les 2 opérations suivantes doivent être effectuées. L enregistrement L application désirant être notifiée doit s enregistrer auprès d Apple afin d obtenir un identifiant (token). C est cet identifiant qui sera utilisé par le server de notification pour notifier le client mobile. La notification Le serveur de notification envoie un message au client mobile. 1.2.1 Enregistrement L enregistrement de l application s effectue en 2 phases. La première consiste à s enregistrer auprès du serveur d Apple. Ceci permettra à l application d obtenir un identifiant appelé «token». Une fois le «token» obtenu, celui-ci doit être transmis au serveur de notification. Il est tout a fait possible de transmettre d autre information au serveur de notification comme par exemple le nom de l iphone. Figure 1 : Schéma fonctionnel de l'enregistrement 1.2.2 Notification Pour la notification il suffit que le serveur de notification envoi un message contenant le «token», le message à afficher sur l iphone et le numéro du badge de l application. Le numéro du badge ainsi que le message sont bien sur optionnel. L utilisateur de l iphone peut ensuite soit faire disparaître la notification soit décider de lancer directement l application en «acceptant» la notification. Attention il n est pas possible de faire du «broadcast». Page 1 sur 14
Figure 2 : Schéma fonctionnel de la notification Badge ici la valeur est 5. Message d alerte de la notification Ferme la notification Démarre l application notifiée Figure 3 : Exemple de notifiaction Au cas où il n y aurait qu un bouton à l alerte, celui-ci est de toute façon le bouton permettant de fermer la notification. Si au contraitre il y a 2 boutons seul le bouton permettant de démarrer l application («Ok» dans l exemple ci-dessus) peutêtre défini via la notification. Le bouton «Fermer» (ou «Dissmiss» si l iphone est en anglais) sera automatiquement afficher. 1.2.3 Sécurité La communication entre le serveur de notification et le serveur d Apple doit être sécurisé. Le certification est un certification SSL créer par Apple voir le point 6)c Création du certificat pour le serveur de notification. Le serveur devra utiliser ce certificat SSL pour communiquer avec le server d Apple. 2 Mise en place de l environnement Une fois que vous avez votre compte «Apple Developper» voici la marche à suivre pour créer une application utilisant le «push» ainsi que le certificat et la clé privée qui seront utilisés par le serveur de notification. 1) Se connecter sur le site http://developer.apple.com/iphone. 2) Aller «iphone Developer Program Portal». Page 2 sur 14
Figure 4 : Site web Apple pour le développemet iphone 3) Créer le certificat de développement a. Aller sous «Certificates» b. Télécharger le certificat intermédiaire (Clique sur «click here to download now») c. Cliquer sur «Request Certificate» Figure 5 : iphone Developer Program Portal d. Créer la demande de certificat et choisir la demande puis cliquer sur «Submit». La marche à suivre est expliquée dans le point 0 ainsi que sur la page affiché dans le «iphone Developer Program Portal». Figure 6 : Fenêtre de l idpp permettant de soumettre un certificat de développement Page 3 sur 14
e. Cliquer sur «Approve» pour approuver le certificat créer par Apple. Figure 7 : Fenêtre de l'idpp permettant d'approuver un certificats f. Télécharger le certificat en cliquant sur «Download» et installer celui-ci en double cliquant dessus. Figure 8 : Fenêtre de l'idpp permettant de télécharger un certificat de développment g. Vérifier que le certificat et la clé privée soient bien installés sur le MAC. Démarrer le key chain et voir si le certificat et la clé privée s y trouvent. Figure 9 : Fenêtre du Trousseau d'accès Apple 4) Ajouter le téléphone a. Cliquer sur le menu «Device» et choisir «Add Device». Figure 10 : Fenêtre de l'idpp permettant de visualiser tous les devices b. Entrer le nom de l iphone ainsi que le Device ID, puis cliquer sur «Submit». Pour avoir le Device ID : i. Connecter l iphone au mac. ii. Démarre itunes iii. Sélectionner l iphone et cliquer sur «Numéro de série». Maintenant «Identifiant (UDID)» correspond au Device ID. Il est possible de copier celui-ci en utilisant le raccourci +C. Page 4 sur 14
Figure 11 : Fenêtre itunes de l iphone Figure 12 : Fenêtre de l'idpp permettant d'ajouer un device 5) Création de l App IDs a. Cliquer sur «App IDs» puis «New App ID» Figure 13 : Fenêtre de l'idpp affichant la liste de tous les App IDs b. Entrer le nom de l App ID, dans l exemple «idrill», sélection «Generate new» sous «Bundle Seed ID» et entrer le «Bundle Identifier», dans l exemple «ch.hefr.tic.idrill». Pour finir cliquer sur «Submit». Figure 14 : Fenêtre de l'idpp permettant de créer un App ID 6) Configuration de l App ID pour l utilisation du service de notification push d Apple a. Cliquer sur «Configure» de l App ID créer ci-dessus Page 5 sur 14
Figure 15 : Fenêtre de l'idpp affichant la liste de tous les App IDs b. Cocher la case «Enable for Apple Push Notification service» puis cliquer sur «Configure» Figure 16 : Fenêtre de l'idpp permettant de configure un App ID c. Création du certificat pour le serveur de notification i. Créer une demande de certificat voir chapitre 0 et cliquer sur «Continue» ii. Soumettre la demande de certificat iii. Attendre la création du certificat (dure 10 à 30 ) iv. Télécharger le certificat et cliquer sur «Done» Page 6 sur 14
i ii iii iv Figure 17 : Fenêtres afficher lors de la configuration du Push Notification Service v. Installer le certificat dans le «Trousseau d accès» en double cliquant sur le fichier télécharger. Figure 18 : Fenêtre du Trousseau d accès d. Vérifier que tout c est correctement passer puis cliquer sur «Done». Le status doit être «Enabled». Figure 19 : Fenêtre de l'idpp permettant de configure un App ID 7) Création du Profil a. Cliquer sur «Provisioning» dans le menu du «iphone Developer Program Portal», aller sour l onglet «Development» puis cliquer sur «New Profile» Page 7 sur 14
Figure 20 : Fenêtre de l'idpp affichant la liste des provisioning profiles b. Entrer le nom du profil, sélectionner le «Certificat» créer au point 3), l «App ID» céer au point 5), le device créer au point 4) puis cliquer sur «Submit». Figure 21 : Fenêtre de l'idpp permettant de créer un provisioning profil c. Télécharger le nouveau profil Figure 22 : Fenêtre de l'idpp affichant la liste des provisioning profiles 8) Installation du projet M-Drill sur Xcode a. Démarrer Xcode Figure 23 : Chemin d'accès de l'applicaton Xcode b. Installation du profil Page 8 sur 14
i. Aller sous «Window» «Organizer». ii. Cliquer sur «Provisionning Profiles». iii. Prendre le profil téléchargé au point 7)c puis glisser celui-ci dans la liste de «Provisionning Profiles». Figure 24 : Vu de l'ajout d'un porfil dans Xcode(fenêtre de l'organizer) c. Ouvrir le projet M-Drill. Aller sous «File» «Open», choisir le fichier idrill.xcodeproj, puis cliquer sur «Open». d. Configuration du projet idrill i. Editer les propriétés du projet idrill : Clique de droite sur «idrill», puis choisir «Get Info» ii. Aller sous l onglet «Build», puis choisir le «Provisionning Profil» ajouté au point b pour la propriété «Code Signing Identity» (groupes de propriétés «Code Signing») Figure 25 : Capture d écran de l édition des propriétés du projet idrill iii. Fermer la fenêtre puis éditer les propriétés de la cible : dérouler l objet «Targets», puis clique de droite sur «idrill» et sélectionner «Get Info» iv. Aller sous l onglet «Properties» puis entrer la même valeur que celle de «Bundle Identifier» définie au point 5)b pour la propriété «Identifier». Dans l exemple «ch.hefr.tic.idrill) Page 9 sur 14
Figure 26 : Capture d écran de l édition des propriétés de la cible idrill 9) Exportation du certificat et de la clé privée pour le serveur de notification a. Ouvrir le «Trousseau d accès» b. Dérouler le certificat télécharger au point 6)c.iv c. Sélectionner le certificat, puis clique de droite est choisir «Exporter» Figure 27 : Exportation du certificat à partir du Trousseau d accès i. Entrer le nom du fichier et choisir d exporter en format.p12, ici «Certificats» Figure 28 : Fenêtre permettant de définir le nom & le format du fichier exporter ii. Choisir le mot de passe de protection Figure 29 : Fenêtre permettant de définir le mot de passe de protection iii. Entrer le mot de passe de administrateur du MAC Page 10 sur 14
Figure 30 : Fenêtre permettant de saisir le mot de passe administrateur d. Le fichier «certificats.p12» vient d être généré ; maintentant il faut aussi générer le fichier key.p12. Pour cela sélectionner maintenant la clé privé du certificat, puis clique de droite est choisir «Exporter». Puis répéter les points c.i, c.ii et c.iii en modifiant juste le nom de fichier exporter en «Key» Figure 31 : Exportation de la clé privée à partir du Trousseau d accè e. Fermer le «Trousseau d accès» puis ouvrir le «Terminal» f. Aller dans le dossier dans lequel le fichier certificats.p12 et key.p12 créés au point c et 0. Ici le dossier est /Users/dvionnet/Documents g. Créer un fichier PEM à partir du fichier certificats.p12 i. Taper la commande : openssl pkcs12 clcerts nokeys out certificats.pem in certificats.p12 ii. Le «Import password» est le mot de passe définit au point c.ii h. Créer un fichier PEM(voir référence 3) à partir du fichier key.p12 i. Taper la commande : openssl pkcs12 nocerts out key.pem in key.p12 ii. Le «Import password» est le mot de passe définit au point c.ii iii. Définir la «PEM pass phrase» par exemple «test» i. Supprimer le protection du fichier key.pem i. Taper la commande : openssl rsa in key.pem out key-noenc.pem ii. La «PEM pass phrase» est celle définit au point h.iii j. Créer un seul fichier contenant le certificat et la clé privé i. Taper la commande : cat certificats.pem key.pem > apns-dev.pem k. Copier le fichier apns-dev.pem sur le serveur de notification. Figure 32 : Shell contenant les différentes commandes à exécuter pour exporter le certificat et la clé privée 3 Création d une demande de certificat 1) Démarrer sur le mac l application «Trousseau d accès» Page 11 sur 14
2) Aller sous «Assistant de certification», puis «Demander un certificat à une autorité de certificat». 3) Entrer l adresse mail, le nom et choisir l option «Enregistrer sur disque» puis cliquer sur «Continuer». 4) Sauver le fichier «CerticateSigningRequest.cerSigning sur le bureau. Figure 33 : Marche à suivre pour créer une demande de certificat 4 Implémentation afin d utiliser le service de notification d Apple L utilisation du service de notification nécessite l implémentation d une application mobile et d un serveur de notification. Ces 2 parties interviendront autant pour l enregistrement que pour la notification. Dans l exemple l application iphone est «idrill» et le serveur de notification est «idrill server». 4.1 Enregistrement Comme cité dans l introduction l enregistrement doit permettre à l iphone et au serveur de notification d obtenir un «token» qui sera utilisé pour identifier l iphone et l application à notifier auprès du service de notification d Apple. 4.1.1 Client iphone Enregistrement auprès d Apple L enregistrement auprès du serveur d Apple est très simple à implémenter. Voici les différentes étapes que l application souscrivant aux notifications «push» doit suivre afin d obtenir un token auprès d Apple. 1) Appeler la méthode ci-dessous afin de démarrer la registration. Cette méthode prend en paramètres les options de notifications que l application prend en charge. Les 3 options disponbiles sont la prise en charge du badge, d une alerte avec un message et d une alerte sonore. [[UIApplication sharedapplication] registerforremotenotificationtypes: (UIRemoteNotificationTypeBadge UIRemoteNotificationTypeSound UIRemoteNotificationTypeAlert)]; 2) Une fois la registration auprès d Apple terminé, une des 2 méthodes ci-dessous sera appelée a. Si il n y a pas de problème - (void)application:(uiapplication *)application didregisterforremotenotificationswithdevicetoken:(nsdata *)devicetoken b. En cas d erreur durant la registration -(void) application:(uiapplication *)application didfailtoregisterforremotenotificationswitherror:(nserror *)error Transmission du token au serveur de notification Si la registration est un succès, alors l application envoi le token généré par Apple au serveur de notification via une requête HTTP Post contenant : le nom du device et le token sous forme de chaine de caractère. 4.1.2 Serveur de notification Le serveur n a pas besoin de s enregistrer auprès du serveur d Apple par contre il doit stocker le token ainsi que le nom du fichier envoyé par l appreil. Le stockage de ces propriétés se fait à l aide d un simple fichier texte qui a la structure suivante : token1:nom_de_l appareil1:valeur_du_badge_de_l appareil1 Page 12 sur 14
token2:nom_de_l appareil2:valeur_du_badge_de_l appareil2 Chaque ligne représente donc un device. Ce fichier va aussi être utilisé lors de la notification. Le code php qui s occupe de ceci est le code register_iphone.php 4.2 Notification 4.2.1 Serveur de notification Le serveur de notification doit pour chaque appareil enregistré auprès de lui-même envoyé un message contenant les informations suivantes à Apple. Le token de l appareil Le message à afficher ainsi que le type du message La valeur du badge Le son à jouer lors de la réception de la notification Figure 34 : Format binaire du message Format du payload Le payload est un objet dictionnaire encodé en format JSON(voir référence 2) avec une clé aps obligatoire. C est dans les données de la clé «aps» que sont les propriétés de la notification tels que le message à afficher, le numéro du badge, Toutes les options sont définit dans la documentation pour la Remote Notification d Apple, voir annexe. Voici un exemple d un payload : {"aps": {"alert": {"body":"hi Damien you have a new Quizz!", "action-loc-key":"ok"},"badge":5}} Le code php s occupant de notifier les iphone est le code notify.php. 4.2.2 Client iphone Lorsque l utilisateur lance l application la méthode suivantes est appélé : -(BOOL)application:(UIApplication *)application didfinishlaunchingwithoptions:(nsdictionary*) launchoptions Le contenu du payload envoyé par le serveur de notification est transmit à l application au travers de l objet identifié par la clé «aps» du dictionnaire «launchoptions». ATTENTION celui est disponible seulement si l utilisateur accepte directement la notification (En cliquant sur ok ce qui démarre l application). Dans le cas ou l utilisateur ferme la notification puis démarre plus tard l application, le contenu du payload envoyé par le serveur de notification ne sera plus disponible. Bien sur si l iphone est éteint ou hors couverture, la notification sera transmisse dès que l accès au réseau sera de nouveau disponible. Page 13 sur 14
5 Références [1] Apple Push Notification Service Programming Guide http://developer.apple.com/iphone/library/documentation/networkinginternet/conceptual/remotenotificationsp G/Introduction/Introduction.html [2] JSON http://json.org/json-fr.html [3] PEM Format http://en.wikipedia.org/wiki/x.509 Page 14 sur 14