PassKit en Xamarin.iOS

La aplicación Wallet de iOS permite a los usuarios almacenar pases digitales en sus dispositivos. Estos pases los generan los comerciantes y se envían al cliente por correo electrónico, direcciones URL o a través de la propia aplicación iOS del comerciante. Estos pases pueden representar varias cosas, desde entradas de películas hasta tarjetas de fidelización hasta tarjetas de incorporación. El marco PassKit permite a los desarrolladores interactuar con los pases mediante programación.

En este documento se presenta Wallet y se usa passkit API con Xamarin.iOS.

Wallet almacena y organiza todos los pases en un teléfono.

Requisitos

Las características de PassKit analizadas en este documento requieren iOS 6 y Xcode 4.5, junto con Xamarin.iOS 6.0.

Introducción

El problema clave que resuelve PassKit es la distribución y administración de códigos de barras. Algunos ejemplos reales de cómo se usan actualmente los códigos de barras son:

  • Comprar entradas de películas en línea: normalmente se envía a los clientes un código de barras que representa sus entradas por correo electrónico. Este código de barras se imprime y se le traslada al cine para que lo digitalizarán para su entrada.
  • Tarjetas de fidelidad: los clientes llevan una serie de tarjetas específicas de la tienda diferentes en su cartera o cartera, para mostrar y examinar cuando compran bienes.
  • Cupones: los cupones se distribuyen por correo electrónico, como páginas web imprimibles, a través de cuadros de letras y como códigos de barras en periódicos y revistas. Los clientes los llevan a una tienda para su examen, para recibir bienes, servicios o descuentos a cambio.
  • Pases de incorporación: es similar a comprar una entrada de película.

PassKit ofrece una alternativa para cada uno de estos escenarios:

  • Entradas de películas: después de la compra, el cliente agrega un pase de vale de evento (por correo electrónico o un vínculo a un sitio web). A medida que se aproxima la hora de la película, el pase aparecerá automáticamente en la pantalla de bloqueo como un recordatorio y, al llegar a la sala, el pase se recupera y se muestra fácilmente en Wallet para su examen.
  • Tarjetas de fidelidad: en lugar de (o además de) proporcionar una tarjeta física, las tiendas pueden emitir (por correo electrónico o después de un inicio de sesión del sitio web) un pase de tarjeta de la tienda. La tienda puede proporcionar características adicionales, como la actualización del saldo de la cuenta en el paso mediante notificaciones push y el uso de servicios de geolocalización, el paso podría aparecer automáticamente en la pantalla de bloqueo cuando el cliente está cerca de una ubicación de la tienda.
  • Cupones: los pases de cupón se pueden generar fácilmente con características únicas para ayudar con el seguimiento y distribuirse a través de vínculos de correo electrónico o sitio web. Los cupones descargados pueden aparecer automáticamente en la pantalla de bloqueo cuando el usuario está cerca de una ubicación específica o en una fecha determinada (por ejemplo, cuando se aproxima la fecha de expiración). Dado que los cupones se almacenan en el teléfono del usuario, siempre son útiles y no se extravian. Los cupones pueden animar a los clientes a descargar aplicaciones complementarias porque App Store pueden incorporarse vínculos al pass, lo que aumenta la interacción con el cliente.
  • Pases de incorporación: después de un proceso de registro en línea, el cliente recibiría su tarjeta de incorporación por correo electrónico o un vínculo. Una aplicación complementaria proporcionada por el proveedor de transporte podría incluir el proceso de registro y también permitir al cliente realizar funciones adicionales, como elegir su puesto o comida. El proveedor de transporte puede usar notificaciones push para actualizar el paso si el transporte se retrasa o se cancela. A medida que se aproxima el tiempo de incorporación, el pase aparecerá en la pantalla de bloqueo como recordatorio y para proporcionar acceso rápido al pase.

