PassKit dans Xamarin.iOS

L’application Portefeuille iOS permet aux utilisateurs de stocker des passes numériques sur leurs appareils. Ces passes sont générées par les commerçants et envoyées au client par e-mail, URL ou par le biais de la propre application iOS du commerçant. Ces laissez-passer peuvent représenter diverses choses, des billets de cinéma aux cartes de fidélité en passant par les cartes d’embarquement. L’infrastructure PassKit permet aux développeurs d’interagir avec des passes par programmation.

Ce document présente Wallet et l’utilisation de l’API PassKit avec Xamarin.iOS.

Le Portefeuille stocke et organise tous les passes sur un téléphone

Spécifications

Les fonctionnalités PassKit décrites dans ce document nécessitent iOS 6 et Xcode 4.5, ainsi que Xamarin.iOS 6.0.

Introduction

Le problème clé que PassKit résout est la distribution et la gestion des codes-barres. Voici quelques exemples concrets de la façon dont les codes-barres sont actuellement utilisés :

  • Achat de billets de cinéma en ligne : les clients reçoivent généralement par e-mail un code-barres qui représente leurs billets. Ce code-barres est imprimé et conduit au cinéma pour être scanné pour l’entrée.
  • Cartes de fidélité : les clients transportent un certain nombre de cartes spécifiques à un magasin dans leur portefeuille ou leur sac à main, à des fins d’affichage et de numérisation lorsqu’ils achètent des produits.
  • Coupons : les coupons sont distribués par e-mail, sous forme de pages web imprimables, de boîtes aux lettres et de codes-barres dans les journaux et les magazines. Les clients les amènent dans un magasin pour l’analyse, pour recevoir des biens, des services ou des remises en retour.
  • Cartes d’embarquement – Similaire à l’achat d’un billet de cinéma.

PassKit offre une alternative pour chacun de ces scénarios :

  • Tickets de cinéma : après l’achat, le client ajoute un pass de ticket d’événement (par e-mail ou lien vers un site web). À l’approche de l’heure du film, le pass apparaît automatiquement sur l’écran de verrouillage comme rappel, et à l’arrivée au cinéma, le pass est facilement récupéré et affiché dans Wallet pour la numérisation.
  • Cartes de fidélité : au lieu (ou en plus) de fournir un carte physique, les magasins peuvent émettre (par e-mail ou après une connexion au site web) un pass de carte du Store. Le magasin peut fournir des fonctionnalités supplémentaires telles que la mise à jour du solde du compte sur le pass via des notifications Push, et à l’aide des services de géolocalisation, le pass peut apparaître automatiquement sur l’écran de verrouillage lorsque le client se trouve à proximité d’un emplacement de magasin.
  • Coupons : les cartes de coupons peuvent facilement être générées avec des caractéristiques uniques pour faciliter le suivi, et distribuées par e-mail ou des liens de site web. Les coupons téléchargés peuvent apparaître automatiquement sur l’écran de verrouillage lorsque l’utilisateur se trouve à proximité d’un emplacement spécifique et/ou à une date donnée (par exemple, lorsque la date d’expiration approche). Étant donné que les coupons sont stockés sur le téléphone de l’utilisateur, ils sont toujours pratiques et ne sont pas mal placés. Les coupons peuvent encourager les clients à télécharger des applications complémentaires, car App Store liens peuvent être incorporés dans le Pass, ce qui augmente l’engagement avec le client.
  • Cartes d’embarquement : après un processus d’case activée en ligne, le client reçoit sa carte d’embarquement par e-mail ou par lien. Une application complémentaire fournie par le fournisseur de transport peut inclure le processus de case activée et permettre également au client d’effectuer des fonctions supplémentaires telles que le choix de son siège ou de son repas. Le fournisseur de transport peut utiliser des notifications Push pour mettre à jour le passage si le transport est retardé ou annulé. À l’approche de l’heure d’embarquement, le pass apparaît sur l’écran de verrouillage comme rappel et pour fournir un accès rapide au pass.

À la base, PassKit offre un moyen simple et pratique de stocker et d’afficher des codes-barres sur votre appareil iOS. Avec l’intégration supplémentaire de l’écran de verrouillage de temps et d’emplacement, les notifications Push et l’intégration de l’application complémentaire, il offre une base pour des services de vente, de tickets et de facturation très sophistiqués.

