# SDK para Flutter

> Instalar el plugin de Flutter de detección de fraude: dependencia en pubspec.yaml, permisos de Android e iOS, inicialización, envío de transacciones y proxy.

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

El plugin de Flutter de Ironchip empaqueta los SDK de Android y de iOS para que puedas enviar transacciones al motor antifraude desde una aplicación Flutter con una sola base de código.

## Requisitos

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

## Instalación

El plugin se publica en pub.dev como [`ironchip_lbfraud`](https://pub.dev/packages/ironchip_lbfraud). Añádelo al fichero `pubspec.yaml` de tu paquete:

```yaml title="pubspec.yaml"
dependencies:
  ironchip_lbfraud: ^2.0.13
```

### Permisos en Android

Para usar la detección de fraude en Android se recomiendan algunos permisos. El plugin funciona sin ellos, pero la precisión disminuye. Añádelos a tu aplicación para aprovechar todo su potencial:

```xml title="AndroidManifest.xml"
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

<uses-permission android:name="android.permission.INTERNET" />
```

Recuerda que el usuario tiene que aceptar los permisos para que surtan efecto.

### Configuración en iOS

Para usar Ironchip LBFraud, 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]

Después, añade estas claves al fichero `Info.plist`. En cada una, escribe la descripción como cadena de texto:

```text title="Info.plist"
Privacy - Location Always and When In Use Usage Description
Privacy - Location When In Use Usage Description
Privacy - Location Always Usage Description
LSApplicationQueriesSchemes
```

`LSApplicationQueriesSchemes` sirve para saber si el dispositivo tiene jailbreak.

## Uso

Con el proyecto configurado y los permisos concedidos, importa el paquete:

```dart
import 'package:ironchip_lbfraud/ironchip_lbfraud.dart';
```

Para enviar una transacción, primero inicializa el SDK con una API key válida.

```dart
// Sustituye APIKEY por la API key generada.
// De forma predeterminada, el plugin apunta al entorno de producción. Para apuntar a otro:
// LBFraudSDK fraud = new LbfraudFlutterPlugin.initFraudSDK("APIKEY", env: Environment.testing);
await _lbfraudPlugin.initFraudSDK(apiKey);
```

Una vez inicializado el servicio, ya puedes enviar transacciones:

```dart
try {
  // 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
  // Puedes omitir el await si no necesitas el resultado de la acción.
  var result = await _lbfraudPlugin.sendTransaction(transactionID, userID, {});

  _showResult = result!;
  _resultError = false;
} catch (e) {
  _showResult = e.toString();
  _resultError = true;
}
```

`sendTransaction` es asíncrono, pero no necesitas usar `await` a menos que quieras comprobar el resultado de la acción.

### Configurar un proxy

Si quieres usar un proxy concreto al enviar una transacción, configúralo con `setProxy`:

```dart
try {
  var result = await _lbfraudPlugin.setProxy(host, port);
} catch (e) {
}
```

## Ejemplo

Aplicación de ejemplo completa: inicializa el plugin con la API key que escribe el usuario y envía una transacción con un identificador aleatorio.

```dart
import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:math';

import 'package:flutter/services.dart';
import 'package:ironchip_lbfraud/ironchip_lbfraud.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _lbfraudPlugin = IronchipLbfraud();
  String apiKey =
      "APIKEY"; // Sustituye APIKEY por la API key generada.
  bool _isLbfraudInitialized = false;

  String userID = "john.doe@gmail.com"; // Identificador de usuario
  String _showResult = "";
  bool _resultError = false;

  @override
  void initState() {
    super.initState();
  }

  // Los métodos de LBFraud son asíncronos, así que se inicializan en un método asíncrono.
  Future<void> initLBFraudState() async {
    try {
      // Sustituye APIKEY por la API key generada.
      // De forma predeterminada, el SDK apunta al entorno de producción. Para apuntar a otro:
      // LBFraudSDK fraud = new LbfraudFlutterPlugin.initFraudSDK("APIKEY", env: Environment.testing);
      await _lbfraudPlugin.initFraudSDK(apiKey);

      _isLbfraudInitialized = true;
    } catch (e) {
      _isLbfraudInitialized = false;
    }

    setState(() {
      _isLbfraudInitialized = _isLbfraudInitialized;
    });
  }

  String generateRandomTransactionID(int length) {
    const _chars =
        'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890';
    Random _rnd = Random();

    return String.fromCharCodes(Iterable.generate(
        length, (_) => _chars.codeUnitAt(_rnd.nextInt(_chars.length))));
  }

  Future<void> sendTransaction() async {
    try {
      // 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
      // Puedes omitir el await si no necesitas el resultado de la acción.

      var result = await _lbfraudPlugin
          .sendTransaction(generateRandomTransactionID(10), userID, {});

      _showResult = result!;
      _resultError = false;
    } catch (e) {
      _showResult = e.toString();
      _resultError = true;
    }

    setState(() {
      _resultError = _resultError;
      _showResult = _showResult;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
      appBar: AppBar(
        title: const Text('Ironchip LBFraud example app'),
        backgroundColor: Color(0xFF005255),
      ),
      body: Container(
        margin: EdgeInsets.all(40.0),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              TextField(
                onChanged: (value) {
                  apiKey = value;
                },
                decoration: const InputDecoration(labelText: "API Key"),
              ),
              SizedBox(height: 20),
              Text(
                _isLbfraudInitialized
                    ? "LBFraud initialized"
                    : "LBFraud is not initialized",
                style: TextStyle(
                  color: _isLbfraudInitialized
                      ? Colors.green
                      : Color(0xFFF44336),
                ),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: initLBFraudState,
                style: ElevatedButton.styleFrom(
                  backgroundColor: Colors.green,
                ),
                child: Text('Initialize LBFraud'),
              ),
              TextField(
                onChanged: (value) {
                  userID = value;
                },
                decoration: const InputDecoration(labelText: "User ID"),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _isLbfraudInitialized ? sendTransaction : null,
                style: ElevatedButton.styleFrom(
                  backgroundColor: Colors.green,
                ),
                child: Text('Send Transaction'),
              ),
              SizedBox(height: 20),
              Text(
                _showResult,
                style: TextStyle(
                  color: _resultError ? Color(0xFFF44336) : Colors.black,
                ),
              ),
            ],
          ),
        ),
      ),
    ));
  }
}
```

## Registro de cambios

### 2.0.13 (2024-01-16)

- SDK de Android: `1.2.13`
- SDK de iOS: `1.2.10`

**Cambiado**

- Actualización de la documentación del plugin.

### 2.0.12 (2023-10-17)

- SDK de Android: `1.2.13`
- SDK de iOS: `1.2.10`

**Cambiado**

- La versión 0.0.1 se promueve a 2.0.12 por motivos organizativos.

### 0.0.1 (2023-10-17)

- SDK de Android: `1.2.13`
- SDK de iOS: `1.2.10`

**Cambiado**

- Configuración del proyecto.