En esencia, PassKit proporciona una manera sencilla y cómoda de almacenar y mostrar códigos de barras en el dispositivo iOS. Con la integración de la pantalla de bloqueo de tiempo y ubicación adicionales, las notificaciones push y la integración de aplicaciones complementarias ofrecen una base para servicios de ventas, vales y facturación muy sofisticados.

Ecosistema de PassKit

PassKit no es solo una API dentro de CocoaTouch, sino que forma parte de un ecosistema mayor de aplicaciones, datos y servicios que facilitan el uso compartido seguro y la administración de códigos de barras y otros datos. En este diagrama de alto nivel se muestran las distintas entidades que pueden estar implicadas en la creación y el uso de pases:

En este diagrama de alto nivel se muestran las entidades implicadas en la creación y el uso de pases

Cada parte del ecosistema tiene un rol claramente definido:

  • Wallet: aplicación de iOS integrada de Apple que almacena y muestra los pases. Este es el único lugar en el que se representan los pases para su uso en el mundo real (es decir, se muestra el código de barras, junto con todos los datos localizados en el paso).
  • Aplicaciones complementarias: aplicaciones iOS 6 creadas por proveedores de pases para ampliar la funcionalidad de los pases que emiten, como agregar valor a una tarjeta de la tienda, cambiar el puesto en una tarjeta de incorporación u otra función específica de la empresa. Las aplicaciones complementarias no son necesarias para que un paso sea útil.
  • Su servidor: un servidor seguro donde se pueden generar y firmar los pases para su distribución. La aplicación complementaria puede conectarse al servidor para generar nuevos pases o solicitar actualizaciones a los pases existentes. Opcionalmente, puede implementar la API del servicio web a la que Wallet llamaría para actualizar los pases.
  • Servidores de APNS: el servidor tiene la capacidad de notificar a Wallet las actualizaciones de un paso en un dispositivo determinado mediante APNS. Envía una notificación a Wallet, que se pondrá en contacto con el servidor para obtener detalles del cambio. Las aplicaciones complementarias no necesitan implementar APNS para esta característica (pueden escuchar a PKPassLibraryDidChangeNotification ).
  • Aplicaciones de conduit: aplicaciones que no manipulan directamente los pases (como lo hacen las aplicaciones complementarias), pero que pueden mejorar su utilidad al reconocer los pases y permitirles agregarlos a Wallet. Los clientes de correo, los exploradores de redes sociales y otras aplicaciones de agregación de datos pueden encontrar datos adjuntos o vínculos a pases.

Todo el ecosistema parece complejo, por lo que merece la pena tener en cuenta que algunos componentes son opcionales y son posibles implementaciones de PassKit mucho más sencillas.

¿Qué es un paso?

Un pase es una colección de datos que representan un vale, cupón o tarjeta. Puede estar pensado para un único uso por parte de un individuo (y, por tanto, contener detalles como un número de vuelo y la asignación de puestos) o puede ser un token de uso múltiple que pueda compartir cualquier número de usuarios (por ejemplo, un cupón de descuento). Hay una descripción detallada disponible en el documento Acerca de los archivos de paso de Apple.

Tipos

Actualmente hay cinco tipos admitidos, que se pueden distinguir en la aplicación Wallet por el diseño y el borde superior del paso:

  • Vale de evento: pequeño corte semicircular.
  • Pase de incorporación: se puede especificar un icono lateral específico del transporte (por ejemplo, bus, train, aircraft).
  • Tarjeta de tienda: la parte superior redondeada, como una tarjeta de crédito o débito.
  • Cupón: en la parte superior.
  • Genérico: igual que Store Card, redondeado arriba.

Los cinco tipos de pase se muestran en esta captura de pantalla (en orden: cupón, genérico, tarjeta de tienda, tarjeta de incorporación y vale de evento):

Los cinco tipos de paso se muestran en esta captura de pantalla

Estructura de archivos