PassKit Ecosystem

PassKit n’est pas seulement une API dans CocoaTouch, il fait plutôt partie d’un écosystème plus large d’applications, de données et de services qui facilitent le partage sécurisé et la gestion des codes-barres et d’autres données. Ce diagramme général montre les différentes entités qui peuvent être impliquées dans la création et l’utilisation des passes :

Ce diagramme de haut niveau montre les entités impliquées dans la création et l’utilisation des passes

Chaque élément de l’écosystème a un rôle clairement défini :

  • Wallet : application iOS intégrée d’Apple qui stocke et affiche des passes. Il s’agit du seul endroit où les passes sont rendues pour une utilisation dans le monde réel (c’est-à-dire que le code-barres est affiché, ainsi que toutes les données localisées dans le passage).
  • Applications complémentaires : applications iOS 6 créées par les fournisseurs de passe pour étendre les fonctionnalités des passes qu’ils émettent, telles que l’ajout de valeur à un magasin carte, la modification du siège sur une carte d’embarquement ou une autre fonction spécifique à l’entreprise. Les applications complémentaires ne sont pas nécessaires pour qu’un passage soit utile.
  • Votre serveur : serveur sécurisé où des passes peuvent être générées et signées pour la distribution. Votre application complémentaire peut se connecter à votre serveur pour générer de nouveaux passes ou demander des mises à jour pour les passes existantes. Vous pouvez éventuellement implémenter l’API de service web que Wallet appelle pour mettre à jour des passes.
  • Serveurs APNS : votre serveur a la possibilité d’informer Wallet des mises à jour d’un passage sur un appareil donné à l’aide d’APNS. Envoyez une notification à Wallet, qui contactera ensuite votre serveur pour plus d’informations sur la modification. Les applications complémentaires n’ont pas besoin d’implémenter APNS pour cette fonctionnalité (elles peuvent écouter le PKPassLibraryDidChangeNotification ).
  • Applications de conduite : applications qui ne manipulent pas directement les passes (comme le font les applications complémentaires), mais qui peuvent améliorer leur utilité en reconnaissant les passes et en les autorisant à être ajoutées à Wallet. Les clients de messagerie, les navigateurs de réseaux sociaux et d’autres applications d’agrégation de données peuvent tous rencontrer des pièces jointes ou des liens vers des passes.

L’ensemble de l’écosystème semble complexe. Il est donc important de noter que certains composants sont facultatifs et que des implémentations PassKit beaucoup plus simples sont possibles.

Qu’est-ce qu’un Pass ?

Un pass est une collection de données représentant un ticket, coupon ou carte. Il peut être destiné à une utilisation unique par un individu (et par conséquent contenir des détails tels qu’un numéro de vol et l’allocation de sièges) ou il peut être un jeton à usage multiple qui peut être partagé par n’importe quel nombre d’utilisateurs (par exemple, une remise coupon). Une description détaillée est disponible dans le document About Pass Files d’Apple.

Types

Actuellement cinq types pris en charge, qui peuvent être distingués dans l’application Portefeuille par la disposition et le bord supérieur de la passe :

  • Ticket d’événement : petit découpage semi-circulaire.
  • Carte d’embarquement : encoches latérales, icône spécifique au transport peut être spécifiée (par exemple, bus, train, avion).
  • Carte store : arrondi en haut, comme un carte de crédit ou de débit.
  • Coupon : perforé le long du haut.
  • Générique : identique à la carte Store, arrondi en haut.

Les cinq types de passes sont présentés dans cette capture d’écran (dans l’ordre : coupon, générique, carte de magasin, carte d’embarquement et ticket d’événement) :

Les cinq types de passes sont présentés dans cette capture d’écran

Structure des fichiers

Un fichier de passe est en fait une archive ZIP avec une extension .pkpass , contenant des fichiers JSON spécifiques (obligatoires), divers fichiers image (facultatifs) ainsi que des chaînes localisées (également facultatives).

  • pass.json : obligatoire. Contient toutes les informations relatives au passage.
  • manifest.json : obligatoire. Contient des hachages SHA1 pour chaque fichier du passage, à l’exception du fichier de signature et de ce fichier (manifest.json).
  • signature : obligatoire. Créé en signant le manifest.json fichier avec le certificat généré dans le portail d’approvisionnement iOS.
  • logo.png : facultatif.
  • background.png : facultatif.
  • icon.png : facultatif.
  • Fichiers de chaînes localisables : facultatif.

