# Inicializar el SDK

Antes de procesar pagos, el SDK debe autenticarse y la configuración del comercio debe sincronizarse con la pasarela de Get Mini. Esta guía cubre los pasos esenciales de inicialización: establecer el entorno, validar tu licencia y realizar el Login del comercio.

## Requisitos

Antes de comenzar, asegúrate de tener:

- **Bundle ID registrado** con Get Mini para la validación de la licencia
- **Clave de licencia** asociada con tu Bundle ID proporcionada por Get Mini
- **Credenciales de comercio** (nombre de usuario y contraseña para inicio de sesión)
- **Flags de linker** configurados: `-ObjC` y `-lsqlite3` en Build Settings
- **SDK instalado** con todos los archivos de encabezado accesibles vía Bridging Header

<Callout type="note">

Completa [Instalar el SDK](/es/get-mini/ios-sdk/first-steps/install-the-sdk) y [Configurar Permisos iOS](/es/get-mini/ios-sdk/first-steps/configure-ios-permissions) antes de proceder.

</Callout>

## Pasos de inicialización

### Paso 1: Fijar entorno y licencia

La clase `CommonUtils` gestiona la configuración global del SDK. Inicializa estos lo antes posible, idealmente en el `application(_:didFinishLaunchingWithOptions:)` de tu AppDelegate:

```
// Importar vía Bridging Header: CommonUtils.h
import UIKit

func application(_ application: UIApplication,
                didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    // 1. Fijar entorno de ejecución
    // Opciones: "des" (Desarrollo), "int" (Integración),
    //           "ccal" (CCAL), "real" (Producción)
    CommonUtils.setEntorno("des")

    // 2. Fijar licencia de aplicación proporcionada por Get Mini
    CommonUtils.setAppLicense("SU_CLAVE_DE_LICENCIA_AQUI")

    return true
}
```

El entorno determina qué servidores de pasarela Get Mini procesan tus transacciones. La clave de licencia valida tu Bundle ID para prevenir el uso no autorizado.

| Entorno | Caso de Uso |
| :---- | :---- |
| `"des"` | Desarrollo y pruebas iniciales |
| `"int"` | Pruebas de integración con Get Mini |
| `"ccal"` | Entorno CCAL |
| `"real"` | Producción (requiere aprobación de Get Mini) |

<Callout type="warning">

Nunca establezcas el entorno a `"real"` hasta que tu aplicación haya sido oficialmente certificada por Get Mini.

</Callout>

### Paso 2: Realizar el Login de comercio

Para procesar transacciones, el SDK necesita la configuración del comercio (FUC, ID de Terminal, etc.) de la pasarela Get Mini. Obtén esto realizando un Login utilizando `RedsysConfigurationManager`:

```
// Importar vía Bridging Header: DatosLoginDTO.h, RedsysConfigurationManager.h
func performMerchantLogin() {
    let credentials = DatosLoginDTO(user: "usuario_comercio",
                                    andPass: "contraseña_comercio")

    RedsysConfigurationManager.obtenerDatosComercioLogin(credentials) { response, error in
        if let merchantData = response,
           let merchant = merchantData.merchantList?.first as? MerchantDataDTO,
           let terminal = merchant.listaTerm?.first as? TerminalDataDTO {
            print("Login exitoso: \(merchant.nameComplete ?? "")")
            print("FUC: \(terminal.fuc ?? "")")
            print("Terminal: \(terminal.terminal ?? "")")

            // Almacenar merchantData para operaciones de pago
            self.saveMerchantConfiguration(merchantData)
        } else {
            print("Fallo de Login: \(error?.localizedDescription ?? "Error desconocido")")
            self.handleLoginError(error)
        }
    }
}
```

El `DatosLoginResponseDTO` que se obtiene al iniciar sesión con éxito no expone directamente el FUC, el terminal ni el nombre del comercio. Contiene `merchantList`, un array de objetos `MerchantDataDTO`: el nombre del comercio se obtiene de `nameComplete` o `nameReduced` en ese objeto. Cada `MerchantDataDTO` tiene su propio array `listaTerm` de objetos `TerminalDataDTO`, que contienen `fuc`, `terminal`, `currency` y `services` (una lista de códigos de permisos).

Almacena esta configuración de forma segura para usarla al crear objetos `MerchanDTO` para operaciones de pago.

<Callout type="warning">

Para implementaciones en las que no se requieren credenciales para cada sesión, consulta el manual sobre opciones de "Login sin credenciales" (Login Transparente).

