In App Provisioning en Apps — Personalización

David Martinez
4 min readOct 11, 2020

--

En este artículo continuaremos aplicando cambios a nuestro proceso de enrolamiento de tarjetas en ApplePay que ya comenzamos en el episodio anterior sobre InApp Provisioning con el objetivo de mejorar la experiencia de usuario.

Para ello exploraremos alternativas que nos ofrece el API de PassKit y repasaremos algunos problemas que nos podemos encontrar de cara al desarrollo de nuestra funcionalidad.

Personalización

Una de las recomendaciones que Apple indica es mostrar el botón o cambiarlo por un banner/imagen estática en función de si dicha tarjeta ya se encuentra incluida en ApplePay. Para ello vamos a centrarnos, inicialmente, en los siguientes métodos del API de PassKit:

/// A Boolean value that indicates whether the pass library is available.
class func isPassLibraryAvailable() -> Bool
/// Returns the passes of the specified pass type.
func passes(of passType: PKPassType) -> [PKPass]

Estos métodos nos indicarán si tenemos acceso a la librería de Passes del dispositivo y el segundo nos devolverá un array de los pkpasses registrados actualmente para el tipo solicitado.

Un objeto pkpass puede ser desde una tarjeta vinculada en wallet hasta ticket de un billete de avión.

Con estas ideas en la cabeza vamos a construir una pequeña capa que nos exponga esta configuración.

// 1
En primer lugar comprobamos si la librería de PassKit está disponible para ser consultada

// 2
Posteriormente, solicitamos a la librería los secureElements que pueden estar representando, entre otras cosas, una tarjeta bancaria. Es importante indicar que el API sufrió un cambio obligatorio en la versión de iOS 13.4. Hemos preferido incluirlo como era antes de dicha actualización para mantener la compatibilidad.

// 3
Extraemos del PKPass el sufijo de la tarjeta usada (si existe) que utilizaremos para relacionar si la tarjeta existe o no. Nota: Para la identificación de la tarjeta también disponemos del primaryAccountIdentifier pero en nuestro ejemplo no lo usaremos.

// 4
Extraemos del PKPass el deviceAccountIdentifier. Este objeto no es necesario en si para nuestro ejemplo pero suele ser necesario para las entidades bancarias así que lo incluimos a modo informativo.

// 5
Finalmente filtramos del listado todos aquellos que tienen ambos casos disponibles. Una tarjeta enrolada siempre dispone de ellos dos.

// 6
Del mismo modo que para el método anterior, obtenemos los passes asociados a dispositivos vinculados como puede ser, por ejemplo, un AppleWatch. De esta forma podremos seguir mostrando el botón de Add to Apple Wallet mientras no lo tengamos configurado en todos nuestros dispositivos.

Con esto definido, vamos al último paso, crear una pieza que se ocupa de determinar si tenemos que mostrar o no el botón en pantalla.

// 1
En primer lugar comprobamos (siempre) si nuestra tarjeta está agregada en nuestro dispositivo.

// 2
Por otro lugar comprobar si tenemos dispositivos vinculados a nuestro dispositivo actual (como puede ser un AppleWatch).

// 3
Si lo tenemos comprobar adicionalmente si nuestra tarjeta está vinculada al mismo.

// 4
Determinamos que la tarjeta está vinculada completamente a ApplePay si lo está tanto para el dispositivo actual como para los vinculados.

// 5
Este último repositorio es una pequeña utilidad para comprobar si tenemos, o no, dispositivos vinculados.

¡Y esto sería todo! Desde nuestra vista podríamos tener una llamada como:

let isEnroll: IsCardRegisterAtApplePayInteractorfunc setupApplePay(card: Card) {
if isEnroll.execute() {
// todo: Display a banner or not display Add To Apple Wallet button
} else {
let passKitButton = PKAddPassButton(addPassButtonStyle: .blackOutline)
// todo: Display passKitButton into the screen
}
}

Problemas/dudas frecuentes

  • Problema: Ya tenía registrada mi tarjeta en Wallet pero el API me indica que no hay ninguna tarjeta ¿qué puede ocurrir?
    Para que el proceso de vinculación finalice correctamente es muy importante que los servidores que se ocupan del alta envíen información, entre otras cosas, del bundle id de la aplicación que se está registrando para que Apple pueda trazar tarjeta <-> dispositivo <-> Wallet. Sin esta información PassKit nunca será capaz de relacionar, a la app, con wallet y la tarjeta. Para más información leer el II. Prerequistes, del manual de usuario incluido en la bibliografía.
    Si por ejemplo registraste tu tarjeta en ApplePay y posteriormente se agregó esta información a los servidores, la tarjeta nunca se verá reflejada en el API como dada de alta pero el servidor si te dará un error si la intentas vincular porque ya está activa. En un caso como este tendrás que consultar con tu operador de servicios para ver si sus servidores ofrecen posibilidades de actualización automática de esta información.
  • Duda: ¿Y si registro mi tarjeta en Wallet directamente?
    No hay ningún problema, registres (o borres) tu tarjeta fuera o dentro de tu aplicación, al preguntar a la librería de PassKit te devolverá la información sobre las tarjetas asociadas a ese dispositivo (siempre que esté debidamente configurada desde los servidores el alta tal cual se comentó en el apartado anterior)

¡Esperamos que te haya sido de utilidad! ¡Happy coding!

Bibliografia

Utilidades

--

--