La structure de répertoire d’un fichier de passe est illustrée ci-dessous (il s’agit du contenu de l’archive ZIP) :

La structure de répertoires d’un fichier de passe est illustrée ici

pass.json

JSON est le format, car les passes sont généralement créées sur un serveur. Cela signifie que le code de génération est indépendant de la plateforme sur le serveur. Les trois informations clés de chaque passage sont les suivantes :

  • teamIdentifier : ce lien lie tous les passes que vous générez à votre compte App Store. Cette valeur est visible dans le portail d’approvisionnement iOS.
  • passTypeIdentifier : inscrivez-vous dans le portail d’approvisionnement pour regrouper les passes (si vous produisez plusieurs types). Par exemple, un café peut créer un magasin carte type de passe pour permettre à ses clients d’obtenir des crédits de fidélité, mais également un type de passe coupon distinct pour créer et distribuer des coupons de remise. Ce même café peut même organiser des événements de musique en direct et émettre des laissez-passer événement pour ceux-ci.
  • serialNumber : chaîne unique dans ce passTypeidentifier . La valeur est opaque pour Wallet, mais elle est importante pour le suivi de passes spécifiques lors de la communication avec votre serveur.

Chaque pass comporte un grand nombre d’autres clés JSON, dont un exemple est illustré ci-dessous :

{
   "passTypeIdentifier":"com.xamarin.passkitdoc.banana",  //Type Identifier (iOS Provisioning Portal)
   "formatVersion":1,                                     //Always 1 (for now)
   "organizationName":"Xamarin",                          //The name which appears on push notifications
   "serialNumber":"12345436XYZ",                          //A number for you to identify this pass
   "teamIdentifier":"XXXAAA1234",                         //Your Team ID
   "description":"Xamarin Demo",                          //
   "foregroundColor":"rgb(54,80,255)",                    //color of the data text (note the syntax)
   "backgroundColor":"rgb(209,255,247)",                  //color of the background
   "labelColor":"rgb(255,15,15)",                         //color of label text and icons
   "logoText":"Banana ",                                  //Text that appears next to logo on top
   "barcode":{                                            //Specification of the barcode (optional)
      "format":"PKBarcodeFormatQR",                       //Format can be QR, Text, Aztec, PDF417
      "message":"FREE-BANANA",                            //What to encode in barcode
      "messageEncoding":"iso-8859-1"                      //Encoding of the message
   },
   "relevantDate":"2012-09-15T15:15Z",                    //When to show pass on screen. ISO8601 formatted.
  /* The following fields are specific to which type of pass. The name of this object specifies the type, e.g., boardingPass below implies this is a boarding pass. Other options include storeCard, generic, coupon, and eventTicket */
   "boardingPass":{
/*headerFields, primaryFields, secondaryFields, and auxiliaryFields are arrays of field object. Each field has a key, label, and value*/
      "headerFields":[          //Header fields appear next to logoText
         {
            "key":"h1-label",   //Must be unique. Used by iOS apps to get the data.
            "label":"H1-label", //Label of the field
            "value":"H1"        //The actual data in the field
         },
         {
            "key":"h2-label",
            "label":"H2-label",
            "value":"H2"
         }
      ],
      "primaryFields":[       //Appearance differs based on pass type
         {
            "key":"p1-label",
            "label":"P1-label",
            "value":"P1"
         }
      ],
      "secondaryFields":[     //Typically appear below primaryFields
         {
            "key":"s1-label",
            "label":"S1-label",
            "value":"S1"
         }
      ],
      "auxiliaryFields":[    //Appear below secondary fields
         {
            "key":"a1-label",
            "label":"A1-label",
            "value":"A1"
         }
      ],
      "transitType":"PKTransitTypeAir"  //Only present in boradingPass type. Value can
                                        //Air, Bus, Boat, or Train. Impacts the picture
                                        //that shows in the middle of the pass.
   }
}

Codes-barres

