# SDK para iOS

> Instalar el SDK de detección de fraude en una app iOS con Swift Package Manager: capacidades, permisos de ubicación, envío de transacciones y cambios.

URL: https://docs.ironchip.com/fraude/sdk/ios/

El SDK de iOS recoge las señales del dispositivo y de su entorno en cada operación sensible y las envía al motor antifraude de Ironchip. Úsalo si tu aplicación móvil es nativa de iOS.

## Requisitos

| Plataforma | Versiones soportadas |
| ---------- | -------------------- |
| iOS        | 13.0.0+              |

## Instalación

### Añadir el paquete con Xcode

1. En Xcode, ve a la raíz de tu aplicación (por ejemplo, `ExampleApp.xcodeproj`), selecciona el elemento `ExampleApp` en **PROJECT** y abre la tercera pestaña, **Package Dependencies**.
2. Haz clic en el botón **+**.
3. En la ventana emergente, pega la URL del repositorio en el campo de búsqueda y haz clic en **Add Package**: [https://github.com/Ironchip-Security/LBFraud-SDK-iOS.git](https://github.com/Ironchip-Security/LBFraud-SDK-iOS.git)
4. En **Dependency Rule**, elige una versión exacta, un rango de versiones o una rama. Elige la versión exacta `1.2.10` (la última publicada) o la regla **Up to Next Major Version** desde `1.2.10`, que facilita las actualizaciones del paquete.

   [Imagen: Ventana de Xcode para añadir el paquete LBFraud con la regla de dependencia]

### Añadir la capacidad de Wi-Fi

Para usar Ironchip LBFraud como Swift Package, añade una capacidad al target de tu aplicación: ve a **Signing & Capabilities** y añade **Access WiFi Information**.

[Imagen: Pestaña Signing & Capabilities de Xcode con la capacidad Access WiFi Information]

### Añadir los permisos de ubicación

En el target de la aplicación, abre la pestaña **Info** y añade estas claves. En cada una, escribe la descripción como cadena de texto:

1. `Privacy - Location Always and When In Use Usage Description`
2. `Privacy - Location When In Use Usage Description`
3. `Privacy - Location Always Usage Description`
4. `LSApplicationQueriesSchemes`: este permiso sirve para saber si el dispositivo tiene jailbreak.

[Imagen: Pestaña Info de Xcode con las claves de permiso de ubicación añadidas]

### Solicitar el permiso de ubicación

Antes de usar el SDK, la aplicación debe solicitar el permiso de ubicación:

```swift
import CoreLocation

let locationManager = CLLocationManager()
locationManager.requestWhenInUseAuthorization()
```

## Uso en una aplicación

Llama al método de inicialización de la biblioteca en el hilo principal.

```swift
import LBFraudSDKiOS
...

// Sustituye apikey por la API key generada en la consola.
let ironchipLBFraud = LBFraudSDK.init(apikey: "XXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
// El SDK envía las transacciones al entorno de producción de Ironchip.

// Analiza una transacción con el motor antifraude de Ironchip
let extraData: [String: Any] = [
    "concept": "Book august",
    "amount": 60,
    "operation": "booking"
]

// transactionId (obligatorio, único): identificador con el que después pedirás el informe
// userId (obligatorio): identificador del usuario
// extraData (opcional): información adicional para el análisis

// sendTransaction admite dos callbacks: el primero se ejecuta al terminar la transacción
// y el segundo si se produce un error durante el proceso.

ironchipLBFraud.sendTransaction(transactionId: "random_identifier_generated", userId: "john.doe@gmail.com", extraData: extraData, finish: {
    // Código a ejecutar cuando la transacción ha terminado.
    }, onError: { err in

    // Código a ejecutar si se produce un error durante la transacción.

    // Ejemplo:
        //if(err is TransactionError) {

            // let transactionError = err as! TransactionError

            // print(transactionError.traceability_id)
            // print(transactionError.message)
            // print(transactionError.http_code)
            // print(transactionError.code)
        //} else {
            // print("NetworkError: ", err)
        //}
    }
)
```

## Ejemplo

Ejemplo completo: tras un inicio de sesión correcto, se anonimiza el identificador del usuario con SHA-256 y se envía la transacción.

```swift
import LBFraudSDKiOS
import Foundation
import CommonCrypto

// Sustituye apikey por la API key generada en la consola.
let ironchipLBFraud = LBFraudSDK.init(apikey: "XXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")

// Inicia sesión y envía la transacción si es correcta
func login(username: String, password: String) {
    Task {
        let loginSuccessful = await performLogin(username: username, password: password)

        if loginSuccessful {
            // Si el inicio de sesión es correcto, llama a sendTransaction con los parámetros necesarios
            let transactionID = generateRandomTransactionID(length: 10) // Genera un ID de transacción único
            let anonymizedUserID = anonymizeUserID(username) // ID de usuario anonimizado

            let extraData: [String: Any] = [
                "amount": 30, // Usa una cantidad apropiada
                "operation": "login" // Especifica la operación
            ]

            await sendTransactionAfterLogin(transactionID: transactionID, anonymizedUserID: anonymizedUserID, extraData: extraData)
        } else {
            // Gestiona el fallo del inicio de sesión
        }
    }
}

// Inicio de sesión simulado y asíncrono
func performLogin(username: String, password: String) async -> Bool {
    try? await Task.sleep(nanoseconds: 2 * 1_000_000_000)

    return true
}

// Envía la transacción tras un inicio de sesión correcto
func sendTransactionAfterLogin(transactionID: String, anonymizedUserID: String, extraData: [String: Any]) async {
    ironchipLBFraud.sendTransaction(transactionId: transactionID, userId: anonymizedUserID, extraData: extraData, finish: {
        // Código a ejecutar cuando la transacción ha terminado.
    }, onError: { err in
        // Código a ejecutar si se produce un error durante la transacción.
    })
}

// Genera un ID de transacción
func generateRandomTransactionID(length: Int) -> String {
    let characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    var randomID = ""
    for _ in 0..<length {
        if let randomCharacter = characters.randomElement() {
            randomID.append(randomCharacter)
        }
    }
    return randomID
}

// Recorta, convierte a minúsculas y calcula el hash del userId
func anonymizeUserID(_ userId: String) -> String {
    let trimmedLowercaseUserID = userId.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
    return sha256Hash(trimmedLowercaseUserID)
}

// Calcula el hash con SHA-256
func sha256Hash(_ input: String) -> String {
    let inputData = Data(input.utf8)
    var hash = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
    inputData.withUnsafeBytes {
        _ = CC_SHA256($0.baseAddress, CC_LONG(inputData.count), &hash)
    }

    return hash.map { String(format: "%02x", $0) }.joined()
}
```

## Registro de cambios

### 1.2.10 (2023-10-11)

**Añadido**

- Detección de comunicación.
- Tipo de red de la SIM (2G, 3G, 4G, 5G).

### 1.2.9 (2023-05-18)

**Añadido**

- Se añade la versión del SDK al modelo de transacción.

### 1.2.8 (2023-05-12)

**Eliminado**

- Se modifica el modelo de transacción para eliminar la información sobre las tarjetas SIM y eSIM del dispositivo.

### 1.2.7 (2023-03-23)

**Añadido**

- Commons se enlaza desde LBFraud en lugar de estar embebido.

### 1.2.6 (2023-03-15)

**Añadido**

- Se modifica el modelo de transacción para incluir información sobre las tarjetas SIM y eSIM del dispositivo.

### 1.2.5 (2023-02-02)

**Cambiado**

- Se modifica el modelo de transacción para incluir el estado de los permisos solicitados.
- Se modifica el modelo de transacción para incluir si los proveedores de GPS y Wi-Fi están habilitados.

### 1.2.4 (2022-12-20)

**Cambiado**

- Corregido el problema al validar la aplicación en la App Store.
- Logs del servicio de ubicación para iOS 13.

### 1.2.3 (2022-12-09)

**Cambiado**

- Corregido un problema con la identificación de la huella digital (fingerprint).
- Gestión de llamadas HTTP externas.

### 1.2.2 (2022-11-30)

**Cambiado**

- Cambian algunas propiedades del dispositivo en el modelo de transacción.

### 1.2.1 (2022-11-22)

**Cambiado**

- Refactorización de nombres de clase.
- Las etiquetas de los logs se cambian para que coincidan con la refactorización.
- El constructor ya no admite un host de URL, solo permite seleccionar el entorno deseado.
- El servicio de GPS lanza un error cuando el permiso no está concedido o la localización está deshabilitada.

### 1.2.0 (2022-10-31)

**Añadido**

- Registros de depuración (logs).

**Cambiado**

- Cambios en el modelo de transacción.
- Gestión de nuevos errores en la biblioteca Commons.

**Eliminado**

- Errores de red personalizados: ahora se lanzan los genéricos.

### 1.1.8 (2022-10-25)

**Cambiado**

- La versión 1.1.7 se promociona a 1.1.8 por motivos organizativos.

### 1.1.7 (2022-10-25)

**Añadido**

- Compatibilidad con iOS 13 y posteriores.

**Cambiado**

- La URL del paquete pasa a GitHub.

### 1.1.6 (2022-09-14)

**Eliminado**

- `print` innecesarios.

### 1.1.5 (2022-09-14)

**Añadido**

- La biblioteca Commons lanza errores personalizados y LBFraud los relanza.

**Cambiado**

- Se renombran los servicios de la biblioteca Commons.

### 1.1.4 (2022-09-12)

**Añadido**

- Fichero `CHANGELOG` en el proyecto.

**Cambiado**

- Cambian los nombres y la estructura de los parámetros del modelo.

### 1.1.2 (2022-09-03)

**Cambiado**

- Cambia el nombre del repositorio del `.xcframework.zip`.

### 1.1.1 (2022-08-27)

**Añadido**

- Ahora el proyecto tiene dos `.xcframework`: uno de la biblioteca Commons y otro de LBFraud.

**Cambiado**

- Ahora el paquete Swift obtiene el `.xcframework` de un repositorio remoto, no de uno local.

### 1.1.0 (2022-08-24)

**Añadido**

- Fichero de licencia (`LICENSE`) en el proyecto.

### 1.0.9 (2022-08-23)

**Añadido**

- Primera versión estable del Swift Package con un XCFramework llamado `LBFraudSDKiOS.xcframework`.