Un archivo de paso es realmente un archivo ZIP con una extensión .pkpass, que contiene algunos archivos JSON específicos (obligatorios), una variedad de archivos de imagen (opcionales), así como cadenas localizadas (también opcionales).

  • pass.json: obligatorio. Contiene toda la información del paso.
  • manifest.json: obligatorio. Contiene hash SHA1 para cada archivo del paso, excepto el archivo de firma y este archivo (manifest.json).
  • signature: requerido. Se crea firmando manifest.json el archivo con el certificado generado en el portal de aprovisionamiento de iOS.
  • logo.png: opcional.
  • background.png: opcional.
  • icon.png: opcional.
  • Archivos de cadenas localizables: opcional.

A continuación se muestra la estructura de directorios de un archivo de paso (este es el contenido del archivo ZIP):

Aquí se muestra la estructura de directorios de un archivo de paso

pass.json

JSON es el formato porque los pases se crean normalmente en un servidor, lo que significa que el código de generación es independiente de la plataforma en el servidor. Las tres partes clave de información de cada paso son:

  • teamIdentifier: vincula todos los pases que se generan a App Store cuenta. Este valor es visible en el portal de aprovisionamiento de iOS.
  • passTypeIdentifier: regístrese en el portal de aprovisionamiento para agrupar los pases (si genera más de un tipo). Por ejemplo, una cafetería podría crear un tipo de pase de tarjeta de tienda para permitir que sus clientes obtengan créditos de fidelidad, pero también un tipo de pase de cupón independiente para crear y distribuir cupones de descuento. Esa misma cafetería puede incluso contener eventos de música en directo y emitir pases de vale de evento para ellos.
  • serialNumber: una cadena única dentro de este . El valor es opaco para Wallet, pero es importante para realizar el seguimiento de pases específicos al comunicarse con el servidor.

Hay un gran número de otras claves JSON en cada paso, un ejemplo del cual se muestra a continuación:

{
   "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.
   }
}

Códigos de barras

Solo se admiten formatos 2D: PDF417, Aztec, QR. Apple afirma que los códigos de barras 1D no son adecuados para el examen en una pantalla de teléfono de contraluz.

El texto alternativo que se muestra debajo del código de barras es opcional: algunos comerciantes quieren poder leer o escribir manualmente.

La codificación ISO-8859-1 es la más común, compruebe qué codificación usan los sistemas de examen que leerán los pases.

Relevancia (pantalla de bloqueo)

Hay dos tipos de datos que pueden hacer que se muestre un paso en la pantalla de bloqueo:

Ubicación

Se pueden especificar hasta 10 ubicaciones en un pase, por ejemplo, las tiendas que visita un cliente con frecuencia o la ubicación de un aeropuerto o un aeropuerto. Un cliente podría establecer estas ubicaciones a través de una aplicación complementaria o el proveedor podría determinarlas a partir de los datos de uso (si se recopilan con el permiso del cliente).

Cuando el paso se muestra en la pantalla de bloqueo, se calcula una barrera para que, cuando el usuario sale del área, el paso esté oculto en la pantalla de bloqueo. El radio está asociado al estilo de paso para evitar abusos.

Fecha y hora

Solo se puede especificar una fecha y hora en un objeto Pass. La fecha y hora son útiles para desencadenar recordatorios de pantalla de bloqueo para las tarjetas de incorporación y los vales de evento.

Se puede actualizar mediante inserción o a través de passKit API, de modo que la fecha y hora se puedan actualizar en el caso de una entrada de uso múltiple (por ejemplo, una entrada de temporada a un cine o complejo deportivo).

Localización

Traducir un paso a varios idiomas es similar a localizar una aplicación de iOS: cree directorios específicos del idioma con la extensión y coloque los elementos .lproj localizados dentro. Las traducciones de texto deben especificarse en un archivo, mientras que las imágenes localizadas deben tener el mismo nombre que la imagen que pass.strings reemplazan en la raíz de paso.

Seguridad