Seuls les formats 2D sont pris en charge : PDF417, Aztèque, QR. Apple affirme que les codes-barres 1D ne sont pas adaptés à la numérisation sur un écran de téléphone rétro-éclairé.

Le texte de remplacement affiché sous le code-barres est facultatif . Certains commerçants souhaitent pouvoir lire/taper manuellement.

L’encodage ISO-8859-1 est le plus courant, case activée l’encodage utilisé par les systèmes d’analyse qui liront vos passes.

Pertinence (écran de verrouillage)

Il existe deux types de données qui peuvent entraîner l’affichage d’une passe sur l’écran de verrouillage :

Lieu

Jusqu’à 10 emplacements peuvent être spécifiés dans un Pass, par exemple les magasins qu’un client visite fréquemment, ou l’emplacement d’un cinéma ou d’un aéroport. Un client peut définir ces emplacements via une application complémentaire ou le fournisseur peut les déterminer à partir des données d’utilisation (si elles sont collectées avec l’autorisation du client).

Lorsque la passe s’affiche sur l’écran de verrouillage, une clôture est calculée de sorte que lorsque l’utilisateur quitte la zone, la passe est masquée de l’écran de verrouillage. Le rayon est lié au style de passe pour éviter les abus.

Date et heure

Une seule date/heure peut être spécifiée dans un pass. La date et l’heure sont utiles pour déclencher des rappels d’écran de verrouillage pour les cartes d’embarquement et les tickets d’événement.

Peut être mis à jour via push ou via l’API PassKit, afin que la date/heure puisse être mise à jour dans le cas d’un ticket à usage multiple (par exemple, un abonnement pour un théâtre ou un complexe sportif).

Localisation

La traduction d’une passe en plusieurs langues est similaire à la localisation d’une application iOS : créez des répertoires spécifiques à la langue avec l’extension .lproj et placez les éléments localisés à l’intérieur. Les traductions de texte doivent être entrées dans un pass.strings fichier, tandis que les images localisées doivent avoir le même nom que l’image qu’elles remplacent à la racine pass.

Sécurité

Les passes sont signées avec un certificat privé que vous générez dans le portail d’approvisionnement iOS. Les étapes pour signer le pass sont les suivantes :

  1. Calculez un hachage SHA1 pour chaque fichier dans le répertoire de passe (n’incluez pas le manifest.json fichier ou signature , de toute façon, aucun de ces fichiers ne doit exister à ce stade).
  2. Écrivez manifest.json sous la forme d’une liste de clés/valeurs JSON de chaque nom de fichier avec son hachage.
  3. Utilisez le certificat pour signer le manifest.json fichier et écrire le résultat dans un fichier appelé signature .
  4. Compressez tout et donnez au fichier résultant une .pkpass extension de fichier.

Étant donné que votre clé privée est requise pour signer la passe, ce processus ne doit être effectué que sur un serveur sécurisé que vous contrôlez. NE DISTRIBUEZ PAS vos clés pour essayer de générer des passes dans une application.

Configuration et installation

Cette section contient des instructions pour vous aider à configurer vos détails d’approvisionnement et à créer votre première passe.

Provisionnement de PassKit

Pour qu’une passe entre dans le App Store, elle doit être liée à un compte de développeur. Cela nécessite deux étapes :

  1. Le pass doit être inscrit à l’aide d’un identificateur unique, appelé ID de type de réussite.
  2. Un certificat valide doit être généré pour signer le pass avec la signature numérique du développeur.

Pour créer un ID de type de passe, procédez comme suit.

Créer un ID de type de passe

La première étape consiste à configurer un ID de type de passe pour chaque type de passe à prendre en charge. L’ID de passe (ou identificateur de type de passe) crée un identificateur unique pour le pass. Nous utiliserons cet ID pour lier le pass à votre compte de développeur à l’aide d’un certificat.

  1. Dans la section Certificats, identificateurs et profils du portail d’approvisionnement iOS, accédez à Identificateurs et sélectionnez Passer des ID de type . Sélectionnez ensuite le + bouton pour créer un nouveau type de passe : Créer un nouveau type de passe

  2. Fournissez une description (nom) et un identificateur (chaîne unique) pour le pass. Notez que tous les ID de type de passe doivent commencer par la chaîne pass. Dans cet exemple, nous utilisons pass.com.xamarin.coupon.banana : Fournir une description et un identificateur

  3. Confirmez l’ID de passage en appuyant sur le bouton Inscrire .