</Callout>

### Paso 3: Implementar protocolos de delegado

Tu controlador de vista debe implementar los protocolos de delegado del SDK para recibir callbacks durante la inicialización y el procesamiento de pagos.

```
// Importar vía Bridging Header: RedsysPinpadManager.h
class PaymentViewController: UIViewController,
                             RedsysDelegateGeneric,
                             RedsysBTPinpadInitDelegate,
                             RedsysBTPinpadPaymentDelegate {

    var merchantConfig: DatosLoginResponseDTO?

    override func viewDidLoad() {
        super.viewDidLoad()
        // La inicialización ocurrirá al iniciar el flujo de pago
    }

    // MARK: - Delegado de Inicialización

    func onInitFinished(_ result: Any!, orError error: Error!) {
        if let config = result as? PinpadConfig {
            print("PIN pad listo para transacciones")
            // Proceder al pago
        } else {
            print("Error de inicialización: \(error?.localizedDescription ?? "")")
        }
    }

    // MARK: - Delegados de Pago

    func onPaymentProcess(_ result: Any!, orError error: Error!) {
        // Llamado durante el procesamiento de pago para actualizaciones de progreso
        print("Pago en progreso...")
    }

    func onPaymentFinished(_ result: RespuestaTransaccionDTO!, orError error: Error!) {
        if let transaction = result, error == nil {
            print("Pago aprobado: \(transaction.codigoRespuesta ?? "")")
            // Guardar transacción, generar recibo
        } else {
            print("Pago fallido: \(error?.localizedDescription ?? "")")
            // Manejar error, permitir reintento
        }
    }
}
```

Estos delegados proporcionan callbacks en diferentes etapas:
- `onInitFinished` - Conexión y configuración del PIN pad completas
- `onPaymentProcess` - Actualizaciones de progreso durante la transacción
- `onPaymentFinished` - Resultado final de la transacción

## Mejores prácticas

### Manejo seguro de credenciales

**Nunca codifiques credenciales de comercio directamente en el código fuente:**

```
// ❌ MAL: Credenciales codificadas
let credentials = DatosLoginDTO(user: "miusuario", andPass: "micontraseña")

// ✅ BIEN: Recuperadas de almacenamiento seguro o backend
let credentials = DatosLoginDTO(
    user: SecureStorage.shared.merchantUsername,
    andPass: SecureStorage.shared.merchantPassword
)
```

Recupera credenciales de tu API backend segura o almacenamiento local cifrado en tiempo de ejecución. Nunca confirmes credenciales en el control de versiones.

### Gestión del ciclo de vida del delegado

Asegúrate de que tu objeto delegado (usualmente un View Controller) permanezca en memoria durante la duración de la transacción. Si el View Controller es desasignado antes de que se llame a `onPaymentFinished`, no recibirá el resultado de la transacción.

Para aplicaciones complejas con múltiples flujos de pago, considera crear una clase coordinadora de pagos dedicada que implemente los protocolos de delegado y gestione toda la lógica de transacción separadamente de los controladores de vista.

### Configuración del entorno

Usa configuraciones de compilación para gestionar diferentes entornos:

```
#if DEBUG
    CommonUtils.setEntorno("des")
#else
    CommonUtils.setEntorno("real")  // Solo después de certificación
#endif
```

## Solución de problemas

**Validación de Licencia Falla**

Verifica que tu Bundle ID coincida exactamente con lo registrado con Get Mini. Verifica en Xcode bajo **General > Identity > Bundle Identifier**.

**Inicio de Sesión Devuelve Error**

Asegúrate de estar usando el entorno correcto (`"des"` para credenciales de prueba). Verifica que las credenciales sean válidas para el entorno seleccionado.

**Delegados No Llamados**

Confirma que has establecido el delegado antes de llamar a los métodos de pago y que el objeto delegado no ha sido desasignado.

## Próximos pasos

Con el SDK inicializado y la configuración del comercio recuperada, procede a:

* [Inicio rápido: Tu primera venta](/es/get-mini/ios-sdk/first-steps/ios-sdk-quickstart) - Ejemplo de flujo de pago completo
* [Ciclo de vida de la transacción](/es/get-mini/ios-sdk/core-concepts/ios-lifecycle) - Entender las fases del proceso de pago
* [Seguridad y licencias](/es/get-mini/ios-sdk/core-concepts/security-pci) - Aprender sobre las funcionalidades de seguridad del SDK