Construire une application Poke iOS SDK avec APNS - Partie 3

Ce tutoriel est le dernier d'une série en trois parties sur l'utilisation des fonctionnalités de notification push d'iOS 3.0+. Il se concentre sur l'utilisation de certaines des fonctionnalités les plus élaborées du service de notification push (APNS) d'Apple. Cet article repose sur le code que nous avons créé dans les premier et deuxième tutoriels. Assurez-vous donc de les lire en premier si vous ne les avez pas déjà..

Localisation

À la fin du dernier versement, nous avons envoyé notre premier message à notre application. Ce n'était pas quelque chose d'extraordinaire. Juste un simple message d'alerte: "Vous avez été piqué par Tyler." Il ne faut pas un génie pour comprendre que ce message est en anglais, mais que se serait-il passé si nous l'avions envoyé à des millions de personnes utilisant notre application dans le monde entier? Les chances sont, certains d'entre eux n'auraient pas compris ce que nous avons envoyé. C'est là qu'intervient la localisation.

Remarque: pour une explication détaillée de la localisation et de son fonctionnement sur iOS, voir la documentation destinée aux développeurs d'Apple. Je vais supposer que vous comprenez les bases…

Changements à la poussée

Examinez à nouveau la console Test Push Notifications d'Urban Airship:

Vous remarquerez que lorsque vous modifiez le contenu des champs supérieurs, le JSON est mis à jour dans le champ "Données utiles". Vous pouvez également ajuster manuellement le JSON, ce que nous allons faire maintenant..

Voici le JSON d'origine, reformaté pour la lisibilité:

"aps": "alert": "Vous avez été piqué par Tyler", "device_tokens": ["votre jeton de périphérique va ici"]

Le dictionnaire "aps" est une partie obligatoire de toute charge utile JSON APNS. Il dit à iOS quoi faire avec la notification. Actuellement, la clé "alert" a une valeur de chaîne ("Vous avez été poké [...]"), mais APNS autorise également une valeur de dictionnaire pour cette clé. Vous devrez utiliser un dictionnaire si vous souhaitez prendre en charge la localisation..

Pour les alertes, vous pouvez localiser le corps du message ainsi que le nom du bouton d'action qui apparaît sur l'alerte (par défaut, "Affichage"). De plus, vous pouvez soit envoyer le corps du message localisé déjà dans le contenu du message, soit utiliser des chaînes pré-localisées dans votre bundle d'applications. Nous allons faire le dernier.

Mettons à jour la clé "alert" dans le dictionnaire "aps" dans la charge utile avec les champs nécessaires:

"aps": "alert": "loc-key": "PokeMessageFormat", "loc-args": ["Tyler"], "device_tokens": ["votre jeton de périphérique va ici"]

"loc-key" spécifie le nom d'une chaîne dans notre fichier Localizable.strings de notre ensemble d'applications. Tous les spécificateurs de format de notre chaîne de format (PokeMessageFormat) seront remplacés par les chaînes de "loc-args". Alors maintenant, au lieu d’afficher «Vous avez été piqué par Tyler», iOS récupérera la chaîne localisée PokeMessageFormat de notre paquet, insérera Tyler à l’endroit approprié et affichera le message localisé dans l’alerte. Il ne reste plus qu'à mettre à jour notre application pour prendre en charge la localisation..

Changements dans l'application

Ouvrez le projet de l'application dans Xcode. Lorsque "Ressources" est sélectionné dans le volet Groupes et fichiers de gauche, sélectionnez "Nouveau fichier ..." dans le menu Fichier. Dans la section Mac OS X: Resource, sélectionnez "Fichier de chaînes" et cliquez sur "Suivant".

Nommez le fichier Localizable.strings et cliquez sur "Terminer".

Maintenant que le fichier est créé, nous devons le rendre localisable. Sélectionnez le fichier dans le volet Groupes et fichiers à gauche et cliquez sur "Info" dans la barre d’outils (ou Commande-I). Tout en bas de l'onglet Général, il devrait y avoir un bouton intitulé "Rendre le fichier localisable". Cliquez dessus. Fermez ensuite la fenêtre d'information.

Bien que cela puisse sembler une magie vaudou, ce bouton ne fait que créer un dossier English.lproj dans votre répertoire de projet (si nécessaire) et y déplacer le fichier Localizable.strings. Encore une fois, si vous voulez plus d'informations sur le "Pourquoi?" Allez-y, consultez la documentation destinée aux développeurs sur l'internationalisation et la localisation: je vais attendre…

Aucun preneur? OK, passe à autre chose.

Maintenant que notre fichier de chaînes a été créé, nous devons ajouter la chaîne mentionnée précédemment - PokeMessageFormat:

// Localizable.strings "PokeMessageFormat" = "Vous avez été piqué par% @";