Générer un certificat

Pour créer un certificat pour cet ID de type de passe, procédez comme suit :

  1. Sélectionnez l’ID de passe nouvellement créé dans la liste, puis cliquez sur Modifier : Sélectionnez le nouvel ID de passe dans la liste.

    Ensuite, sélectionnez Créer un certificat... :

    Sélectionnez Créer un certificat.

  2. Suivez les étapes pour créer une demande de signature de certificat (CSR).

  3. Appuyez sur le bouton Continuer sur le portail des développeurs et chargez le CSR pour générer votre certificat.

  4. Téléchargez le certificat et double-cliquez dessus pour l’installer dans votre keychain.

Maintenant que nous avons créé un certificat pour cet ID de type de passe, la section suivante décrit comment générer un pass manuellement.

Pour plus d’informations sur l’approvisionnement pour Wallet, reportez-vous au guide Utilisation des fonctionnalités .

Créer un pass manuellement

Maintenant que nous avons créé le type de réussite, nous pouvons créer manuellement une passe à tester sur le simulateur ou sur un appareil. Les étapes de création d’une passe sont les suivantes :

  • Créez un répertoire pour contenir les fichiers de passe.
  • Créez un fichier pass.json qui contient toutes les données requises.
  • Incluez des images dans le dossier (si nécessaire).
  • Calculez les hachages SHA1 pour chaque fichier du dossier et écrivez dans manifest.json.
  • Signez manifest.json avec le fichier .p12 de certificat téléchargé.
  • Compressez le contenu du répertoire et renommez avec l’extension .pkpass.

L’exemple de code de cet article contient certains fichiers sources qui peuvent être utilisés pour générer un passage. Utilisez les fichiers dans le CouponBanana.raw répertoire du répertoire CreateAPassManually. Les fichiers suivants sont présents :

Ces fichiers sont présents

Ouvrez pass.json et modifiez le JSON. Vous devez au moins mettre à jour le passTypeIdentifier et teamIdentifer pour qu’il corresponde à votre compte de développeur Apple.

"passTypeIdentifier" : "pass.com.xamarin.coupon.banana",
"teamIdentifier" : "?????????",

Vous devez ensuite calculer les hachages pour chaque fichier et créer le manifest.json fichier. Cela ressemblera à ceci lorsque vous avez terminé :

{
  "icon@2x.png" : "30806547dcc6ee084a90210e2dc042d5d7d92a41",
  "icon.png" : "87e9ffb203beb2cce5de76113f8e9503aeab6ecc",
  "pass.json" : "c83cd1441c17ecc6c5911bae530d54500f57d9eb",
  "logo.png" : "b3cd8a488b0674ef4e7d941d5edbb4b5b0e6823f",
  "logo@2x.png" : "3ccd214765507f9eab7244acc54cc4ac733baf87"
}

Ensuite, une signature doit être générée pour ce fichier à l’aide du certificat (fichier .p12) qui a été généré pour cet ID de type de passe.

Connexion sur un Mac

Téléchargez les supports de support de portefeuille à partir du site Apple Downloads . Utilisez l’outil signpass pour transformer votre dossier en passe (cela calculera également les hachages SHA1 et zippera la sortie dans un fichier .pkpass).

Test

Si vous examinez la sortie de ces outils (en définissant le nom du fichier sur .zip, puis en l’ouvrant), les fichiers suivants s’affichent (notez l’ajout des manifest.json fichiers et signature ) :

Examen de la sortie de ces outils

Une fois que vous avez signé, ZIPped et renommé le fichier (par exemple, à BananaCoupon.pkpass) vous pouvez le faire glisser dans le simulateur pour le tester, ou l’envoyer par e-mail à vous-même pour le récupérer sur un appareil réel. Vous devriez voir un écran pour ajouter la passe, comme suit :

Ajouter l’écran de passage

Normalement, ce processus est automatisé sur un serveur, mais la création manuelle de passe peut être une option pour les petites entreprises qui créent uniquement des coupons qui ne nécessitent pas la prise en charge d’un serveur principal.

Portefeuille

