Prueba y pasa a producción
Prueba tu integración en modo de prueba en un iPhone real. Después, usa la lista de comprobación para pasar a producción.
Modo de prueba
- Una clave API del modo de prueba da un token de prueba. Los pagos con un token de prueba son pagos de prueba. Solo aparecen en modo de prueba en el MONEI Dashboard.
- En modo de prueba, acercas una tarjeta real al iPhone. MONEI la sustituye por una tarjeta de prueba de Mastercard antes del cobro. Nunca se hace un cargo en tu tarjeta. Consulta Probar Tap to Pay.
- Una clave API de producción da un token de producción.
- No uses tokens de prueba y de producción en el mismo dispositivo.
Tap to Pay en el iPhone no funciona en el simulador de iOS. Prueba en un iPhone compatible: un iPhone XS o posterior con iOS 18.5 o posterior. Para las claves API de prueba y de producción, consulta Pruebas.
Prueba estos casos antes de pasar a producción:
- Un pago aprobado y un pago rechazado, cada uno con su webhook firmado. En modo de prueba, un importe que acaba en 65 céntimos (por ejemplo 10,65) se rechaza.
- Un pago que el usuario cancela en la pantalla de Apple.
- Un token caducado: renuévalo y llama otra vez a
prepare. - El acceso a la ubicación denegado, y el acceso a la ubicación permitido otra vez en Ajustes.
- Tu estado pendiente para
outcomeUnknown, y cómo tu equipo encuentra el pago pororderId.
App de ejemplo
El repositorio del paquete tiene una app de ejemplo: Example/TapToPayExample.xcodeproj. Es una app de SwiftUI con un campo para el token, un importe, un ID de pedido, un botón de pago, las pantallas educativas y una vista del resultado.
- Abre
Example/TapToPayExample.xcodeprojen Xcode. - Define tu equipo y tu bundle ID. Tu equipo debe tener el permiso de Tap to Pay en el iPhone.
- Ejecuta la app en un iPhone compatible.
- Pega un token de tu servidor, o de una llamada
curlcon tu clave API del modo de prueba. Consulta Solicita un token.
Versiones y compatibilidad
El SDK usa versionado semántico (MAJOR.MINOR.PATCH):
- Patch: corrección de errores. Sin cambios en la API pública ni en el significado de los errores.
- Minor: una actualización dentro del SDK, o una API nueva que no rompe tu código.
- Major: un cambio en el significado de los errores, o un cambio que rompe tu código.
- Versiones 0.x: hasta 1.0.0, una versión menor (por ejemplo 0.2.0) puede cambiar la API pública. Lee las notas de la versión antes de actualizar.
- Las versiones preliminares (
-beta.N) son solo para pruebas. No las publiques en producción.
| Versión del SDK | iOS mínimo | Compilada con | Notas |
|---|---|---|---|
0.7.0 | 18.5 | Xcode 26.6 (Swift 6.3.3) | Nuevo TapToPayError.passcodeRequired: las llamadas públicas comprueban que el iPhone tiene código de acceso y lanzan este error antes de iniciar el lector. Un switch sobre TapToPayError sin @unknown default no compila. |
0.6.0 | 18.5 | Xcode 26.6 (Swift 6.3.3) | Nueva versión del motor de pagos. Sin cambios en la API pública. |
0.5.0 | 18.5 | Xcode 26.6 (Swift 6.3.3) | Nuevo TapToPayError.setupIncomplete(fix:): las llamadas públicas comprueban la configuración de la app (texto de uso de la ubicación, entitlement de Tap to Pay, PRODUCT_TEAM_IDENTIFIER presente e igual al equipo que firma) y dan la corrección exacta. El SDK vuelve a preparar el lector por sí mismo cuando la app vuelve del segundo plano. Un switch sobre TapToPayError sin @unknown default no compila. |
0.4.0 | 18.5 | Xcode 26.6 (Swift 6.3.3) | Nueva API para los requisitos de revisión de Apple: isAccountLinked() y linkAccount() (aceptar los términos de Apple antes del cobro), readerState y readerStates() (progreso de la configuración y vista de inicialización), y TapToPayError.osUpdateRequired. Un switch sobre TapToPayError sin @unknown default no compila. |
0.3.0 | 18.5 | Xcode 26.6 (Swift 6.3.3) | Nuevo TapToPayErrorCode.readerSetupFailed(reason:): un fallo al configurar el lector da el paso y un código de error, no unknown. El código que compara con .paymentFailed(code: .unknown) no lo captura. Un switch sin @unknown default no compila. |
0.2.0 | 18.5 | Xcode 26.6 (Swift 6.3.3) | PaymentResult tiene campos nuevos: amount, currency, statusCode, statusMessage, authorizationCode, cardType y cardCountry. Un resultado rechazado muestra el motivo sin una llamada a MONEI. Sin cambios en los campos existentes. |
0.1.1 | 18.5 | Xcode 26.6 (Swift 6.3.3) | Se instala sin un token de GitHub: URL de descarga públicas. Mismo código del SDK que 0.1.0. |
0.1.0 | 18.5 | Xcode 26.6 (Swift 6.3.3) | Primera versión. Binario firmado. Mismo código que 0.1.0-beta.5. |
0.1.0-beta.5 | 18.5 | Xcode 26.6 (Swift 6.3.3) | Preliminar. Binario firmado. |
0.1.0-beta.4 | 18.5 | Xcode 26.6 (Swift 6.3.3) | Preliminar. Binario firmado. |
0.1.0-beta.3 | 18.5 | Xcode 27.0 (Swift 6.4) | Preliminar. Sin firmar. |
Usa la misma versión de Xcode que "Compilada con", o una más reciente. A partir de 0.1.0-beta.4, MONEI firma el binario MoneiTapToPay (equipo 72J3PXJJ4K).
Para las versiones 0.x, usa una versión exacta en Swift Package Manager. A partir de 1.0.0, usa from:. Consulta Añade el paquete.
Requisitos de Apple
Antes de dar el permiso de publicación, Apple revisa tu app según sus requisitos de Tap to Pay en el iPhone. Apple envía la lista de requisitos durante el proceso del permiso. La tabla da nuestro resumen de cada punto y cómo lo cumples con el SDK. La lista de Apple es la referencia. Lee también las Human Interface Guidelines de Tap to Pay en el iPhone y las directrices de marketing de Apple.
| Punto | Resumen | Cómo lo cumples |
|---|---|---|
| 1.1 | Admite Tap to Pay en el iPhone en todos los modelos de iPhone compatibles. | TapToPay.isSupported. Oculta Tap to Pay en el iPhone cuando es false. |
| 1.2, 1.3 | Si Tap to Pay en el iPhone es tu método de pago principal: un destino de despliegue y unas capacidades del dispositivo que lo admitan. | El SDK necesita iOS 18.5. Define tu destino de despliegue en iOS 18.5 o posterior. Define las capacidades del dispositivo en tu app. |
| 1.4 | Pide al usuario que actualice iOS cuando su versión de iOS no admite Tap to Pay en el iPhone. | El SDK necesita iOS 18.5, así que tu app no se ejecuta en las versiones antiguas de iOS que cita Apple. Si Apple indica que la versión de iOS no es compatible, las llamadas lanzan osUpdateRequired (desde 0.4.0). Pide al usuario que actualice iOS. |
| 1.5 | Prepara Tap to Pay en el iPhone al iniciar la app y cuando vuelve al primer plano. | Llama a prepare una vez al iniciar la app. El SDK prepara otra vez el lector cada vez que la app vuelve del segundo plano. |
| 1.6 | Obtén de Apple el estado de los términos. No lo guardes en tu app. | isAccountLinked() (desde 0.4.0). |
| 1.7 a 1.9 | Inicio de sesión con Face ID o Touch ID, las Human Interface Guidelines y las directrices de marketing de Apple. | Tu app. |
| 2.1 a 2.3 | Un alta digital en la app que un comercio nuevo completa rápido en el iPhone. | Tu app y el alta de la cuenta de MONEI. |
| 3.1 a 3.4 | Comunicación sobre Tap to Pay en el iPhone: visible, para todos los usuarios que pueden usarlo y al final del alta. | Tu app, con los recursos de marketing de Apple. |
| 3.5 a 3.7 | Una acción clara para aceptar los términos, también fuera del cobro (por ejemplo en los ajustes), y en el cobro o antes. | linkAccount() desde el alta y los ajustes (desde 0.4.0). En el cobro, acceptPayment muestra los términos si no se aceptaron. |
| 3.8, 3.8.1 | Solo un administrador acepta los términos. Los demás usuarios ven un mensaje para que contacten con un administrador. | Tu app decide quién puede llamar a linkAccount(). Para los demás usuarios, usa isAccountLinked() y tu mensaje. Consulta Acepta los términos de Apple antes del cobro. |
| 3.8.2 | Apps empresariales: acepta los términos fuera de la app. | Contacta con MONEI. |
| 3.9 | Una pantalla que invita al comercio a probar Tap to Pay en el iPhone después de los términos y la formación. | Tu app. |
| 3.9.1 | Un indicador del progreso de la configuración. | readerStates(), preparing(progress:) (desde 0.4.0). |
| 4.1 a 4.3 | Formación del comercio con el contenido de Apple después de aceptar los términos, y desde los ajustes o la ayuda. | presentEducation(from:) después de linkAccount(), y desde tus ajustes o tu ayuda. Muestra el contenido actual y traducido de Apple. |
| 4.4 a 4.8 | Contenido de la formación: tarjetas, carteras digitales, introducción del PIN y método alternativo donde la región los pide; el kit de Apple fuera de la app. | El contenido de Apple de presentEducation cubre la parte de la app. |
| 5.1 a 5.5 | Un botón de Tap to Pay en el iPhone visible en el cobro, arriba, nunca desactivado, con el texto y el símbolo de Apple. | Tu app. |
| 5.6 | La pantalla de Apple se abre en menos de un segundo. | Llama a prepare al iniciar la app. El SDK mantiene el lector listo en el primer plano. |
| 5.7 | Una vista de inicialización cuando el lector todavía no está listo. | Muéstrala mientras readerState no sea ready (desde 0.4.0). Consulta Muestra el estado del lector. |
| 5.8 | Una vista de procesamiento después de la lectura de la tarjeta. | Muestra tu vista de procesamiento mientras se ejecuta acceptPayment. La pantalla de Apple la cubre durante la lectura de la tarjeta. |
| 5.9 | Un resultado claro: aprobado, rechazado o tiempo agotado. | PaymentResult.status y TapToPayError. Para outcomeUnknown, muestra un estado pendiente. |
| 5.10 | Un recibo digital para el cliente. | Envíalo con la API de MONEI (enviar el recibo del pago) y el paymentId, o con tu propio recibo. |
| 5.11 | Requisitos regionales. | Contacta con MONEI. |
Vídeos para la revisión
Apple pide tres grabaciones de pantalla con la solicitud del permiso:
- Alta. Un usuario nuevo se registra (con las comprobaciones de identidad, si las tienes). Después, muestra cómo tu app presenta Tap to Pay en el iPhone cuando se aprueba la cuenta del comercio.
- Activación y formación. Un usuario existente descubre que Tap to Pay en el iPhone está disponible y acepta los términos. Muestra cada camino hacia los términos, por ejemplo desde los ajustes y desde el cobro. Muestra la formación después de los términos, dónde la encuentra el usuario más tarde y el indicador de progreso si la configuración no terminó.
- Cobro. Introduce un importe, muestra las opciones de pago y el botón de Tap to Pay en el iPhone, la vista de inicialización si la pantalla de Apple tarda en abrirse, y un pago correcto. Muestra la introducción del PIN y el método de pago alternativo donde tu región los pide. Graba este vídeo con un segundo dispositivo: una grabación de pantalla no muestra las pantallas de Tap to Pay en el iPhone de Apple.
Lista de comprobación para pasar a producción
- Apple dio a tu equipo el permiso de publicación de Tap to Pay en el iPhone.
- Tu app usa una versión definitiva del SDK, por ejemplo
0.7.0, y no una versión preliminar (-beta.N). - Tu servidor usa tu clave API de producción, y la app solo recibe tokens de producción.
- Tu servidor renueva cada token antes de que caduque, y la app llama a
preparecon el token nuevo. - Cada pago tiene un
orderIdnuevo y unacallbackUrl. - Tu servidor verifica la firma de cada webhook, y completa los pedidos solo a partir del webhook.
- Tu app muestra un estado pendiente para
outcomeUnknowny nunca vuelve a intentar el pago. - Tu interfaz usa el nombre "Tap to Pay en el iPhone", y lo oculta cuando
TapToPay.isSupportedesfalse. - Tu app cumple los requisitos de Apple, y grabaste los vídeos para la revisión.
- Declaraste los detalles de privacidad de la App Store.
Preguntas frecuentes
¿Puedo probar en el simulador de iOS?
No. Tap to Pay en el iPhone no funciona en el simulador de iOS. Prueba en un iPhone compatible.
¿Puedo probar con una tarjeta real?
Sí. En modo de prueba, acerca cualquier tarjeta real. MONEI la sustituye por una tarjeta de prueba, y nunca se hace un cargo en ella. Una tarjeta que pide el PIN se aprueba. El modo de prueba no usa el PIN.
¿Puedo publicar una versión preliminar en la App Store?
No. Las versiones preliminares (-beta.N) son solo para pruebas. Publica una versión definitiva, por ejemplo 0.7.0.
¿Qué versión de Xcode necesito?
La versión de Xcode de la columna "Compilada con" para tu versión del SDK, o una más reciente. Para 0.7.0, usa Xcode 26.6 o posterior.