Vous remarquerez que notre chaîne ressemble beaucoup à notre message d'origine, mais avec un spécificateur de format à la place du nom. Désormais, lorsque la nouvelle transmission arrivera, iOS saisira notre chaîne de poke localisée, insérera le nom de la personne qui nous pique et affichera l'alerte. Alto! 10 millions d'utilisateurs heureux, juste comme ça.

OK OK, légère simplification excessive. Vous devez toujours ajouter des localisations pour toutes les langues que vous souhaitez prendre en charge. et traduire notre message de poke dans ces langues. Mais les bases sont en place - le reste, je vous laisse comme exercice pour vous, lecteur.

Des sons

Le son est un autre excellent moyen d'informer vos utilisateurs que votre application dispose de nouvelles informations. Cela peut être en plus ou à la place de l'alerte. Si vous envisagez d’ajouter du son à vos messages Push, Apple vous encourage fortement à utiliser des sons de marque, qui peuvent facilement être distingués comme appartenant à votre application. Pensez aux sons de SMS ou d'email par défaut - vous savez sans même chercher ce qu'ils signifient et à quelles applications ils appartiennent. C'est exactement ce que vous voulez qu'il arrive avec vos sons.

Comme indiqué dans le premier versement, les sons doivent être inclus dans votre lot d'applications et doivent être dans l'un des formats suivants:

  • PCM linéaire
  • MA4
  • μLaw
  • une loi

Si votre son n'est pas déjà dans l'un des formats pris en charge, vous devrez utiliser un utilitaire audio pour le convertir. La documentation destinée aux développeurs d’Apple contient des indications sur la conversion de fichiers audio via la ligne de commande..

Après avoir ajouté notre fichier audio au format approprié à notre projet Xcode, nous sommes prêts à mettre à jour à nouveau la charge utile:

"aps": "alert": "loc-key": "PokeMessageFormat", "loc-args": ["Tyler"], "sound": "myAwesomeSound.caf", "device_tokens": [ "votre jeton d'appareil va ici"]

"son" spécifie le nom de notre fichier son personnalisé. Comme indiqué dans la documentation d'Apple:

Si le fichier son n'existe pas ou si la valeur par défaut est spécifiée, le son d'alerte par défaut est joué..

Et avec ces quelques changements simples, nous avons maintenant le son!

Informations utiles supplémentaires

Notre charge de notification push ne se limite pas aux informations spécifiées par Apple. En dehors du dictionnaire "aps" réservé, nous pouvons ajouter tout autre fichier JSON valide à notre charge utile, jusqu'à un maximum de 256 octets. Dans notre application Poke, par exemple, nous pourrions inclure l'identifiant du poke qui a été envoyé, afin que nous puissions afficher plus d'informations à ce sujet si le destinataire choisit de cliquer sur "Afficher" et d'ouvrir l'application:

"aps": "alert": "loc-key": "PokeMessageFormat", "loc-args": ["Tyler"], "sound": "myAwesomeSound.caf", "device_tokens": [ "votre jeton d'appareil va ici"], "poke_id": "1234567890"

Nous recevons le "poke_id" dans le cadre des options de lancement de notre délégué d'application:

// dans l'application PokeAppDelegate.m - (BOOL): (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // S'inscrire pour les notifications d'alerte [application registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert]; // Vérifier les informations de notification push NSDictionary * pushInfo = [launchOptions valueForKey: UIApplicationLaunchOptionsRemoteNotificationKey]; if (pushInfo) // TODO: Extrayez les informations du poke de notre serveur et mettez à jour l'interface utilisateur pour l'afficher NSLog (@ "Voici notre id de poke:% @", [pushInfo valueForKey: @ "poke_id"]);  // Ajoute la vue du contrôleur de vue à la fenêtre et l’affiche. [window addSubview: viewController.view]; [fenêtre makeKeyAndVisible]; retourner OUI;  

Pour rappel, les données utilisateur sensibles doivent jamais être envoyé dans le cadre d'une charge utile de notification push.

Moments de silence

Enfin, il y a une caractéristique du service de poussée d'Urban Airship que j'aimerais montrer: le temps calme. À partir de leurs documents de développement:

Souvent, les utilisateurs finaux ne veulent pas recevoir de notifications push à certains moments, par exemple lorsqu'ils sont endormis. Urban Airship prend en charge la définition d'un "temps mort" via l'API d'enregistrement de périphérique, période pendant laquelle aucune notification push de votre application ne sera transmise à ce jeton de périphérique. Les notifications push contenant une mise à jour du badge seront toujours envoyées pendant la période de repos, mais l'alerte et le son seront supprimés..

Compte tenu de la nature de notre application, je ne pense pas qu'il soit déraisonnable de supposer que certains utilisateurs peuvent ne pas vouloir se faire fourrer à trois heures du matin et laisser notre son de marque bruyant. Alors, allons-y et implémentons rapidement cette fonctionnalité.