Wallet est la pièce centrale de l’écosystème PassKit. Cette capture d’écran montre le portefeuille vide et l’apparence de la liste de passes et des passes individuelles :

Cette capture d’écran montre le portefeuille vide et l’apparence de la liste de passes et des passes individuelles

Les fonctionnalités de Wallet sont les suivantes :

  • C’est le seul endroit où les passes sont rendues avec leur code-barres pour la numérisation.
  • L’utilisateur peut modifier les paramètres des mises à jour. Si cette option est activée, les notifications Push peuvent déclencher des mises à jour des données dans le Pass.
  • L’utilisateur peut activer ou désactiver l’intégration de l’écran de verrouillage. Si cette option est activée, cela permet au pass d’apparaître automatiquement sur son écran de verrouillage, en fonction des données d’heure et d’emplacement pertinentes incorporées dans la passe.
  • Le côté inverse du passage prend en charge l’extraction vers l’actualisation, si une URL de serveur web est fournie dans le json de passage.
  • Les applications complémentaires peuvent être ouvertes (ou téléchargées) si l’ID de l’application est fourni dans le json de passe.
  • Les passes peuvent être supprimées (avec une animation de déchiquetage mignonne).

Ajout de passes à Wallet

Les passes peuvent être ajoutées à Wallet des manières suivantes :

  • Applications conduit : celles-ci ne manipulent pas directement les passes, elles chargent simplement les fichiers de passe et présentent à l’utilisateur la possibilité de les ajouter à Wallet.

  • Applications complémentaires : elles sont écrites par des fournisseurs pour distribuer des laissez-passer et offrir des fonctionnalités supplémentaires pour les parcourir ou les modifier. Les applications Xamarin.iOS ont un accès complet à l’API PassKit pour créer et manipuler des passes. Les passes peuvent ensuite être ajoutées à Wallet à l’aide de PKAddPassesViewController. Ce processus est décrit plus en détail dans la section Applications complémentaires de ce document.

Conduit Applications

Les applications de conduit sont des applications intermédiaires qui peuvent recevoir des laissez-passer pour le compte d’un utilisateur et doivent être programmées pour reconnaître leur type de contenu et fournir des fonctionnalités à ajouter au portefeuille. Voici quelques exemples d’applications de conduit :

  • Courrier : reconnaît la pièce jointe en tant que pass.
  • Safari : reconnaît le type de contenu de passage lorsqu’un lien d’URL de passage est cliqué.
  • Autres applications personnalisées : toutes les applications qui reçoivent des pièces jointes ou des liens ouverts (clients de réseaux sociaux, lecteurs de courrier, etc.).

Cette capture d’écran montre comment Mail dans iOS 6 reconnaît une pièce jointe de passe et (lorsqu’on y touche) propose de l’ajouter à Wallet.

Cette capture d’écran montre comment Courrier dans iOS 6 reconnaît une pièce jointe de passe

Cette capture d’écran montre comment Mail propose d’ajouter une pièce jointe de passe à Wallet

Si vous créez une application qui peut être un canal pour les passes, elles peuvent être reconnues par :

  • Extension de fichier - .pkpass
  • Type MIME - application/vnd.apple.pkpass
  • UTI – com.apple.pkpass

L’opération de base d’une application de transmission consiste à récupérer le fichier de passage et à appeler PassKit’s PKAddPassesViewController pour donner à l’utilisateur la possibilité d’ajouter le pass à son portefeuille. L’implémentation de ce contrôleur de vue est abordée dans la section suivante sur Applications complémentaires.

Les applications de conduit n’ont pas besoin d’être configurées pour un ID de type de passe spécifique de la même façon que les applications complémentaires.

Applications complémentaires

Une application complémentaire fournit des fonctionnalités supplémentaires pour l’utilisation des passes, notamment la création d’un pass, la mise à jour des informations associées à un pass et la gestion des passes associées à l’application.

Les applications complémentaires ne doivent pas tenter de dupliquer les fonctionnalités de Wallet. Ils ne sont pas destinés à afficher des passes pour l’analyse.

Ce reste de cette section explique comment créer une application complémentaire de base qui interagit avec PassKit.

Approvisionnement