Los pases se firman con un certificado privado que se genera en el portal de aprovisionamiento de iOS. Los pasos para firmar el paso son:

  1. Calcule un hash SHA1 para cada archivo del directorio de paso (no incluya el archivo o , ninguno de los cuales debe existir en esta fase de todos manifest.jsonsignature modos).
  2. Escriba manifest.json como una lista de clave/valor JSON de cada nombre de archivo con su hash.
  3. Use el certificado para firmar el manifest.json archivo y escribir el resultado en un archivo denominado signature .
  4. Comprímelo todo y asítele al archivo resultante una .pkpass extensión de archivo.

Dado que la clave privada es necesaria para firmar el paso, este proceso solo debe realizarse en un servidor seguro que controle. NO distribuya las claves para intentar y generar pases en una aplicación.

Instalación y configuración

Esta sección contiene instrucciones para ayudar a configurar los detalles de aprovisionamiento y crear el primer paso.

Aprovisionamiento de PassKit

Para que un pase escriba el App Store, debe estar vinculado a una cuenta de desarrollador. Esto requiere dos pasos:

  1. El paso debe registrarse mediante un identificador único, denominado Identificador de tipo de paso.
  2. Se debe generar un certificado válido para firmar el paso con la firma digital del desarrollador.

Para crear un identificador de tipo de paso, haga lo siguiente.

Creación de un identificador de tipo de paso

El primer paso consiste en configurar un identificador de tipo de paso para cada tipo diferente de paso que se va a dar soporte. El identificador de paso (o identificador de tipo de paso) crea un identificador único para pass. Usaremos este identificador para vincular el pase con su cuenta de desarrollador mediante un certificado.

  1. En la sección Certificates, Identifiers, and Profiles (Certificados,identificadores y perfiles) del Portal de aprovisionamiento de iOS, vaya a Identificadores y seleccione Pass Type IDs (Identificadores de tipo de paso). A + continuación, seleccione el botón para crear un nuevo tipo de paso: +

  2. Proporcione una descripción (nombre) e identificador (cadena única) para el paso. Tenga en cuenta que todos los identificadores de tipo de paso deben comenzar por la cadena pass. En este ejemplo se usa : Proporcionar una descripción e pass.com.xamarin.coupon.bananapass.

  3. Para confirmar el identificador de paso, presione el botón Registrar.

Generación de un certificado

Para crear un nuevo certificado para este identificador de tipo de paso, haga lo siguiente:

  1. Seleccione el identificador de paso recién creado de la lista y haga clic en Editar: seleccione el nuevo identificador de paso de la lista.

    A continuación, seleccione Crear certificado... :

    Seleccione Crear certificado.

  2. Siga los pasos para crear una solicitud de firma de certificado (CSR).

  3. Presione el botón Continuar en el portal para desarrolladores y cargue la CSR para generar el certificado.

  4. Descargue el certificado y haga doble clic en él para instalarlo en la cadena de claves.

Ahora que hemos creado un certificado para este identificador de tipo de paso, en la sección siguiente se describe cómo compilar un paso manualmente.

Para obtener más información sobre el aprovisionamiento de Wallet, consulte la guía Trabajar con funcionalidades.

Crear un paso manualmente

Ahora que hemos creado el tipo de paso, podemos crear manualmente un pase para probarlo en el simulador o en un dispositivo. Los pasos para crear un paso son:

  • Cree un directorio que contenga los archivos de paso.
  • Cree un archivo pass.json que contenga todos los datos necesarios.
  • Incluya imágenes en la carpeta (si es necesario).
  • Calcule los hash sha1 para cada archivo de la carpeta y escriba en manifest.json.
  • Firme manifest.json con el archivo .p12 del certificado descargado.
  • Compríe el contenido del directorio y cambie el nombre por la extensión .pkpass.

Hay algunos archivos de código fuente en el código de ejemplo de este artículo que se pueden usar para generar un paso. Use los archivos del CouponBanana.raw directorio del directorio CreateAPassManually. Los archivos siguientes están presentes:

Estos archivos están presentes

Abra pass.json y edite el archivo JSON. Debe actualizar al menos y para passTypeIdentifierteamIdentifer que coincidan con su cuenta de desarrollador de Apple.

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