Pour ce faire, tout ce que nous avons à faire est de mettre à jour l'appel d'enregistrement de notre application avec Urban Airship. Ici, il est dans sa forme originale:

// dans PokeAppDelegate.m - Application (void): (UIApplication *) application didRegisterForRemoteNotificationsWithDeviceToken: (NSData *) deviceToken // ** Transférer le jeton dans Urban Dirigeable ** // Convertir le jeton en chaîne hexagonale et s'assurer de toutes les majuscules NSMutableString * tokenString = [NSMutableString stringWithString: [[description de deviceToken] uppercaseString]]; [tokenString replaceOccurrencesOfString: @ "" withString: @ "" options: plage 0: NSMakeRange (0, tokenString.length)]; [tokenString replaceOccurrencesOfString: @ "" withString: @ "" options: plage 0: NSMakeRange (0, tokenString.length)]; NSLog (@ "Token:% @", tokenString); // Créez le NSURL pour la requête NSString * urlFormat = @ "https://go.urbanairship.com/api/device_tokens/%@"; NSURL * registrationURL = [NSURL URLWithString: [NSString stringWithFormat: urlFormat, tokenString]]; // Créer la demande d'inscription NSMutableURLRequest * registrationRequest = [[NSMutableURLRequest alloc] initWithURL: registrationURL]; [registrationRequest setHTTPMethod: @ "PUT"]; // Et déclenchez NSURLConnection * connection = [NSURLConnection connectionWithRequest: registrationRequest delegate: self]; [début de la connexion];  

Nous devons passer l'heure de début et de fin, ainsi que le fuseau horaire d'Urban Airship. Voyons avec leurs exemples de valeurs de 22h00 comme heure de début (c'est-à-dire 22h00) et de 8h00 (heure du matin) comme heure de fin. Nous allons récupérer l'id du fuseau horaire actuel de l'utilisateur du système.

// dans PokeAppDelegate.m - Application (void): (UIApplication *) application didRegisterForRemoteNotificationsWithDeviceToken: (NSData *) deviceToken // ** Transférer le jeton dans Urban Dirigeable ** // Convertir le jeton en chaîne hexagonale et s'assurer de toutes les majuscules NSMutableString * tokenString = [NSMutableString stringWithString: [[description de deviceToken] uppercaseString]]; [tokenString replaceOccurrencesOfString: @ "" withString: @ "" options: plage 0: NSMakeRange (0, tokenString.length)]; [tokenString replaceOccurrencesOfString: @ "" withString: @ "" options: plage 0: NSMakeRange (0, tokenString.length)]; NSLog (@ "Token:% @", tokenString); // Créez le NSURL pour la requête NSString * urlFormat = @ "https://go.urbanairship.com/api/device_tokens/%@"; NSURL * registrationURL = [NSURL URLWithString: [NSString stringWithFormat: urlFormat, tokenString]]; // Créer la demande d'inscription NSMutableURLRequest * registrationRequest = [[NSMutableURLRequest alloc] initWithURL: registrationURL]; [registrationRequest setHTTPMethod: @ "PUT"]; // Création du corps de la demande JSON // Remarque: vous ne devez JAMAIS générer JSON manuellement comme ceci… NSString * startTime = @ "22:00"; NSString * endTime = @ "8:00"; NSString * timezoneName = [[NSTimeZone localTimeZone] name]; NSString * body = [NSString stringWithFormat: @ "\" quiettime \ ": \" start \ ": \"% @ \ ", \" end \ ": \"% @ \ "," \ "\" tz \ ": \"% @ \ "", startTime, endTime, timezoneName]; // Ajoutez-le à la demande NSData * bodyData = [body dataUsingEncoding: NSUTF8StringEncoding]; [registrationRequest setHTTPBody: bodyData]; [registrationRequest setValue: [NSString stringWithFormat: @ "% u", [longueur de bodyData]] pourHTTPHeaderField: @ "Content-Length"]; [registrationRequest setValue: @ "application / json" pourHTTPHeaderField: @ "Content-Type"]; // Et c'est parti… NSURLConnection * connection = [NSURLConnection connectionWithRequest: registrationRequest delegate: self]; [début de la connexion];  

Et maintenant, nos utilisateurs ne seront pas tenus éveillés d’un bombardement de 3 heures du matin. coups de coude.

Eh bien, cette série s’achève sur l’utilisation des fonctionnalités de notification push d’iOS 3.0+. J'espère que cela vous a donné un bon aperçu du fonctionnement du service et des étapes de base nécessaires pour commencer à l'exploiter dans votre application. Si vous avez des questions ou êtes bloqué sur quelque chose, faites le moi savoir dans les commentaires.