Étant donné que Portefeuille est une technologie de magasin, l’application doit être provisionnée séparément et ne peut pas utiliser le profil d’approvisionnement d’équipe ou l’ID d’application générique. Reportez-vous au guide Utilisation des fonctionnalités pour créer un ID d’application et un profil d’approvisionnement uniques pour l’application Wallet.

Droits

Le fichier Entitlements.plist doit être inclus dans tous les projets Xamarin.iOS récents. Pour ajouter un nouveau fichier Entitlements.plist, suivez les étapes du guide Utilisation des droits .

Pour définir des droits, procédez comme suit :

Double-cliquez sur le fichier Entitlements.plist dans le volet solution pour ouvrir l’éditeur Entitlements.plist :

Éditeur Entitlements.plst

Sous la section Portefeuille, sélectionnez l’option Activer le portefeuille

Activer les droits de portefeuille

L’option par défaut permet à votre application d’autoriser tous les types de passes. Toutefois, il est possible de restreindre votre application et d’autoriser uniquement un sous-ensemble de types de passes d’équipe. Pour activer cette option, sélectionnez le sous-ensemble Autoriser les types de passes d’équipe et entrez l’identificateur de type de passe du sous-ensemble que vous souhaitez autoriser.

Débogage

Si vous rencontrez des problèmes lors du déploiement de votre application, case activée que vous utilisez le profil d’approvisionnement correct et que le Entitlements.plist est sélectionné comme fichier de droits personnalisés dans les options de signature de bundle iPhone.

Si vous rencontrez cette erreur lors du déploiement :

Installation failed: Your code signing/provisioning profiles are not correctly configured (error: 0xe8008016)

ensuite, le pass-type-identifiers tableau des droits est incorrect (ou ne correspond pas au profil d’approvisionnement). Vérifiez que les ID de type de réussite et votre ID d’équipe sont corrects.

Classes

Les classes PassKit suivantes sont disponibles pour que les applications accèdent aux passes :

  • PKPass : instance d’un pass.
  • PKPassLibrary : fournit l’API pour accéder aux passes sur l’appareil.
  • PKAddPassesViewController : permet d’afficher une passe que l’utilisateur peut enregistrer dans son portefeuille.
  • PKAddPassesViewControllerDelegate – Développeurs Xamarin.iOS

Exemple

Reportez-vous au projet PassLibrary dans l’exemple de code de cet article. Il illustre les fonctions courantes suivantes qui seraient requises dans une application complémentaire wallet :

Vérifier que Portefeuille est disponible

Wallet n’étant pas disponible sur l’iPad, les applications doivent case activée avant d’essayer d’accéder aux fonctionnalités PassKit.

if (PKPassLibrary.IsAvailable) {
    // create an instance and do stuff...
}

Création d’une instance de bibliothèque pass

La bibliothèque PassKit n’est pas un singleton. Les applications doivent créer et stocker et instance pour accéder à l’API PassKit.

if (PKPassLibrary.IsAvailable) {
    library = new PKPassLibrary ();
    // do stuff...
}

Obtenir une liste de passes

Les applications peuvent demander une liste de passes à partir de la bibliothèque. Cette liste est automatiquement filtrée par PassKit, afin que vous puissiez voir uniquement les passes qui ont été créées avec votre ID d’équipe et qui sont répertoriées dans vos droits.

var passes = library.GetPasses ();  // returns PKPass[]

Notez que le simulateur ne filtre pas la liste des passes retournées. Cette méthode doit donc toujours être testée sur des appareils réels. Cette liste peut être affichée dans un UITableView. L’exemple d’application ressemble à ceci après l’ajout de deux coupons :

L’exemple d’application ressemble à ceci après l’ajout de deux coupons

Affichage des passes

Un ensemble limité d’informations est disponible pour le rendu des passes dans les applications complémentaires.

Choisissez parmi cet ensemble de propriétés standard pour afficher des listes de passes, comme le fait l’exemple de code.

string passInfo =
                "Desc:" + pass.LocalizedDescription
                + "\nOrg:" + pass.OrganizationName
                + "\nID:" + pass.PassTypeIdentifier
                + "\nDate:" + pass.RelevantDate
                + "\nWSUrl:" + pass.WebServiceUrl
                + "\n#" + pass.SerialNumber
                + "\nPassUrl:" + pass.PassUrl;

Cette chaîne s’affiche sous forme d’alerte dans l’exemple :