A continuación, debe calcular los hashes de cada archivo y crear el manifest.json archivo. Tendrá un aspecto parecido al siguiente cuando haya terminado:

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

A continuación, se debe generar una firma para este archivo mediante el certificado (archivo .p12) que se generó para este identificador de tipo de paso.

Inicio de sesión en un equipo Mac

Descargue los materiales de soporte técnico de la ed. de Wallet desde el sitio de descargas de Apple. Use la herramienta para convertir la carpeta en un paso (esto también calculará los hash sha1 y comprimirá la salida signpass en un archivo .pkpass).

Pruebas

Si fuera a examinar la salida de estas herramientas (estableciendo el nombre de archivo en .zip y, a continuación, abrirlo), verá los siguientes archivos (tenga en cuenta la adición de los manifest.json archivos signature y ):

Examinar la salida de estas herramientas

Una vez que haya firmado, ZIPped y cambie el nombre del archivo (por ejemplo, a ) puede arrastrarlo al simulador para probarlo o enviarlo por correo electrónico para recuperarlo BananaCoupon.pkpass en un dispositivo real. Debería ver una pantalla para Agregar el paso, de la siguiente forma:

Adición de la pantalla de paso

Normalmente, ese proceso se automatizaría en un servidor, pero la creación manual de pases podría ser una opción para pequeñas empresas que solo crean cupones que no requieren la compatibilidad de un servidor back-end.

Wallet

Wallet es la pieza central del ecosistema de PassKit. En esta captura de pantalla se muestra la cartera vacía y cómo se ven la lista de pases y los pases individuales:

En esta captura de pantalla se muestra la cartera vacía y cómo se ven la lista de pases y los pases individuales.

Entre las características de Wallet se incluyen:

  • Es el único lugar en el que los pases se representan con su código de barras para el examen.
  • El usuario puede cambiar la configuración de las actualizaciones. Si está habilitada, las notificaciones push pueden desencadenar actualizaciones de los datos en el paso.
  • El usuario puede habilitar o deshabilitar la integración de pantalla de bloqueo. Si está habilitada, esto permite que el paso aparezca automáticamente en su pantalla de bloqueo, en función de los datos de ubicación y hora pertinentes insertados en el paso.
  • El lado inverso del paso admite la extracción para actualizar, si se proporciona una dirección URL de servidor web en el código JSON de paso.
  • Las aplicaciones complementarias se pueden abrir (o descargar) si el identificador de la aplicación se proporciona en el código JSON de paso.
  • Los pases se pueden eliminar (con una animación de desmenuzándose).

Adición de pases a Wallet

Los pases se pueden agregar a Wallet de las maneras siguientes:

  • Aplicaciones de Conduit: no manipulan los pases directamente, simplemente cargan archivos de paso y presentan al usuario la opción de agregarlos a Wallet.

  • Aplicaciones complementarias: están escritas por proveedores para distribuir los pases y ofrecer funcionalidad adicional para examinarlos o editarlos. Las aplicaciones de Xamarin.iOS tienen acceso completo a la API de PassKit para crear y manipular pases. A continuación, los pases se pueden agregar a Wallet mediante PKAddPassesViewController . Este proceso se describe con más detalle en la sección Aplicaciones complementarias de este documento.

Aplicaciones de conduit

Las aplicaciones conduit son aplicaciones intermedias que pueden recibir pases en nombre de un usuario y deben programarse para reconocer su tipo de contenido y proporcionar funcionalidad para agregarla a Wallet. Entre los ejemplos de aplicaciones de conduit se incluyen:

  • Correo: reconoce los datos adjuntos como un paso.
  • Safari: reconoce el tipo de contenido de paso cuando se hace clic en un vínculo de dirección URL de paso.
  • Otras aplicaciones personalizadas: cualquier aplicación que reciba datos adjuntos o vínculos abiertos (clientes de redes sociales, lectores de correo electrónico, etc.).

En esta captura de pantalla se muestra cómo Mail en iOS 6 reconoce un archivo adjunto de paso y (cuando se toca) ofrece agregarlo a Wallet.

