> For the complete documentation index, see [llms.txt](https://docs.complycube.com/documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.complycube.com/documentation/sdks/sdks-fr/integrations-mobiles/sdk-flutter/integration-guidee-par-les-verifications.md).

# Intégration guidée par les vérifications

## Vue d'ensemble

Ce guide vous guide à travers l’intégration du **SDK Flutter** avec ComplyCube en utilisant l’approche basée sur les contrôles, vous donnant un contrôle direct sur les étapes de vérification individuelles.

<figure><img src="/files/6483733adb6cbbdd3b802c4402bb528629b9c5b4" alt=""><figcaption><p>Vue du SDK mobile</p></figcaption></figure>

{% hint style="warning" %}
Vous consultez le **piloté par des vérifications** guide SDK - une approche qui offre un contrôle détaillé mais qui convient mieux aux **partenaires** ou **cas d’utilisation avancés.**  Nous recommandons d’utiliser **l’intégration des flux de travail** pour la plupart des implémentations.
{% endhint %}

## Flux d'intégration

Le SDK mobile s’exécute dans votre application mobile, mais s’appuie sur votre backend pour créer **des jetons sécurisés**. Voici comment cela fonctionne :

{% stepper %}
{% step %}

#### **Créer un client**

Enregistrez un nouveau **client** (c.-à-d. client) à l’aide de l’API ComplyCube.
{% endstep %}

{% step %}

#### **Générez un jeton SDK**

Votre backend demande un **jeton JWT** lié à ce client.
{% endstep %}

{% step %}

#### Initialisez le SDK dans votre application mobile

Passez le jeton et les paramètres à l’initialiseur du SDK.
{% endstep %}

{% step %}

#### Capturez des documents, des vidéos et des selfies

Le SDK guide votre client à travers les étapes requises.
{% endstep %}

{% step %}

#### Effectuez des vérifications

Les données capturées sont envoyées en toute sécurité à ComplyCube pour les vérifications, et les résultats sont fournis en temps réel via l’API ou les webhooks.
{% endstep %}
{% endstepper %}

<figure><img src="/files/e73166f67b13a0aff209fd48ef5a958e5b0f9d9b" alt=""><figcaption><p>Flux d’intégration du SDK mobile</p></figcaption></figure>

## Guide d'intégration

Explorez le code source et les projets d’exemple dans notre dépôt : [![GitHub](https://img.shields.io/badge/View%20on-GitHub-black?logo=github)](https://github.com/complycube/complycube-flutter-sdk).<br>

{% stepper %}
{% step %}

#### Installer le SDK

{% tabs %}
{% tab title="Flutter" %}

1. Installez le **ComplyCube Flutter** package en exécutant :

   ```bash
   flutter pub add complycube
   ```
2. **iOS**
   1. Terminez les **étapes 1 et 2** dans le **iOS** onglets.
   2. Ajoutez l’extrait ci-dessous à votre `ios/PodFile` et exécutez la `pod install` commande.<br>

      ````ruby
      source 'https://github.com/CocoaPods/Specs.git'

      platform :iOS, '13.0'

      target 'Runner' do
        use_frameworks!
        use_modular_headers!
          ...
          ...
      end
      ...
      post_install do |installer|
       installer.pods_project.targets.each do |target|
         flutter_additional_ios_build_settings(target)
         target.build_configurations.each do |config|
           config.build_settings['ENABLE_BITCODE'] = 'NO'
           config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
           config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64'
           config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0'
         end
       end
      end```
      ````
   3. Complétez **Étapes des permissions de l’application** dans le **iOS** onglets.<br>
3. **Android**
   1. Suivez les étapes dans les **Android** onglet.

{% hint style="danger" %}

#### Ciblage du déploiement iOS

Si vous ciblez une version spécifique d’iOS supérieure à 13.0 pour l’une de vos dépendances et que vous rencontrez l’erreur suivante :<br>

{% code overflow="wrap" %}

```
Compilation pour iOS 13.0, mais le module 'CocoaLumberjack' a une version minimale de déploiement iOS 15.0
```

{% endcode %}

\
Vous pouvez utiliser l’extrait ci-dessous dans votre PodFile `post_install` script.

```ruby
post_install do |installer|
  ios_13_pods = [
    'Sentry',
    'Analytics',
    'Alamofire',
    'SwiftyJSON',
    'JWTDecode',
    'GooglePlaces',
    'lottie-ios'
  ]
  
  installer.pods_project.targets.each do |target|
      ....
      
      # Définir la cible de déploiement en fonction du nom du pod
      if ios_13_pods.any? { |pod_name| target.name.start_with?(pod_name) }
        config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
        puts "Définition de #{target.name} sur iOS 13.0"
      else
        config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0'
      end
      
      ....
```

{% endhint %}
{% endtab %}

{% tab title="iOS" %}

1. Avant d’utiliser le SDK ComplyCube, installez le **CocoaPods** plugin en exécutant la commande suivante dans votre terminal :<br>

   ```bash
   sudo gem install cocoapods
   ```

2. Ajoutez les dépôts du plugin et installez le pod en utilisant votre `Podfile`:<br>

   ```ruby
   source 'https://github.com/CocoaPods/Specs.git'
   …
   platform :iOS, ’13.0’

   target ‘YourApp’ do
       …
     pod 'ComplyCubeMobileSDK'
   end

   post_install do |installer|
       installer.pods_project.targets.each do |target|
           target.build_configurations.each do |build_configuration|
               build_configuration.build_settings['ENABLE_BITCODE'] = 'NO'
               build_configuration.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
               build_configuration.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.1'
               build_configuration.build_settings['ARCHS'] = ['$(ARCHS_STANDARD)', 'x86_64']
               build_configuration.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = ['arm64', 'arm64e', 'armv7', 'armv7s']
               build_configuration.build_settings['GENERATE_INFOPLIST_FILE'] = 'YES'
           end
       end
   end
   ```

\
**Autorisations de l’application**

Notre SDK utilise la caméra et le microphone de l’appareil pour la capture. Vous devez ajouter les clés suivantes à votre application `Info.plist` fichier.

1. `NSCameraUsageDescription`

```xml
<key>NSCameraUsageDescription</key>
<string>Utilisé pour capturer des données biométriques faciales et des documents</string>
```

2. `NSMicrophoneUsageDescription`

```xml
<key>NSMicrophoneUsageDescription</key>
<string>Utilisé pour capturer des données biométriques vidéo</string>
```

{% endtab %}

{% tab title="Android" %}
Notre SDK nécessite les dépôts ci-dessous.

```java
repositories {
  mavenCentral()
}

dependencies {
    implementation "com.complycube:complycube-sdk:+"
}
```

{% endtab %}
{% endtabs %}
{% endstep %}

{% step %}

#### **Créer un client**

Chaque parcours de vérification commence par un **client** (c.-à-d. le client). Utilisez l’API pour [créer le client](/documentation/api-reference/core-resources/clients/create-a-client.md).

Cela doit être fait sur votre **backend de l’application mobile** serveur, et non dans l’application mobile elle-même.

**Exemple de requête**

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X POST https://api.complycube.com/v1/clients \
     -H 'Authorization: <YOUR_API_KEY>' \
     -H 'Content-Type: application/json' \
     -d '{
          "type": "person",
          "email": "john.doe@example.com",
          "personDetails":{
               "firstName": "John",
               "lastName" :"Doe"
          }
        }'
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
const { ComplyCube } = require("@complycube/api");

const complycube = new ComplyCube({ apiKey: "<YOUR_API_KEY>" });

const client = await complycube.client.create({
  type: "person",
  email: "john.doe@example.com",
  personDetails: {
    firstName: "John",
    lastName: "Doe"
  }
});
```

{% endtab %}

{% tab title="Python" %}

```python
from complycube import ComplyCubeClient
cc_api = ComplyCubeClient(api_key='<YOUR_API_KEY>')

new_client = {
    'type':'person',
    'email':'john.doe@example.com',
    'personDetails': {
        'firstName':'John',
        'lastName':'Doe'
    }
}

client = cc_api.clients.create(**new_client)
```

{% endtab %}

{% tab title="PHP" %}

```php
use ComplyCube\ComplyCubeClient;

$ccapi = new ComplyCubeClient('<YOUR_API_KEY>');

$result = $ccapi->clients()->create([
    'type' => 'person',
    'email' => 'john@doe.com',
    'personDetails' => [
        'firstName' => 'John',
        'lastName' => 'Doe'
    ]
]);
```

{% endtab %}

{% tab title=".NET" %}

```csharp
using ComplyCube.Net;
using ComplyCube.Net.Resources.Clients;

var clientApi = new ClientApi(new ComplyCubeClient("<YOUR_API_KEY>"));
var newClient = new ClientRequest {
  type = "person",
  email = "john@doe.com",
  personDetails = new PersonDetails {
    firstName = "John",
    lastName = "Doe"
  }
}

var client = await clientApi.CreateAsync(newClient);
```

{% endtab %}
{% endtabs %}

**Exemple de réponse**

La réponse contiendra un `id` (l’ID du client). Il est requis pour l’étape suivante.

```json
{
    "id": "5eb04fcd0f3e360008035eb1",
    "type": "person",
    "email": "john.doe@example.com",
    "personDetails": {
        "firstName": "John",
        "lastName": "Doe"
    },
    "createdAt": "2020-01-04T17:24:29.146Z",
    "updatedAt": "2020-01-04T17:24:29.146Z"
}
```

{% hint style="info" %}
Voir [Référence de l’API Clients](/documentation/api-reference/core-resources/clients.md) pour en savoir plus.
{% endhint %}
{% endstep %}

{% step %}

#### Générez un jeton SDK

Votre backend doit créer un **jeton SDK** pour chaque nouveau flux. Ce jeton permet aux clients d’envoyer des données personnelles en toute sécurité depuis votre application mobile vers ComplyCube.

Les jetons ont une courte durée de vie et ne doivent pas être réutilisés.

**Exemple de requête**

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X POST https://api.complycube.com/v1/tokens \\
     -H 'Authorization: <YOUR_API_KEY>' \\
     -H 'Content-Type: application/json' \\
     -d '{
           "clientId":"CLIENT_ID",
           "appId": "com.complycube.SampleApp"
         }'
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
const { ComplyCube } = require("@complycube/api");
​
const complycube = new ComplyCube({ apiKey: "<YOUR_API_KEY>" });
​
const token = await complycube.token.generate("CLIENT_ID", {
    appId: "com.complycube.SampleApp"
});
```

{% endtab %}

{% tab title="Python" %}

```python
from complycube import ComplyCubeClient
​
cc_api = ComplyCubeClient(api_key='<YOUR_API_KEY>')
​
token = cc_api.tokens.create('CLIENT_ID', appId='com.complycube.SampleApp')
```

{% endtab %}

{% tab title="PHP" %}

```php
use ComplyCube\ComplyCubeClient;

$ccapi = new ComplyCubeClient('<YOUR_API_KEY>');

$token = $ccapi->tokens()->generate('CLIENT_ID', 'com.complycube.SampleApp');
```

{% endtab %}

{% tab title=".NET" %}

```csharp
using ComplyCube.Net;
using ComplyCube.Net.Resources.SDKTokens;

var sdkTokenApi = new SDKTokenApi(new ComplyCubeClient("<YOUR_API_KEY>"));

var sdkTokenRequest = {
  clientId = "CLIENT_ID",
  appId = "com.complycube.SampleApp"
}

var sdkToken = await sdkTokenApi.GenerateToken(sdkTokenRequest);
```

{% endtab %}
{% endtabs %}

**Exemple de réponse**

```json
{
    "token": "<CLIENT_TOKEN>"
}
```

{% hint style="info" %}
Voir [Référence de l'API du jeton SDK](/documentation/api-reference/other-resources/tokens.md) pour en savoir plus.
{% endhint %}
{% endstep %}

{% step %}

#### Préparez les étapes

Configurez les étapes que vous souhaitez inclure dans votre flux.

```dart
étapes finales = [
  {
    "name": 'intro',
    "heading": 'Vérification d'identité Green Bank',
  },
  {
    "name": 'documentCapture',
    "showGuidance": false,
    "useMLAssistance": true,
    "retryLimit": 1,
    "documentTypes": {
      "passport": true,
      "driving_license": ['GB', 'FR'],
    },
  },
  'faceCapture',
];
```

{% endstep %}

{% step %}

#### Initialiser le SDK

Vous pouvez maintenant initialiser un flux. La séquence d’étapes que vous spécifiez détermine l’ordre dans lequel votre client voit ces étapes.

```dart
import 'package:complycube_flutter/ComplyCubeMobileSDK.dart';
// ...

final settings = {
  "clientID": "<CLIENT_ID>",
  "clientToken": "<CLIENT_TOKEN>",
  "stages": stages,
  // ...
}


return MaterialApp(
  home: Scaffold(
    appBar: AppBar(
      title: const Text('Intégration ComplyCube'),
    ),
    body: Center(
      child: ElevatedButton(
        onPressed: () => ComplyCube.start(settings),
        child: const Text('Démarrer la vérification'),
      ),
    ),
  ),
);
```

{% endstep %}

{% step %}

#### Effectuer des vérifications

À l’aide des résultats renvoyés dans le `onSuccess` callback, vous pouvez déclencher votre **backend mobile** afin d’exécuter les contrôles nécessaires sur votre client.

Par exemple, utilisez le résultat d’une capture de selfie et de document comme suit :

* `result.documentId` pour lancer une [Contrôle du document](https://docs.complycube.com/api-reference/check-types/document-check).
* `result.documentId` et `result.livePhotoId` pour lancer une [Contrôle d’identité](https://docs.complycube.com/api-reference/check-types/identity-check).

**Exemple de requête pour un contrôle du document**

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X POST https://api.complycube.com/v1/checks \
     -H 'Authorization: <YOUR_API_KEY>' \\
     -H 'Content-Type: application/json' \\
     -d '{
            "clientId":"CLIENT_ID",
            "type": "document_check",
            "documentId":"DOCUMENT_ID"
         }'
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
const { ComplyCube } = require("@complycube/api");

const complycube = new ComplyCube({ apiKey: "<YOUR_API_KEY>" });

const check = await complycube.check.create("CLIENT_ID", {
    type: "document_check",
    documentId: "DOCUMENT_ID"
});
```

{% endtab %}

{% tab title="Python" %}

```python
from complycube import ComplyCubeClient

cc_api = ComplyCubeClient(api_key='<YOUR_API_KEY>')

check = cc_api.checks.create(
    "CLIENT_ID", 
    "document_check", 
    documentId="DOCUMENT_ID"
)
```

{% endtab %}

{% tab title="PHP" %}

```php
use ComplyCube\ComplyCubeClient;

$ccapi = new ComplyCubeClient('<YOUR_API_KEY>');

$result = $ccapi->checks()->create('CLIENT_ID', [
    'type' => 'document_check',
    'documentId' => 'DOCUMENT_ID'
]);
```

{% endtab %}

{% tab title=".NET" %}

```csharp
using ComplyCube.Net;
using ComplyCube.Net.Resources.Checks;

var checkApi = new CheckApi(new ComplyCubeClient("<YOUR_API_KEY>"));

var checkRequest = new CheckRequest {
  clientId = "CLIENT_ID",
  type = "document_check",
  documentId = "DOCUMENT_ID"
};

var check = await checkApi.CreateAsync(checkRequest);
```

{% endtab %}
{% endtabs %}

Si vous avez configuré les webhooks comme décrit dans notre [guide des webhooks](https://docs.complycube.com/documentation/guides/webhooks), vous serez informé lorsqu'une vérification sera terminée.

Pour récupérer les résultats de la vérification, vous pouvez effectuer une requête GET [requête de vérification](https://docs.complycube.com/api-reference/checks/get-a-check).
{% endstep %}

{% step %}

#### Récupérer les résultats de vérification

Votre backend mobile peut récupérer tous les résultats de contrôle à l’aide de notre API.

Tous nos contrôles sont **asynchrones.** Si vous avez [configuré des webhooks](https://docs.complycube.com/api-reference/other-resources/webhooks/create-a-webhook) comme décrit dans notre [guide des webhooks](https://docs.complycube.com/documentation/guides/webhooks), vous serez informé lorsqu'une vérification sera terminée.

Pour récupérer les résultats de la vérification, vous pouvez effectuer une requête GET [requête de vérification](https://docs.complycube.com/api-reference/checks/get-a-check).

**Exemple de requête**

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X GET https://api.complycube.com/v1/checks/{:checkId} \\
     -H 'Authorization: <YOUR_API_KEY>' 
```

{% endtab %}

{% tab title="Node.js" %}

```javascript
const { ComplyCube } = require("@complycube/api");

const complycube = new ComplyCube({ apiKey: "<YOUR_API_KEY>" });

const check = await complycube.check.get("CHECK_ID");
```

{% endtab %}

{% tab title="Python" %}

```python
from complycube import ComplyCubeClient

cc_api = ComplyCubeClient(api_key='<YOUR_API_KEY>')

check = cc_api.checks.get('CHECK_ID')
```

{% endtab %}

{% tab title="PHP" %}

```php
use ComplyCube\ComplyCubeClient;

$ccapi = new ComplyCubeClient('<YOUR_API_KEY>');

$check = $ccapi->checks()->get('CHECK_ID');
```

{% endtab %}

{% tab title=".NET" %}

```csharp
using ComplyCube.Net;
using ComplyCube.Net.Resources.Checks;

var checkApi = new CheckApi(new ComplyCubeClient("<YOUR_API_KEY>"));

var check = await checkApi.GetAsync("CHECK_ID");
```

{% endtab %}
{% endtabs %}
{% endstep %}
{% endstepper %}

## Étapes

Chaque étape du flux peut être personnalisée pour créer le parcours idéal pour vos clients.

L’extrait ci-dessous montre comment configurer un flux personnalisé à l’aide du SDK mobile ComplyCube.

```dart
étapes finales = [
  {
    name: 'intro',
    // ... autres paramètres
  },
  {
    name: "consent",
    // ... autres paramètres
  },
  {
    name: 'documentCapture',
    // ... autres paramètres
  },
  {
    name: "faceCapture",
    // ... autres paramètres
  },
  {
    name: "poaCapture",
    // ... autres paramètres
  },
  {
    name: "complete",
    // ... autres paramètres
  }
];

final settings = {
  "clientID": "<CLIENT_ID>",
  "clientToken": "<CLIENT_TOKEN>",
  "stages": stages,
  "language": "en",
  "lookAndFeel": {/*...*/}
}

return MaterialApp(
  home: Scaffold(
    appBar: AppBar(
      title: Text('Intégration ComplyCube'),
    ),
    body: ComplyCubeWidget(settings: settings),
  ),
);
```

### **Bienvenue**

L’écran de bienvenue est toujours affiché en premier dans le processus de vérification. Il affiche un message de bienvenue ainsi qu’un résumé des étapes configurées que l’utilisateur devra compléter.

Vous pouvez personnaliser le titre de l’écran pour l’aligner sur le ton et l’identité visuelle de votre application.

```dart
final settings = {
  // ... autres paramètres
  "stages": [
    {
      "name": "intro",
      "heading": "Titre d'écran personnalisé",
      "message": "Message de bienvenue personnalisé.",
    },
    // ... autres étapes
  ],
};
```

### **Consentement**

Cette étape sert à recueillir le consentement explicite de l’utilisateur avant de poursuivre le flux de vérification. Elle vous aide à répondre aux exigences réglementaires et de conformité, le cas échéant.

Vous pouvez personnaliser le titre de l’écran et le message pour les adapter à vos besoins juridiques ou à votre identité de marque.

```dart
final settings = {
  // ... autres paramètres
  "stages": [
    {
      "name": "consent",
      "heading": "Titre d'écran de consentement personnalisé"
    },
    // ... autres étapes
  ],
};
```

### **Photo et vidéo de selfie**

Vous pouvez demander soit une photo selfie (c.-à-d. une [Photo en direct](/documentation/api-reference/core-resources/live-photos.md)) ou une vidéo selfie (c.-à-d. une [Vidéo en direct](/documentation/api-reference/core-resources/live-videos.md)) du client dans le cadre du processus de vérification biométrique.

* **Photo**: Capture une image fixe et effectue une vérification passive de la vivacité avant d’autoriser l’envoi.
* **Vidéo**: Enregistre une courte vidéo où l’utilisateur effectue un défi affiché à l’écran (par ex. un mouvement de tête ou une phrase à prononcer).

{% hint style="warning" %}
Si vous essayez d’ajouter les deux types d’étapes, le SDK lèvera une **`ComplyCubeErrorCode.BiometricStageCount`** erreur indiquant la présence de plusieurs étapes incompatibles.
{% endhint %}

```dart
final settings = {
  // ... autres paramètres
  "stages": [
    {
      "name": "faceCapture",
      "mode": "photo",
      // Activez l’assistance ML pendant la capture
      "useMLAssistance": false,
    },
    // ... autres étapes
  ],
};
```

```dart
final settings = {
  // ... autres paramètres
  "stages": [
    {
      "name": "faceCapture",
      "mode": "video",
      // Activez l’assistance ML pendant la capture
      "useMLAssistance": false,
    },
    // ... autres étapes
  ],
};
```

### **Document**

L’étape Document permet aux utilisateurs de sélectionner et de capturer un document d’identité à des fins de vérification (par exemple, passeport, carte d’identité, permis de séjour). Vous pouvez personnaliser ces écrans pour :

* Limiter la portée des types de documents que le client peut sélectionner, par exemple, passeport uniquement.
* Définir les pays émetteurs de documents autorisés pour chaque type de document.
* Ajouter ou supprimer la capture automatisée à l’aide d’une assistance intelligente.
* Afficher ou masquer les écrans d’instructions avant la capture.
* Définir une limite de tentatives afin de permettre aux clients de poursuivre le parcours, quelle que soit la qualité de la capture.

{% hint style="info" %}
Si vous fournissez un seul type de document, l’écran de sélection du type de document sera ignoré. L’écran de sélection du pays sera ignoré si vous fournissez un seul pays pour un type de document donné.
{% endhint %}

Vous pouvez contrôler si des écrans d’instructions sont affichés avant chaque capture par caméra en activant ou en désactivant le mode d’assistance. Ne désactivez le mode d’assistance que si vos utilisateurs sont déjà clairement informés des étapes de capture, car ces écrans contribuent à réduire les erreurs des utilisateurs et à améliorer la qualité de la capture.

{% hint style="info" %}
Veuillez noter que le `retryLimit` que vous définissez ici aura priorité sur la limite de tentatives qui a été définie globalement dans vos [paramètres d’automatisation](https://portal.complycube.com/automations).
{% endhint %}

```dart
final settings = {
  // ... autres paramètres
  "stages": [
    {
      "name": "documentCapture",

      // Activez ou désactivez des conseils supplémentaires pour l’utilisateur
      "showGuidance": false,

      // Activez l’assistance ML pendant la capture
      "useMLAssistance": true,

      // Définissez un maximum de tentatives de contrôle qualité avant l’envoi
      "retryLimit": 1,

      // Activez ou désactivez la possibilité de téléverser une image depuis un fichier
      "liveCapture": false,

      // Définissez les types de documents et limitez les pays activés
      "documentTypes": {
        "passport": true,
        "driving_license": ['GB', 'US'],
      },
    },
    // ... autres étapes
  ],
};
```

### Capture NFC

Le SDK mobile ComplyCube prend en charge la lecture basée sur la NFC **puce RFID** des documents d'identité équipés de puces intégrées. Cela permet une extraction sécurisée des données et une authentification documentaire hautement fiable.

{% hint style="info" %}
Veuillez contacter votre **Responsable de compte** ou [service d’assistance](https://support.complycube.com/hc/en-gb/requests/new) pour accéder à notre SDK mobile compatible NFC.
{% endhint %}

#### Prérequis

{% tabs %}
{% tab title="iOS" %}
{% hint style="info" %}
Pour utiliser cette fonctionnalité, votre application doit avoir la **`Lecture des balises Near Field Communication`** capacité activée. Pour ajouter cette capacité à votre application, reportez-vous à [au guide d'Apple ici](https://help.apple.com/xcode/mac/current/#/dev88ff319e7).
{% endhint %}

1. Installez le **CocoaPods Artifactory** plugin en exécutant la commande suivante dans votre terminal :<br>

   ```bash
   gem install cocoapods-art
   ```

2. Pour ajouter la bibliothèque, copiez les identifiants de votre dépôt dans un `.netrc` fichier dans votre répertoire personnel et configurez le dépôt :<br>

   <pre class="language-bash" data-overflow="wrap"><code class="lang-bash">pod repo-art add cc-cocoapods-release-local "https://complycuberepo.jfrog.io/artifactory/api/pods/cc-cocoapods-release-local"
   </code></pre>

   \
   N'oubliez pas de récupérer vos identifiants depuis **JFrog** en utilisant le **Set Me Up** bouton [ici](https://complycuberepo.jfrog.io/ui/repos/tree/General/cc-cocoapods-release-local).<br>

3. Ajoutez les dépôts du plugin et installez le pod à l'aide de votre `Podfile`:<br>

   ```ruby
    plugin 'cocoapods-art', :sources => [
      'cc-cocoapods-release-local',
      'trunk'
    ]
    ...
    platform :ios, '13.0' # Ou supérieur

    target 'YourApp' do
      use_frameworks!
      use_modular_headers!
      ...
      pod 'ComplyCubeMobileSDK', '2.0.x-nfc'
      ...
    en
   ```

4. Vous devez ajouter les clés suivantes à votre application `Info.plist` fichier :<br>

   ```xml
   <key>NFCReaderUsageDescription</key>
   <string>Nécessaire pour lire des documents compatibles NFC</string>
   ```

5. Pour lire correctement les balises NFC, vous devez ajouter les entrées suivantes à la cible de votre application `Info.plist` fichier :<br>

   ```xml
   <key>com.apple.developer.nfc.readersession.felica.systemcodes</key>
   <array>
     <string>12FC</string>
   </array>
   <key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
   <array>
     <string>A0000002471001</string>
     <string>A0000002472001</string>
     <string>00000000000000</string>
     <string>D2760000850101</string>
     <string>E80704007F00070302</string>
     <string>A000000167455349474E</string>
     <string>A00000045645444C2D3031</string>
   </array>
   ```

6. Ajoutez ce qui suit dans votre `Runner.entitlements` fichier :<br>

   ```xml
   <key>com.apple.developer.nfc.readersession.formats</key>
   <array><string>TAG</string></array>
   ```

7. Pour activer NFC lors de la compilation de votre application iOS, transmettez la `USE_CCNFC` variable d'environnement pendant la compilation :<br>

   ```bash
   USE_CCNFC=true flutter build ios
   ```

   \
   Pour conserver cette option activée pour toutes les compilations iOS, ajoutez la ligne suivante en haut de votre `ios/Podfile`:<br>

   ```ruby
   ENV['USE_CCNFC'] ||= 'true'
   ```

{% endtab %}

{% tab title="Android" %}

1. Commencez par ajouter vos identifiants d’accès au dépôt du SDK ComplyCube compatible NFC dans le `gradle.properties` fichier de votre **application mobile**:

```gradle
USE_NFC=true
artifactory_contextUrl=https://complycuberepo.jfrog.io/artifactory/cc-gradle-release
artifactory_user=<YOUR_USERNAME>
artifactory_password=<YOUR_PASSWORD>
```

> Remplacez <**YOUR\_USERNAME**> et <**YOUR\_PASSWORD**> par vos identifiants Artifactory ComplyCube. Si vous n’avez pas accès, contactez le support ComplyCube pour demander des identifiants.

2. Ensuite, mettez à jour le fichier de niveau projet `build.gradle` ou `build.gradle.kts` avec les paramètres Maven du dépôt du SDK ComplyCube :

{% tabs %}
{% tab title="Groovy" %}

```javascript
repositories {
    google()
    mavenCentral()
    maven {
        url project.findProperty("artifactory_contextUrl")
        credentials {
            username = project.findProperty("artifactory_user")
            password = project.findProperty("artifactory_password")
        }
    }
}
```

{% endtab %}

{% tab title="Kotlin" %}

```python
repositories {
    google()
    mavenCentral()
    maven {
        url = uri(project.findProperty("artifactory_contextUrl") as String)
        credentials {
            username = project.findProperty("artifactory_user") as String?
            password = project.findProperty("artifactory_password") as String?
        }
    }
}
```

{% endtab %}
{% endtabs %}
{% endtab %}
{% endtabs %}

#### Activation de la capture NFC

```dart
final settings = {
    // ... autres paramètres
    "stages" : [
      {
        "name": "documentCapture",
        // Ajoutez cette propriété pour activer NFC
        "nfcEnabled": true
        ...
      },
      // ... autres étapes
    ]
}
```

### **Capture d’adresse**

Cette étape permet aux utilisateurs de saisir manuellement leur adresse résidentielle. Vous pouvez la personnaliser pour :

* Restreindre la saisie à des pays spécifiques
* Activer ou désactiver la fonction de saisie semi-automatique de l’adresse pour une saisie plus rapide et plus précise

```dart
final settings = {
  // ... autres paramètres
  stages: [
    {
      "name": "addressCapture",

      // Cela active notre fonctionnalité de saisie semi-automatique d’adresse
      "useAutoComplete": false,
      
      // Liste des pays acceptables pour la capture d’adresse
      "allowedCountries": ['GB','US']
    },
    // ... autres étapes
  ],
};
```

### **Justificatif de domicile**

Cette étape permet aux clients de soumettre un document vérifiant leur adresse de résidence. Vous pouvez configurer les types de documents acceptés, comme les factures de services publics ou les relevés bancaires, et choisir si les clients peuvent téléverser un fichier ou doivent capturer le document en direct à l’aide de la caméra de leur appareil.

{% hint style="info" %}
Par défaut, cette étape inclut le **étape de capture de l’adresse** avec l’autocomplétion activée pour aider les utilisateurs lors de la saisie. L’autocomplétion peut être désactivée si elle n’est pas nécessaire.
{% endhint %}

```dart
final settings = {
  // ... autres paramètres
  stages: [
    {
      "name": "poaCapture",

      // Lorsqu’elle est désactivée, le client sera contraint d’effectuer une capture en direct
      "liveCapture": false,
    },
    // ... autres étapes
  ],
};
```

### **Finalisation**

Vous pouvez inclure une étape de finalisation à la fin du flux afin de confirmer que le processus s’est terminé avec succès. Cet écran offre à l’utilisateur un point de fin clair et peut être personnalisé pour afficher un message de confirmation ou les étapes suivantes.

```dart
final settings = {
  // ... autres paramètres
  "stages": [
    {
      "name": "complete",
      "heading": "Merci !",
      "message": "Votre soumission KYC a été finalisée.",
    },
    // ... autres étapes
  ],
};
```

## Branding

Le SDK vous permet de personnaliser l’interface utilisateur pour l’aligner sur l’identité visuelle de votre application. Vous pouvez définir les couleurs principales et d’accentuation lors de la configuration afin d’aligner le flux de vérification sur les lignes directrices de votre marque. En savoir plus sur nos **propriétés d’apparence** (voir ci-dessous).

```dart
final settings = {
  // ...
  "lookAndFeel": {
    // Couleur d’arrière-plan du bouton d’action principal
    "primaryButtonBgColor": '#FFFFFF',
    
    // Forcez le SDK en mode 'dark', 'light' ou 'inherit'
    "uiInterfaceStyle": "dark"
  }
}
```

Pour désactiver l'affichage de l'en-tête dans le widget ComplyCube SDK sur **Android**, veuillez insérer la ligne suivante dans `styles.xml`:

```xml
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
  ...
  <item name="windowActionBar">false</item>
  <item name="windowNoTitle">true</item>
  ...
</style>
...
```

<details>

<summary>Propriétés d’apparence</summary>

<table><thead><tr><th width="371.70703125">Propriété d’apparence</th><th>Description</th></tr></thead><tbody><tr><td><code>primaryButtonBgColor</code></td><td>Couleur d’arrière-plan du bouton d’action principal.</td></tr><tr><td><code>primaryButtonTextColor</code></td><td>Couleur du texte du bouton d’action principal.</td></tr><tr><td><code>primaryButtonBorderColor</code></td><td>Couleur de la bordure du bouton d’action principal.</td></tr><tr><td><code>secondaryButtonBgColor</code></td><td>Couleur d’arrière-plan du bouton secondaire.</td></tr><tr><td><code>secondaryButtonPressedBgColor</code></td><td>Couleur d’arrière-plan du bouton d’action secondaire enfoncé.<br><br><em>Non pris en charge par Android.</em></td></tr><tr><td><code>secondaryButtonTextColor</code></td><td>Couleur du texte du bouton d’action secondaire.</td></tr><tr><td><code>secondaryButtonBorderColor</code></td><td>Couleur de la bordure du bouton d’action secondaire.</td></tr><tr><td><code>documentTypeSelectorBgColor</code></td><td>Couleur du bouton de sélection du type de document.</td></tr><tr><td><code>documentTypeSelectorBorderColor</code></td><td>Couleur de la bordure du bouton de sélection du type de document.</td></tr><tr><td><code>documentTypeSelectorTitleTextColor</code></td><td>Couleur du texte du titre de la sélection du type de document.</td></tr><tr><td><code>documentTypeSelectorDescriptionTextColor</code></td><td>Couleur du texte de description de la sélection du type de document.</td></tr><tr><td><code>documentTypeSelectorIconColor</code></td><td>Couleur de l’icône de sélection du type de document.</td></tr><tr><td><code>bodyTextColor</code></td><td>Couleur du texte du corps de l’écran.</td></tr><tr><td><code>linkButtonTextColor</code></td><td>Couleur des liens.<br><br><em>Non pris en charge par Android.</em></td></tr><tr><td><code>headingTextColor</code></td><td>Couleur du texte du titre.</td></tr><tr><td><code>subheadingTextColor</code></td><td>Couleur du texte du sous-titre.</td></tr><tr><td><code>infoPanelTitleColor</code></td><td>Couleur du titre du panneau d’informations.</td></tr><tr><td><code>infoPanelDescriptionTextColor</code></td><td>Couleur du texte de description du panneau d’informations.</td></tr><tr><td><code>infoPanelBgColor</code></td><td>Couleur d’arrière-plan du panneau d’informations.</td></tr><tr><td><code>infoPanelIconColor</code></td><td>Couleur de l’icône du panneau d’informations.</td></tr><tr><td><code>errorPanelTitleColor</code></td><td>Couleur du titre du panneau d’erreur.</td></tr><tr><td><code>errorPanelDescriptionTextColor</code></td><td>Couleur du texte de description du panneau d’erreur.</td></tr><tr><td><code>errorPanelBgColor</code></td><td>Couleur d’arrière-plan du panneau d’erreur.</td></tr><tr><td><code>errorPanelIconColor</code></td><td>Couleur de l’icône du panneau d’erreur.</td></tr><tr><td><code>cameraButtonBgColor</code></td><td>Couleur d’arrière-plan du bouton de capture de la caméra.</td></tr><tr><td><code>uiInterfaceStyle</code></td><td>Définissez le SDK pour utiliser le mode sombre, le mode clair ou l’héritage du système.</td></tr></tbody></table>

</details>

## Localisation

Le SDK prend en charge plusieurs langues, notamment celles énumérées ci-dessous.

{% columns %}
{% column %}

* Arabe - `ar` 🇦🇪
* Chinois (simplifié) - `zh` 🇨🇳
* Chinois (traditionnel) - `hk` 🇨🇳
* Néerlandais - `nl` 🇳🇱
* Anglais - `en` 🇺🇸
* Français - `fr` 🇫🇷
* Allemand - `de` 🇩🇪
* Hindi - `hi` 🇮🇳
* Indonésien -  `identifiant` 🇮🇩
* Italien - `it` 🇮🇹
  {% endcolumn %}

{% column %}

* Japonais -  `ja` 🇯🇵
* Coréen -  `ko` 🇰🇷
* Norvégien - `no` 🇳🇴
* Polonais - `po` 🇵🇱
* Portugais - `pt` 🇵🇹
* Espagnol - `es` 🇪🇸
* Suédois - `sv` 🇸🇪
* Thaï -  `th` 🇹🇭
* Vietnamien -  `vi` 🇻🇳
* et plus encore...
  {% endcolumn %}
  {% endcolumns %}

## Gestion des résultats

Pour exécuter les contrôles de vérification, vous devez implémenter les **succès**, **annulé**, et **erreur** callbacks.

En cas d’achèvement réussi (`onSuccess`), vous pouvez déclencher [des requêtes de vérification](/documentation/api-reference/core-resources/checks/create-a-check.md) depuis votre backend en utilisant les identifiants de ressource renvoyés dans l’objet résultat. Ces identifiants correspondent aux éléments téléversés (par ex. documents, selfies) et peuvent être utilisés pour lancer des contrôles de vérification via l’API ComplyCube.

Si l’utilisateur quitte le flux avant la fin, le `onCancelled` callback est appelée avec une raison descriptive indiquant pourquoi la session a été annulée (par ex. sortie de l’utilisateur, délai d’attente, autorisation refusée)

{% hint style="info" %}
Dans certains cas, le client peut annuler le flux après avoir terminé une ou plusieurs étapes de capture. Si cela se produit, toutes les données capturées avant l’annulation, comme des documents ou des médias biométriques, peuvent déjà avoir été téléversées vers son dossier client.
{% endhint %}

Si le SDK rencontre un problème, le `onError` callback est déclenchée avec un `ComplyCubeError` objet contenant le type d’erreur et le message. Consultez les **codes d’erreur** (voir ci-dessous) pour une liste complète des cas d’erreur possibles.

```dart
void onSuccess(dynamic payload) {
  /*
    Traitement des résultats réussis.
    Le parcours par défaut (document d’identité + photo en direct + justificatif de domicile)
    renvoie un payload de la forme :
      {
        "documentIds":  ["xxxxx"],
        "livePhotoIds": ["xxxxx"],
        "poaIds":       ["xxxxx"],
      }
  */
}

void onCancelled(ComplyCubeCancelled event) {
  // Gérer les annulations (event.code, event.reason)
}

void onError(ComplyCubeError error) {
  // Gérer les erreurs (error.code, error.message, error.details)
}

// 1. S’abonner aux événements une seule fois (par ex. dans initState).
ComplyCube.events.listen((event) {
  if (event is ComplyCubeSuccess)   onSuccess(event.payload);
  else if (event is ComplyCubeCancelled) onCancelled(event);
  else if (event is ComplyCubeError)     onError(event);
});

// 2. Lancer le flux.
ComplyCube.start(settings);
```

<details>

<summary>Codes d’erreur</summary>

<table data-full-width="false"><thead><tr><th width="312.48828125">Type d'erreur</th><th>Description</th></tr></thead><tbody><tr><td><code>Nombre d'étapes biométriques</code></td><td>La configuration contient des doublons <strong>photo de selfie</strong> ou <strong>vidéo selfie</strong> étapes.</td></tr><tr><td><code>Annulé</code></td><td>Le client a annulé le flux et quitté le SDK (a déclenché le <code>onCancelled</code> callback).</td></tr><tr><td><code>Connectivité</code></td><td>Une erreur réseau s'est produite.</td></tr><tr><td><code>Document obligatoire</code></td><td>Un <strong>étape de document</strong> est requise en fonction des étapes configurées, mais n'a pas été incluse.</td></tr><tr><td><code>Jeton expiré</code></td><td>Le jeton du SDK a expiré. Générez un nouveau jeton et redémarrez le flux.</td></tr><tr><td><code>Erreur de flux</code></td><td>Une erreur irrécupérable s'est produite pendant le flux.</td></tr><tr><td><code>Code pays invalide</code></td><td>Un code pays invalide a été fourni.</td></tr><tr><td><code>Jailbroken</code></td><td>Le SDK ne peut pas s'exécuter sur cet appareil car il a été jailbreaké ou compromis.</td></tr><tr><td><code>Aucun accès au disque</code></td><td>Le client a refusé les autorisations d'accès au disque requises par le SDK.</td></tr><tr><td><code>Aucun type de document</code></td><td>Un <strong>étape de document</strong> a été initialisé sans spécifier de types de document.</td></tr><tr><td><code>Aucun résultat</code></td><td>Aucun résultat n'a été renvoyé au rappel. Si cela persiste, veuillez contacter l'assistance.</td></tr><tr><td><code>Aucun consentement de l'utilisateur</code></td><td>Le client n'a pas fourni son consentement pour poursuivre le flux du SDK.</td></tr><tr><td><code>Non autorisé</code></td><td>Le SDK a tenté d'accéder à un point de terminaison qu'il n'est pas autorisé à utiliser.</td></tr><tr><td><code>Inconnu</code></td><td>Une erreur inattendue s'est produite. Si cela se reproduit régulièrement, contactez l'assistance.</td></tr><tr><td><code>Combinaison pays/type de document non prise en charge</code></td><td>La combinaison sélectionnée de pays et de type de document n'est pas prise en charge.</td></tr><tr><td><code>Type de document non pris en charge</code></td><td>Le type de document fourni n'est pas pris en charge.</td></tr><tr><td><code>Erreur de téléversement</code></td><td>Une erreur est survenue lors du téléversement d'un document ou d'un selfie.</td></tr><tr><td><code>Téléversement nécessitant une assistance</code></td><td>Si <code>useLiveCaptureOnly</code> est défini sur <code>false</code>, l'assistance doit être activée en définissant <code>isGuidanceEnabled</code> à <code>true</code>.</td></tr></tbody></table>

</details>

## Suivi des événements

Le SDK suit une gamme de **événements** tout au long du parcours de vérification, couvrant toutes les interactions clés des utilisateurs à chaque étape. Consultez ci-dessous la liste des événements.

Si vous devez mettre en œuvre des analyses personnalisées, vous pouvez vous raccorder à ces événements et déclencher en conséquence votre propre logique de suivi.

Pour intégrer votre propre suivi, définissez une fonction et appliquez-la à l’aide de la `onCustomEvent` propriété lors de l’initialisation du widget Flutter :

```dart
void onCustomEvent(ComplyCubeCustomEvent event){
  switch(event.name){
    case 'BIOMETRICS_STAGE_SELFIE_CAMERA':
      print("Le client a accédé à la caméra de capture pour un selfie")
      break;
  }
}

ComplyCubeWidget(
  settings: settings,
  onCustomEvent: onCustomEvent,
  // ...
),
```

<details>

<summary>Événements</summary>

| Événement                                                                                                                                                                                                                 |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><code>INTRODUCTION</code><br><br>Le client a atteint l'écran d'introduction.</p>                                                                                                                                       |
| <p><code>ÉTAPE\_DE\_CONSENTEMENT</code><br><br>Le client a atteint l'écran de consentement.</p>                                                                                                                           |
| <p><code>AVERTISSEMENT\_ÉTAPE\_DE\_CONSENTEMENT</code><br><br>Le client a tenté de quitter sans donner son consentement.</p>                                                                                              |
| <p><code>AUTORISATION\_D'ACCÈS\_À\_LA\_CAMÉRA</code><br><br>Le client a atteint l'écran de demande d'autorisation de la caméra.</p>                                                                                       |
| <p><code>ÉTAPE\_GUIDE\_DE\_CAPTURE\_DE\_DOCUMENT</code><br><br>Le client a atteint l'écran de guide de capture de document.</p>                                                                                           |
| <p><code>ÉTAPE\_TYPE\_DE\_DOCUMENT</code><br><br>Le client a atteint l'écran de sélection du type de document pour une capture de document.</p>                                                                           |
| <p><code>ÉTAPE\_SÉLECTION\_DU\_PAYS</code><br><br>Le client a atteint l'écran de sélection du pays pour une capture de document.</p>                                                                                      |
| <p><code>ÉTAPE\_DOCUMENT\_À\_UNE\_FACE\_CAMÉRA</code><br><br>Le client a atteint l'étape de capture par caméra pour un document d'identité à une face.</p>                                                                |
| <p><code>ÉTAPE\_DOCUMENT\_À\_UNE\_FACE\_CAMÉRA\_MODE\_MANUEL</code><br><br>Le client a atteint l'écran de capture manuelle par caméra pour un document d'identité à une face.</p>                                         |
| <p><code>ÉTAPE\_DOCUMENT\_À\_UNE\_FACE\_VÉRIFICATION\_QUALITÉ</code><br><br>Le client a atteint l'écran d'aperçu de qualité pour un document d'identité à une face.</p>                                                   |
| <p><code>ÉTAPE\_DOCUMENT\_FACE\_AVANT\_CAMÉRA</code><br><br>Le client a atteint l'écran de capture par caméra pour la face avant d'un document d'identité à deux faces.</p>                                               |
| <p><code>ÉTAPE\_DOCUMENT\_FACE\_AVANT\_CAMÉRA\_MODE\_MANUEL</code><br><br>Le client a atteint l'écran de capture manuelle par caméra pour la face avant d'un document d'identité à deux faces.</p>                        |
| <p><code>ÉTAPE\_DOCUMENT\_FACE\_AVANT\_VÉRIFICATION\_QUALITÉ</code><br><br>Le client a atteint l'écran d'aperçu de qualité pour la face avant d'un document d'identité à deux faces.</p>                                  |
| <p><code>ÉTAPE\_DOCUMENT\_FACE\_ARRIÈRE\_CAMÉRA</code><br><br>Le client a atteint l'écran de capture par caméra pour la face arrière d'un document d'identité à deux faces.</p>                                           |
| <p><code>ÉTAPE\_DOCUMENT\_FACE\_ARRIÈRE\_CAMÉRA\_MODE\_MANUEL</code><br><br>Le client a atteint l'écran de capture manuelle par caméra pour la face arrière d'un document d'identité à deux faces.</p>                    |
| <p><code>ÉTAPE\_DOCUMENT\_FACE\_ARRIÈRE\_VÉRIFICATION\_QUALITÉ</code><br><br>Le client a atteint l'écran d'aperçu de qualité pour la face arrière d'un document d'identité à deux faces.</p>                              |
| <p><code>ÉTAPE\_BIOMÉTRIE\_GUIDE\_DE\_CAPTURE\_DE\_SELFIE</code><br><br>Le client a atteint l'écran de guide de capture de selfie.</p>                                                                                    |
| <p><code>ÉTAPE\_BIOMÉTRIE\_CAMÉRA\_SELFIE</code><br><br>Le client a atteint l'écran de capture photo de selfie par caméra.</p>                                                                                            |
| <p><code>ÉTAPE\_BIOMÉTRIE\_CAMÉRA\_SELFIE\_MODE\_MANUEL</code><br><br>Le client a atteint l'écran de capture photo de selfie manuelle par caméra.</p>                                                                     |
| <p><code>ÉTAPE\_BIOMÉTRIE\_VÉRIFICATION\_QUALITÉ\_SELFIE</code><br><br>Le client a atteint l'écran de prévisualisation de la photo de selfie.</p>                                                                         |
| <p><code>ÉTAPE\_BIOMÉTRIE\_CAMÉRA\_VIDÉO</code><br><br>Le client a atteint l'écran de caméra de selfie vidéo.</p>                                                                                                         |
| <p><code>ÉTAPE\_BIOMÉTRIE\_CAMÉRA\_VIDÉO\_MODE\_MANUEL</code><br><br>Le client a atteint l'écran de capture manuelle par caméra pour un selfie vidéo.</p>                                                                 |
| <p><code>ÉTAPE\_BIOMÉTRIE\_PREMIÈRE\_ACTION\_VIDÉO</code><br><br>Le client a atteint la première action d'une capture de selfie vidéo.</p>                                                                                |
| <p><code>ÉTAPE\_BIOMÉTRIE\_DEUXIÈME\_ACTION\_VIDÉO</code><br><br>Le client a atteint la deuxième action d'une capture de selfie vidéo.</p>                                                                                |
| <p><code>ÉTAPE\_BIOMÉTRIE\_VÉRIFICATION\_QUALITÉ\_VIDÉO</code><br><br>Le client a atteint l'écran de capture manuelle par caméra pour un selfie vidéo.</p>                                                                |
| <p><code>ÉTAPE\_GUIDE\_DE\_CAPTURE\_DU\_JUSTIFICATIF\_DE\_DOMICILE</code><br><br>Le client a atteint l'écran de guide de capture du justificatif de domicile.</p>                                                         |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_TYPE\_DE\_DOCUMENT</code><br><br>Le client a atteint l'écran de sélection du type de document pour une capture de justificatif de domicile.</p>                               |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_SÉLECTION\_DU\_PAYS</code><br><br>Le client a atteint l'écran de sélection du pays pour une capture de justificatif de domicile.</p>                                          |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_À\_UNE\_FACE\_CAMÉRA</code><br><br>Le client a atteint l'étape de capture par caméra pour un justificatif de domicile à une face.</p>                                         |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_À\_UNE\_FACE\_CAMÉRA\_MODE\_MANUEL</code><br>Le client a atteint l'étape de capture manuelle par caméra pour un justificatif de domicile à une face.</p>                      |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_À\_UNE\_FACE\_VÉRIFICATION\_QUALITÉ</code><br><br>Le client a atteint l'écran d'aperçu de qualité pour un justificatif de domicile à une face.</p>                            |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_FACE\_AVANT\_CAMÉRA</code><br><br>Le client a atteint l'étape de capture par caméra pour la face avant d'un justificatif de domicile à deux faces.</p>                        |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_FACE\_AVANT\_CAMÉRA\_MODE\_MANUEL</code><br>Le client a atteint l'étape de capture manuelle par caméra pour la face avant d'un justificatif de domicile à deux faces.</p>     |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_FACE\_AVANT\_VÉRIFICATION\_QUALITÉ</code><br>Le client a atteint l'écran d'aperçu de qualité pour la face avant d'un justificatif de domicile à deux faces.</p>               |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_FACE\_ARRIÈRE\_CAMÉRA</code><br><br>Le client a atteint l'étape de capture par caméra pour la face arrière d'un justificatif de domicile à deux faces.</p>                    |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_FACE\_ARRIÈRE\_CAMÉRA\_MODE\_MANUEL</code><br>Le client a atteint l'étape de capture manuelle par caméra pour la face arrière d'un justificatif de domicile à deux faces.</p> |
| <p><code>ÉTAPE\_JUSTIFICATIF\_DE\_DOMICILE\_FACE\_ARRIÈRE\_VÉRIFICATION\_QUALITÉ</code><br>Le client a atteint l'écran d'aperçu de qualité pour la face arrière d'un justificatif de domicile à deux faces.</p>           |
| <p><code>ÉTAPE\_DE\_FINALISATION</code><br><br>Le client a atteint l'écran de fin.</p>                                                                                                                                    |

</details>

## Gestion de l’expiration du jeton

Pour gérer l’expiration du jeton de manière fluide, vous pouvez fournir une fonction de rappel qui génère un nouveau jeton SDK lorsque nécessaire. Cela permet au flux de se poursuivre sans interruption, sans que l’utilisateur ait à redémarrer la session manuellement.

```dart
String onTokenExpiry(String token){
  // Insérez ici votre code personnalisé de renouvellement du jeton
}

ComplyCubeWidget(
  settings: settings,
  onTokenExpiry: onTokenExpiry,
  // ...
),
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.complycube.com/documentation/sdks/sdks-fr/integrations-mobiles/sdk-flutter/integration-guidee-par-les-verifications.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
