> 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-ios/integration-du-workflow.md).

# Intégration du workflow

## Vue d'ensemble

Ce guide vous guide à travers l’intégration du **SDK iOS** avec ComplyCube [flux de travail](/documentation/product-guides/product-guide-fr/studio-de-conformite/workflows.md).

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

## 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 données, des documents, des vidéos et des selfies

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

{% step %}

#### Effectuer 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/be022624c42fa809972ce98b5352fd6c736b9a74" alt=""><figcaption><p>Guide d’intégration du SDK mobile via les workflows</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-ios-sdk).<br>

{% stepper %}
{% step %}

#### Installer le SDK

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>
```

{% 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 %}

#### Initialiser le SDK

Dans le cadre de l'initialisation du SDK, vous devez spécifier un [ID du modèle de workflow](https://portal.complycube.com/workflowTemplates). Le SDK exécutera automatiquement la **active** version du workflow sélectionné.

```swift
let sdk = ComplyCubeMobileSDK.FlowBuilder()
  .withSDKToken("SDK_TOKEN")
  .withClientId("CLIENT_ID")
  .withWorkflowTemplateId("WORKFLOW_TEMPLATE_ID")
  .start(fromVc: self)

var clientAuth = ClientAuth("SDK_TOKEN", "CLIENT_ID")
```

{% endstep %}

{% step %}

#### Effectuer des vérifications

Une fois que votre client démarre le flux, une [session de flux de travail](/documentation/product-guides/product-guide-fr/studio-de-conformite/workflows.md#workflow-session) est automatiquement créée. Cette session contient toutes les données capturées (documents, images et vidéos), ainsi que le suivi de la progression. Vous pouvez les consulter via la [page des sessions de flux de travail](https://portal.complycube.com/workflowSessions) sur le portail ou via l'API.

Lorsque le flux se termine, le SDK déclenche le `onSuccess` rappel. Le rappel fournit un `données` qui inclut le `workflowSessionId`. Votre **backend mobile** doit utiliser cet identifiant pour informer ComplyCube que le [flux de travail est terminé](/documentation/api-reference/core-resources/workflow-sessions/complete-a-workflow-session.md), ce qui déclenche à son tour les contrôles de vérification définis dans le flux de travail.

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 averti une fois qu'une session de flux de travail sera terminée.

#### Exemple d'une requête complète de session de flux de travail

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

```bash
curl -X POST https://api.complycube.com/v1/workflowSessions/{:wfSessionId}/complete \
     -H 'Authorization: <YOUR_API_KEY>' \\
     -H 'Content-Type: application/json'
```

{% endtab %}

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

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

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

const wfSession = await complycube.workflowSession.complete("WORKFLOW_SESSION_ID");
```

{% endtab %}

{% tab title="Python" %}

```python
from complycube import ComplyCubeClient

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

workflow_session = cc_api.workflowsessions.complete('WORKFLOW_SESSION_ID')
```

{% endtab %}

{% tab title="PHP" %}

```php
use ComplyCube\ComplyCubeClient;

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

$workflowSession = $ccapi->workflowSessions()->complete('WORKFLOW_SESSION_ID');
```

{% endtab %}

{% tab title=".NET" %}

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

var wfSessionApi = new WorkflowSessionApi(new ComplyCubeClient("<YOUR_API_KEY>"));

var workflowSession = await wfSessionApi.CompleteAsync("WORKFLOW_SESSION_ID");
```

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

{% step %}

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

Votre backend mobile peut récupérer les détails de la session de workflow et les résultats de vérification associés à 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.

Vous pouvez récupérer les détails d'une session de flux de travail en appelant la [requête de récupération de session de flux de travail](/documentation/api-reference/core-resources/workflow-sessions/get-a-workflow-session.md).

Pour récupérer les résultats de la vérification, vous pouvez effectuer une [requête GET de vérification](/documentation/api-reference/core-resources/checks/get-a-check.md).

**Exemple de requête de récupération d’une session de workflow**

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

```bash
curl -X GET https://api.complycube.com/v1/workflowSessions/{:workflowSessionId} \
     -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 wfSession = await complycube.workflowSession.get("WORKFLOW_SESSION_ID");
```

{% endtab %}

{% tab title="Python" %}

```python
from complycube import ComplyCubeClient

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

workflow_session = cc_api.workflowsessions.get('WORKFLOW_SESSION_ID')
```

{% endtab %}

{% tab title="PHP" %}

```php
use ComplyCube\ComplyCubeClient;

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

$workflowSession = $ccapi->workflowSessions()->get('WORKFLOW_SESSION_ID');
```

{% endtab %}

{% tab title=".NET" %}

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

var wfSessionApi = new WorkflowSessionApi(new ComplyCubeClient("<YOUR_API_KEY>"));

var workflowSession = await wfSessionApi.GetAsync("WORKFLOW_SESSION_ID");
```

{% endtab %}
{% endtabs %}

**Exemple de requête de récupération d’un contrôle**

{% 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 %}

## 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

{% 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'
   ```

## Branding

Vous pouvez personnaliser les couleurs, les logos et d’autres éléments de marque via la [page des paramètres de l’image de marque](https://portal.complycube.com/settings/branding), si cette option est disponible dans votre forfait.

## 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 une session de vérification, vous devez implémenter le **succès**, **annulé**, et **erreur** callbacks.

En cas d’achèvement réussi (`onSuccess`), vous pouvez déclencher un [requêtes de fin de session de workflow](/documentation/api-reference/core-resources/workflow-sessions/complete-a-workflow-session.md) depuis votre backend en utilisant l'ID de session de workflow renvoyé dans l'objet de résultat.

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.

```swift
extension ViewController: ComplyCubeMobileSDKDelegate {
  func onSuccess(_ result: ComplyCubeResult) {
   /*
    Gestion des résultats réussis :
      Le paramètre « results » contiendra : 
      - "workflowSessionId": "xxxxx"
    */
    print("Le flux est terminé - voici les ID renvoyés")
  }
  
  func onError(_ error: ComplyCubeError) {
    // Gérer les erreurs
    print("Une erreur s'est produite")
  }

  func onCancelled(_ error: ComplyCubeError) {
    // Gérer les annulations
    print("L'utilisateur a annulé le flux ou n'a pas accepté les conditions")
  }  
}
```

<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 `withEventHandler` lors de l’initialisation du `FlowBuilder`:

```swift
let sdk = ComplyCubeMobileSDK.FlowBuilder()
  .withEventHandler({ (event: Event) -> Void in
    // Insérez ici le code de suivi utilisateur personnalisé
  })
```

<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.

```swift
let sdk = ComplyCubeMobileSDK.FlowBuilder()
  .withTokenExpiryHandler({ () -> String in
    // Insérez ici votre code personnalisé de renouvellement du jeton
  })
```


---

# 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-ios/integration-du-workflow.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.