En esta captura de pantalla se muestra cómo Mail en iOS 6 reconoce un archivo adjunto de paso.

En esta captura de pantalla se muestra cómo mail ofrece agregar un archivo adjunto de paso a Wallet

Si está creando una aplicación que podría ser un conduit para los pases, se pueden reconocer mediante:

  • Extensión de archivo: .pkpass
  • Tipo MIME: application/vnd.apple.pkpass
  • UTI: com.apple.pkpass

La operación básica de una aplicación de conduit es recuperar el archivo de paso y llamar a PassKit para dar al usuario la opción de agregar el paso a PKAddPassesViewController su cartera. La implementación de este controlador de vistas se trata en la sección siguiente sobre aplicaciones complementarias.

No es necesario aprovisionar aplicaciones de conduit para un identificador de tipo de paso específico de la misma manera que lo hacen las aplicaciones complementarias.

Aplicaciones complementarias

Una aplicación complementaria proporciona funcionalidad adicional para trabajar con pases, incluida la creación de un pass, la actualización de la información asociada a un pass y la administración de los pases asociados a la aplicación.

Las aplicaciones complementarias no deben intentar duplicar las características de Wallet. No están diseñados para mostrar las pasadas para el examen.

En el resto de esta sección se describe cómo crear una aplicación complementaria básica que interactúe con PassKit.

Aprovisionamiento

Dado que Wallet es una tecnología de tienda, la aplicación debe aprovisionarse por separado y no puede usar el perfil de aprovisionamiento de equipos ni el identificador de aplicación comodín. Consulte la guía Trabajar con funcionalidades para crear un identificador de aplicación único y un perfil de aprovisionamiento para la aplicación Wallet.

Derechos

El archivo Entitlements.plist debe incluirse en todos los proyectos recientes de Xamarin.iOS. Para agregar un nuevo archivo Entitlements.plist, siga los pasos descritos en la guía Trabajar con derechos.

Para establecer derechos, haga lo siguiente:

Haga doble clic en el archivo Entitlements.plist Panel de solución para abrir el editor Entitlements.plist:

Editor Entitlements.plst

En la sección Wallet, seleccione la opción Enable Wallet (Habilitar Wallet).

Habilitación del derecho de cartera

La opción predeterminada es que la aplicación permita todos los tipos de paso. Sin embargo, es posible restringir la aplicación y permitir solo un subconjunto de tipos de pase de equipo. Para habilitar esta opción, seleccione Permitir subconjunto de tipos de paso de equipo y escriba el identificador de tipo de paso del subconjunto que desea permitir.

Depuración

Si tiene problemas para implementar la aplicación, compruebe que está usando el perfil de aprovisionamiento correcto y que está seleccionado como archivo de derechos personalizados en las opciones de firma iPhone lote.

Si experimenta este error al implementar:

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