Alerte Coupon sélectionné dans l’exemple

Vous pouvez également utiliser la méthode pour récupérer des LocalizedValueForFieldKey() données à partir de champs dans les passes que vous avez conçues (car vous saurez quels champs doivent être présents). L’exemple de code ne l’affiche pas.

Chargement d’une passe à partir d’un fichier

Étant donné qu’une passe ne peut être ajoutée à Wallet qu’avec l’autorisation de l’utilisateur, un contrôleur d’affichage doit être présenté pour lui permettre de décider. Ce code est utilisé dans le bouton Ajouter de l’exemple pour charger une passe prédéfinie incorporée dans l’application (vous devez le remplacer par celle que vous avez signée) :

NSData nsdata;
using ( FileStream oStream = File.Open (newFilePath, FileMode.Open ) ) {
        nsdata = NSData.FromStream ( oStream );
}
var err = new NSError(new NSString("42"), -42);
var newPass = new PKPass(nsdata,out err);
var pkapvc = new PKAddPassesViewController(newPass);
NavigationController.PresentModalViewController (pkapvc, true);

Le pass est présenté avec les options Ajouter et Annuler :

Pass présenté avec les options Ajouter et Annuler

Remplacer un pass existant

Le remplacement d’un pass existant ne nécessite pas l’autorisation de l’utilisateur, mais il échouera si le pass n’existe pas déjà.

if (library.Contains (newPass)) {
     library.Replace (newPass);
}

Modification d’un pass

PKPass n’est pas mutable. Vous ne pouvez donc pas mettre à jour les objets de passe dans votre code. Pour modifier les données d’un passage, une application doit avoir accès à un serveur web qui peut conserver un enregistrement des passes et générer un nouveau fichier de passe avec des valeurs mises à jour que l’application peut télécharger.

La création du fichier de passe doit être effectuée sur un serveur, car les passes doivent être signées avec un certificat qui doit être conservé privé et sécurisé.

Une fois qu’un fichier de passe mis à jour a été généré, utilisez la Replace méthode pour remplacer les anciennes données sur l’appareil.

Afficher un pass pour l’analyse

Comme indiqué précédemment, seul Wallet peut afficher une passe pour l’analyse. Un pass peut être affiché à l’aide de la OpenUrl méthode comme indiqué :

UIApplication.SharedApplication.OpenUrl (p.PassUrl);

Réception de notifications de modifications

Les applications peuvent écouter les modifications apportées à la bibliothèque de pass à l’aide de PKPassLibraryDidChangeNotification. Les modifications peuvent être provoquées par des notifications déclenchant des mises à jour en arrière-plan. Il est donc recommandé de les écouter dans votre application.

noteCenter = NSNotificationCenter.DefaultCenter.AddObserver (PKPassLibrary.DidChangeNotification, (not) => {
    BeginInvokeOnMainThread (() => {
        new UIAlertView("Pass Library Changed", "Notification Received", null, "OK", null).Show();
        // refresh the list
        var passlist = library.GetPasses ();
        table.Source = new TableSource (passlist, library);
        table.ReloadData ();
    });
}, library);  // IMPORTANT: must pass the library in

Il est important de passer une bibliothèque instance lors de l’inscription à la notification, car PKPassLibrary n’est pas un singleton.

Traitement du serveur

Une discussion détaillée sur la création d’une application serveur pour prendre en charge PassKit dépasse le cadre de cet article d’introduction.

Consultez dotnet-passbook open source code côté serveur C#.

Notifications Push

Une présentation détaillée de l’utilisation des notifications Push pour mettre à jour les passes dépasse la portée de cet article introductif.

Vous devez implémenter l’API de type REST définie par Apple pour répondre aux demandes web de Wallet lorsque des mises à jour sont requises.

Pour plus d’informations, consultez le guide De mise à jour d’un pass d’Apple.

Résumé

Cet article a présenté PassKit, décrit certaines des raisons pour lesquelles il est utile et décrit les différentes parties qui doivent être implémentées pour une solution PassKit complète. Il décrit les étapes requises pour configurer votre compte de développeur Apple afin de créer des passes, le processus permettant de passer manuellement et également comment accéder aux API PassKit à partir d’une application Xamarin.iOS.