# 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[​](#test-mode "Enlace directo al 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.
* 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](https://docs.monei.com/es/testing.md).

Prueba estos casos antes de pasar a producción:

* Un pago aprobado y un pago rechazado, cada uno con su webhook firmado.
* 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`](https://docs.monei.com/es/monei-pay/in-app-tap-to-pay/errors.md#outcome-unknown), y cómo tu equipo encuentra el pago por `orderId`.

## App de ejemplo[​](#example-app "Enlace directo al 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.

1. Abre `Example/TapToPayExample.xcodeproj` en Xcode.
2. Define tu equipo y tu bundle ID. Tu equipo debe tener el permiso de Tap to Pay en el iPhone.
3. Ejecuta la app en un iPhone compatible.
4. Pega un token de tu servidor, o de una llamada `curl` con tu clave API del modo de prueba. Consulta [Solicita un token](https://docs.monei.com/es/monei-pay/in-app-tap-to-pay/backend.md#request-a-token).

## Versiones y compatibilidad[​](#versions "Enlace directo al 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.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](https://docs.monei.com/es/monei-pay/in-app-tap-to-pay/get-started.md#add-package).

## Lista de comprobación para pasar a producción[​](#go-live-checklist "Enlace directo al 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.
* MONEI tiene tu Team ID de Apple y el bundle ID de cada app que acepta pagos.
* Tu app usa una versión definitiva del SDK, por ejemplo `0.2.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 `prepare` con el token nuevo.
* Cada pago tiene un `orderId` nuevo y una `callbackUrl`.
* Tu servidor verifica la firma de cada webhook, y completa los pedidos solo a partir del webhook.
* Tu app muestra un estado pendiente para `outcomeUnknown` y nunca vuelve a intentar el pago.
* Tu interfaz usa el nombre "Tap to Pay en el iPhone", y lo oculta cuando `TapToPay.isSupported` es `false`.
* Declaraste los [detalles de privacidad de la App Store](https://docs.monei.com/es/monei-pay/in-app-tap-to-pay/get-started.md#privacy).

## Preguntas frecuentes[​](#common-questions "Enlace directo al Preguntas frecuentes")

### ¿Puedo probar en el simulador de iOS?[​](#simulator "Enlace directo al ¿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 publicar una versión preliminar en la App Store?[​](#ship-prerelease "Enlace directo al ¿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.2.0`.

### ¿Qué versión de Xcode necesito?[​](#xcode-version "Enlace directo al ¿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.2.0`, usa Xcode 26.6 o posterior.