a pass-type-identifiers continuación, la matriz de derechos es incorrecta (o no coincide con el perfil pass-type-identifiers Compruebe que los identificadores de tipo de paso y el identificador de equipo son correctos.

Clases

Las siguientes clases de PassKit están disponibles para que las aplicaciones accedan a los pases:

  • PKPass: instancia de un objeto Pass.
  • PKPassLibrary: proporciona la API para acceder a los pases del dispositivo.
  • PKAddPassesViewController: se usa para mostrar un pase para que el usuario guarde en su cartera.
  • PKAddPassesViewControllerDelegate: desarrolladores de Xamarin.iOS

Ejemplo

Consulte el proyecto PassLibrary en el código de ejemplo de este artículo. Muestra las siguientes funciones comunes que serían necesarias en una aplicación complementaria de Wallet:

Comprobación de que Wallet está disponible

Wallet no está disponible en el iPad, por lo que las aplicaciones deben comprobar antes de intentar acceder a las características de PassKit.

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

Creación de una instancia de biblioteca de paso

La biblioteca PassKit no es un singleton, las aplicaciones deben crear y almacenar e instancia para acceder a la API de PassKit.

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

Obtener una lista de pases

Las aplicaciones pueden solicitar una lista de pases de la biblioteca. PassKit filtra automáticamente esta lista para que solo pueda ver los pases que se han creado con el identificador de equipo y que aparecen en los derechos.

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

Tenga en cuenta que el simulador no filtra la lista de pases devueltos, por lo que este método siempre debe probarse en dispositivos reales. Esta lista se puede mostrar en uiTableView. La aplicación de ejemplo tiene este aspecto después de agregar dos cupones:

La aplicación de ejemplo tiene este aspecto después de agregar dos cupones

Mostrar pases

Hay disponible un conjunto limitado de información para la representación de pases dentro de aplicaciones complementarias.

Elija entre este conjunto de propiedades estándar para mostrar listas de pases, como hace el código de ejemplo.

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

Esta cadena se muestra como una alerta en el ejemplo:

La alerta Cupón seleccionado en el ejemplo

También puede usar el método para recuperar datos de los campos de los pases que ha diseñado (ya que sabrá LocalizedValueForFieldKey() qué campos deben estar presentes). El código de ejemplo no muestra esto.

Cargar un paso desde un archivo

Dado que un paso solo se puede agregar a Wallet con el permiso del usuario, se debe presentar un controlador de vista para que pueda decidirlo. Este código se usa en el botón Agregar del ejemplo para cargar un paso pre built que está insertado en la aplicación (debe reemplazarlo por uno que haya firmado):

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);

El paso se presenta con las opciones Agregar y Cancelar:

El paso que se presenta con las opciones Agregar y Cancelar

Reemplazar un paso existente

El reemplazo de un paso existente no requiere el permiso del usuario, pero se producirá un error si el paso aún no existe.

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

Edición de un paso

PKPass no es mutable, por lo que no se pueden actualizar los objetos de paso en el código. Para modificar los datos de un paso, una aplicación debe tener acceso a un servidor web que pueda mantener un registro de los pases y generar un nuevo archivo de paso con valores actualizados que la aplicación puede descargar.

La creación de archivos de paso debe realizarse en un servidor porque los pases deben estar firmados con un certificado que se debe mantener privado y seguro.

Una vez generado un archivo de paso actualizado, use el Replace método para sobrescribir los datos antiguos en el dispositivo.

Mostrar un paso para el examen

Como se indicó anteriormente, solo Wallet puede mostrar un pase para el examen. Se puede mostrar un paso mediante el OpenUrl método , como se muestra a continuación:

UIApplication.SharedApplication.OpenUrl (p.PassUrl);

Recibir notificaciones de cambios

Las aplicaciones pueden escuchar los cambios que se realizan en la biblioteca de paso mediante PKPassLibraryDidChangeNotification . Los cambios pueden deberse a notificaciones que desencadenan actualizaciones en segundo plano, por lo que es una buena práctica escucharlas en la aplicación.

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

Es importante pasar una instancia de biblioteca al registrarse para la notificación porque PKPassLibrary no es un singleton.

Procesamiento del servidor

Una explicación detallada de la creación de una aplicación de servidor para admitir PassKit está fuera del ámbito de este artículo introductorio.

Consulte dotnet-passbook código de código abierto del lado servidor de C#.

Notificaciones de inserción

Una explicación detallada del uso de notificaciones push para actualizar los pases está fuera del ámbito de este artículo introductorio.

Se le pedirá que implemente la API de tipo REST definida por Apple para responder a las solicitudes web de Wallet cuando se requieran actualizaciones.

Consulte la guía Actualización de un paso de Apple para obtener más información.

Resumen

En este artículo se presenta PassKit, se describen algunas de las razones por las que es útil y se describen las distintas partes que se deben implementar para una solución completa de PassKit. Se describen los pasos necesarios para configurar la cuenta de desarrollador de Apple para crear pases, el proceso para realizar un paso manualmente y también cómo acceder a las API de PassKit desde una aplicación xamarin.iOS.