Release notes, Releases Rn SDK

Migration Guide

Migration to 9.18.0

Summary

approve, getUserScore, faceMatch, and startWorkflow now run through the shared Incode bridge, so each one returns the same payloads and error codes on Android and iOS. The Phone, Email, and FullName modules likewise now take their parameters and results from the shared native contract. Most of the changes below follow from that. Find the APIs your app calls and apply their changes:

API Android iOS What you need to do
approve ✓ ✓ Update result reads and Approve step listeners, and handle userCancelled in catch
getUserScore / UserScore module ✓ ✓ Rename mode to fetchMode, remap field reads, and add error handling
faceMatch ✓ ✓ Derive the match from isFaceMatched, update catch blocks, and guard optional fields
startWorkflow ✓ ✓ Update catch blocks
Phone, Email, and FullName modules ✓ ✓ Rename Name in flow config and listeners, update resultCode comparisons and empty-value checks
iOS specific changes ✓ Apply the changes
Android specific changes ✓ Apply the changes

approve

Approval result fields

approve now resolves the same payload the Approve module step event reports. The status string is replaced by a success boolean, id is renamed to uuid, and a new error field reports an iOS-only approval error. uuid, customerToken, and error are null when the SDK has no value for them; they were previously empty strings.

Previous Current
status: 'approved' | 'failed' success: boolean
id: string uuid: string | null
customerToken: string customerToken: string | null
— error: string | null (iOS only, always null on Android)
- const { status, id, customerToken } = await IncodeSdk.approve({ forceApproval: false });
- if (status === 'approved') { /* ... */ }
+ const { success, uuid, customerToken, error } = await IncodeSdk.approve({ forceApproval: false });
+ if (success) { /* ... */ }

Approve step event payload

ApproveCompleteEvent.result is the same ApprovalResult type, so the Approve module step event changed with it on both platforms. Update onStepCompleted listeners registered for the Approve module.

  IncodeSdk.onStepCompleted({
    module: 'Approve',
-   listener: ({ result }) => console.log(result.status, result.id),
+   listener: ({ result }) => console.log(result.success, result.uuid),
  });

Standalone approve also emits this event on iOS now. It previously fired on Android only, so an iOS listener may see an Approve step event where it saw none before.

Approve now rejects on cancellation

approve rejects the promise on every failure, with the native error code and message. On Android it previously resolved { status: 'userCancelled' } when the user cancelled the section; on iOS the promise never settled at all. Wrap the call in try/catch and handle userCancelled there.

- const result = await IncodeSdk.approve({ forceApproval: false });
- if (result.status === 'userCancelled') { /* ... */ }
+ try {
+   const result = await IncodeSdk.approve({ forceApproval: false });
+ } catch (e) {
+   if (e.code === 'userCancelled') { /* ... */ }
+ }

The other error codes are approvalError (Android only, the approval flow could not be configured) and any IncodeSdkFlowErrorCode value, such as sslPinningFailed or unknown.

An approval that ran but did not approve the user is not an error. It resolves with success: false.

getUserScore and the UserScore module

getUserScore and the UserScore module now share one result shape, produced by the shared Incode bridge, so both platforms return identical payloads.

Renamed getUserScore parameter mode -> fetchMode

-await IncodeSdk.getUserScore({ mode: 'accurate' });
+await IncodeSdk.getUserScore({ fetchMode: 'accurate' });

The old name is no longer read. A call still passing mode does not raise an error, it silently falls back to the accurate default, so update every call site even where TypeScript does not flag it.

Changed the getUserScore result shape

getUserScore now resolves with UserScoreResult instead of the data-wrapped object. The UserScore type is removed.

Previously, as declared by the UserScore type:

{
  extendedUserScoreJsonData: string;
  data: {
    overallScore: string;
    status: 'ok' | 'warn' | 'unknown' | 'fail' | 'manual';
    facialRecognitionScore: string;
    existingUser: boolean;
    idVerificationScore: string;
    livenessOverallScore: string;
  };
}

iOS did not always honour that declaration at runtime — see Changed score value and status formats below.

Now, with every score expressed as a { value, status } pair (… abbreviates that pair):

{
  extendedUserScoreJsonData: string;
  overall: { value: string | null; status: UserScoreStatus | null };
  idValidation?: { overall: …; photoSecurityAndQuality: UserScoreCheck[]; idSpecific: UserScoreCheck[] };
  liveness?: { overall: …; livenessScore: …; photoQuality: string | null };
  faceRecognition?: { overall: …; existingUser: boolean };
  governmentValidation?: { overall: …; recognitionConfidence: …; validationStatus: UserScoreCheck; ocrValidation: UserScoreCheck[] };
}

Map your existing field reads as follows:

Previously Now
result.data.overallScore result.overall.value
result.data.status result.overall.status
result.data.facialRecognitionScore result.faceRecognition?.overall.value
result.data.existingUser result.faceRecognition?.existingUser
result.data.idVerificationScore result.idValidation?.overall.value
result.data.livenessOverallScore result.liveness?.overall.value
result.extendedUserScoreJsonData result.extendedUserScoreJsonData (unchanged)

A section key is present only when the server returned that section, so idValidation, liveness, faceRecognition and governmentValidation are optional and need a ?. guard. overall and extendedUserScoreJsonData are always present.

-const score = await IncodeSdk.getUserScore({ mode: 'accurate' });
-console.log(score.data.overallScore, score.data.status);
-console.log(score.data.livenessOverallScore);
+const score = await IncodeSdk.getUserScore({ fetchMode: 'accurate' });
+console.log(score.overall.value, score.overall.status);
+console.log(score.liveness?.overall.value);

Changed the UserScore module step-complete event

The UserScore module's step-complete event now delivers that same UserScoreResult, so the field mapping in the table above applies here too.

 IncodeSdk.onStepCompleted({
   module: 'UserScore',
   listener: (e) => {
-    console.log(e.result.data.overallScore);
+    console.log(e.result.overall.value);
   },
 });

On iOS the event no longer carries a { debug: … } payload when the score is empty; the result is always well formed.

Changed score value and status formats

These apply to getUserScore and the UserScore module event alike.

  • Android: score values no longer carry the /100 suffix. "80.5/100" is now "80.5". Strip any parsing that split on /.
  • iOS: the warn status was previously reported as warning. Update comparisons against that value.
  • iOS: existingUser is now a boolean rather than the string "true" / "false".
  • Both: absent values are null rather than "". A check like if (score.overall.value) still works, but === '' does not.

extendedUserScoreJsonData carries the same content on both platforms, but not the same bytes: Android re-serializes the parsed response, so key order and numeric formatting can differ. Parse this field, never compare or hash it across platforms.

getUserScore now rejects when the score cannot be fetched

On iOS the promise previously resolved with an empty result when the fetch failed. Both platforms now reject, so add error handling if you did not have it:

-const score = await IncodeSdk.getUserScore({ fetchMode: 'accurate' });
-console.log(score.overall.value);
+try {
+  const score = await IncodeSdk.getUserScore({ fetchMode: 'accurate' });
+  console.log(score.overall.value);
+} catch (error) {
+  console.error(error.code, error.message);
+}

The rejection code is one of:

  • userScoreFailed — the score could not be fetched: a transport or HTTP failure, or a session that produced no score. On Android this replaces the previous behaviour of completing with an empty result.
  • userCancelled — the user cancelled. Not expected in practice, since this call shows no UI, and it never occurs on iOS.

faceMatch

All changes affect the standalone IncodeSdk.faceMatch() only. The FaceMatch module event from startOnboarding/startFlow is unchanged.

Removed status from the result

Derive it from isFaceMatched:

- if (result.status === 'match') { ... }
+ if (result.isFaceMatched === true) { ... }

Not a straight substitution: status was always 'match' or 'mismatch', whereas an absent isFaceMatched now means no comparison was possible.

FaceMatchResult and FaceMatchCompleteEvent were one shared type and are now separate — FaceMatchResult describes only the standalone call. If you used it to type a module event handler, switch to FaceMatchCompleteEvent, which still has status.

Result field existingUser renamed to isExistingUser

Android only — iOS already returned isExistingUser.

- console.log(result.existingUser);
+ console.log(result.isExistingUser);

Rejection codes changed

faceMatchError replaces IncdSDK:faceMatch (iOS) and EUNSPECIFIED (Android). userCancelled replaces Incd::FaceMatch::UserCancelled, matching the Flutter and Cordova SDKs.

  } catch (e) {
-   if (e.code === 'IncdSDK:faceMatch') { ... }
-   if (e.code === 'Incd::FaceMatch::UserCancelled') { ... }
+   if (e.code === 'faceMatchError') { console.log(e.message); }
+   if (e.code === 'userCancelled') { ... }
  }

userCancelled is Android only — iOS has no distinct cancellation signal, so cancellations there reject with faceMatchError. Other SDK methods keep their own Incd::…::UserCancelled codes.

Unavailable fields are omitted on iOS, not defaulted

isFaceMatched, isNameMatched, nfcVsIdConfidence, nfcVsSelfieConfidence, secondIdConfidence were false/0 when the native SDK had no value, and existingInterviewId was "". They are now absent, so a present value is always real.

- if (result.nfcVsIdConfidence > 0.8) { ... }
+ if (result.nfcVsIdConfidence !== undefined && result.nfcVsIdConfidence > 0.8) { ... }

Confidence scores of -1 are omitted on Android, not returned

The native SDK returns -1 for confidence, nfcVsIdConfidence and nfcVsSelfieConfidence when the image needed for the comparison was never uploaded. That -1 used to reach you as if it were a score. The key is now absent instead, matching iOS.

- if (result.confidence === -1) { /* nothing to compare */ }
+ if (result.confidence === undefined) { /* nothing to compare */ }

A 0 is unaffected — it is a real "no match" score.

Resolves instead of rejecting when no confidence score is available

On Android this previously rejected with IncdSDK:faceMatch / Error. It now resolves with the unavailable fields omitted. If you caught that rejection to detect "no comparison possible", check for the absence of isFaceMatched instead.

startWorkflow

Rejection code changed for a missing presenting screen

startWorkflow rejects with unknown on both platforms when there is no screen to present the flow on, matching the code already used for other unclassified failures. This replaces Incd::StartWorkflowException on Android and IncdSDK:startWorkflow on iOS.

  } catch (e) {
-   if (e.code === 'Incd::StartWorkflowException') { ... } // Android
-   if (e.code === 'IncdSDK:startWorkflow') { ... }         // iOS
+   if (e.code === 'unknown') { ... }
  }

Phone, Email, and FullName modules

Name module renamed to FullName

The module is now FullName everywhere — flow configuration, the completion event, and the event type.

- { module: 'Name' }
+ { module: 'FullName' }

Listeners change too:

  IncodeSdk.onStepCompleted({
-   module: 'Name',
+   module: 'FullName',
    listener: (e) => { /* ... */ },
  });

The exported event type is renamed to match:

- import type { NameCompleteEvent } from 'react-native-incode-sdk';
+ import type { FullNameCompleteEvent } from 'react-native-incode-sdk';

Module results share one shape

Phone, Email, and FullName now return the same fields on both platforms.

- { phone: "+15555555555", resultCode: "SUCCESS" }
+ { phone: "+15555555555", status: "success", resultCode: "success" }

status is the portable outcome, resultCode the finer detail. Check existing code for the two changes below, then for the two platform-specific failure changes that follow:

// resultCode values are now camelCase, matching what the types always declared
- if (e.result.resultCode === 'SUCCESS') { ... }
+ if (e.result.resultCode === 'success') { ... }

// the captured value is omitted when the SDK has none, rather than null or ""
- if (e.result.phone !== '') { ... }
+ if (e.result.phone !== undefined) { ... }

Android FullName failure status. A failed FullName used to report the native SDK's error message as status, so the value was an arbitrary sentence. It is now fail, like every other module.

- if (e.result.status !== 'success') { showError(e.result.status); }
+ if (e.result.status !== 'success') { showError(e.result.resultCode); }

iOS Phone failure delivery. A failed Phone used to arrive as a step error on iOS and as a completed event on Android. It is now a completed event carrying status: "fail" on both platforms, matching Email and FullName. If you handled iOS phone failures in an error handler, move that logic to the module listener.

iOS specific changes

New IncodeBridgeCommon pod dependency

The iOS plugin now depends on the IncodeBridgeCommon pod, declared by the plugin itself. No source change is needed in your app, but the new pod has to be resolved, so reinstall the pods after updating the plugin:

pod install

Add URL schemes to Info.plist on iOS

The iOS SDK 5.50.0 jailbreak detection queries a set of URL schemes. Add them to LSApplicationQueriesSchemes in your app's Info.plist:

<key>LSApplicationQueriesSchemes</key>
<array>
  <string>cydia</string>
  <string>undecimus</string>
  <string>sileo</string>
  <string>zbra</string>
  <string>filza</string>
  <string>activator</string>
  <string>installer</string>
  <string>saily</string>
  <string>xina</string>
  <string>dopamine</string>
</array>

If your app already declares LSApplicationQueriesSchemes, keep the existing array and add only the missing entries. Keep the combined list within Apple's limit: 50 entries when linked with iOS 15–26 SDKs, or 25 with iOS 27 and later.

Review OCR required-field marker on iOS

The Review OCR screen now shows a subtitle, "All fields marked with * are required.", and the asterisk moved from a prefix to a suffix (Full name *). If you override the Review OCR strings with setString, set the new incdOnboarding.ocr.requiredSubTitle key too.

Android specific changes

Android theme color positive800 renamed to positive750

The Android SDK 5.54.0 renamed the positive800 color to positive750 (same color) to match Incode Studio's exported palette. If the theme JSON you pass to setTheme sets colorPalette.positive800, rename the key. Unknown keys are ignored, so the old key does not raise an error: the color silently falls back to the default.

  await IncodeSdk.setTheme({
    theme: JSON.stringify({
      colorPalette: {
-       positive800: '#0C5030',
+       positive750: '#0C5030',
      },
    }),
  });

Stricter theme color parsing on Android

setTheme on Android now rejects with appearanceError when a color in the theme JSON is not a string (for example an unquoted number like 123456 or a boolean), or is an empty [light, dark] array. Such themes were previously applied by accident. Quote every color value, for example "#123456".

Migration to 9.17.0

Migration to 9.17.0

Breaking change Android event names delivered through onEvents now use the SDK value form

Every event name delivered through onEvents on Android changed from the SDK enum constant name (for example, USER_CANCELLED, MODULE_OPENED) to the SDK's camelCase value (for example, userCanceled, moduleOpened). This matches what iOS has always emitted. Any code that compares an Android event name against the old constant-name strings must be updated.

  IncodeSdk.onEvents((eventBatch) => {
    for (const e of eventBatch.events) {
-     if (e.event === 'USER_CANCELLED') {
+     if (e.event === 'userCanceled') {
        handleUserCancel();
      }
    }
  });

Also, update every dashboard query, saved report, or server-side rule that matches the old constant-name strings.

This does not affect the flow promises. startOnboarding, startFlow, startWorkflow, and startOnboardingSection still resolve with { status: 'userCancelled' }.

New storageUnavailable flow error code on Android

IncodeSdkFlowErrorCode gains storageUnavailable. Flow APIs reject with it when the device cannot provide a writable images directory at flow start. Code that switches exhaustively over IncodeSdkFlowErrorCode must handle the new value.

Signature V2 title and description string overrides on Android

If the Signature V2 experience is enabled for your account and you override the V1 title and description strings, add the V2 overrides to your Android res/values/strings.xml:

<string name="onboard_sdk_signature_capture_title">Your title</string>
<string name="onboard_sdk_signature_capture_description">Your description</string>

Keep the V1 overrides if your integration still uses Signature V1:

<string name="onboard_sdk_signature_title">Your title</string>
<string name="onboard_sdk_signature_description">Your description</string>

No change is required if you do not override these strings. The title and description parameters of the Signature module keep applying to both versions.

Video Selfie V2 hides the close button on the camera steps on Android

When Video Selfie V2 is enabled for your account, its camera steps hide the close (X) button, so IncodeSdk.showCloseButton(true) does not apply to them. The button still shows on the other screens. Video Selfie V1 keeps the button over the camera. No code change is required. If your users rely on the close button to leave a camera step, tell them about the new behavior or keep Video Selfie V1.

Unit tests that load SQLCipher must run on JVM 17 or later on Android

The Android SDK now uses net.zetetic:sqlcipher-android:4.17.0, which ships Java 17 bytecode. Your app build is not affected: AGP 8 with JDK 17 reads it correctly. JVM unit tests (including Robolectric) that load SQLCipher classes, directly or through SDK code paths that use the encrypted database, must run on JVM 17 or later:

// build.gradle of the module that runs the tests
java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

Instrumented tests on a device or emulator are not affected.

MLConsent status now reflects the user's choice on iOS

The MLConsent module step used to report a successful status whenever the submission call succeeded, even when the user declined the consent. It now reports the choice the user made: a successful status when the consent was accepted and a failed status when it was declined. The consent stays optional and the flow continues in both cases. If your app treats the MLConsent status as submitted, update it to treat a failed status as declined.

A mandatory Combined Consent that has no readable text or checkbox ID can no longer be silently accepted. The module ends and the flow stops with an error delivered to your onError handler, so startOnboarding and startFlow reject with the new combinedConsentsNotReceived code. Text that is empty or only spaces counts as missing text. Give the consent text in Dashboard to clear the error. Optional consents that cannot be shown are still left out and the flow continues, as before.

Migration to 9.16.0

Migration to 9.16.0

Add the IncodeBridgeCommon CocoaPods source

iOS builds now depend on IncodeBridgeCommon. Add this source at the top of your Podfile. Access to Incode's GitHub org is required; if you do not have it, contact your Incode representative.

  source 'https://cdn.cocoapods.org/'
  source 'git@github.com:Incode-Technologies-Example-Repos/IncdDistributionPodspecs.git'
+ source 'git@github.com:Incode-Technologies-Example-Repos/IncodeBridgeCommonPodspecs.git'

Then run pod install --repo-update in the ios folder.

Appearance argument names

These methods use new argument names. Update call sites accordingly.

Method Previous Current
setTheme { jsonTheme } { theme }
setFaceAuthenticationHint string or { faceAuthenticationHint } { identityId }
await IncodeSdk.setTheme({ theme: JSON.stringify(theme) });
await IncodeSdk.setFaceAuthenticationHint({ identityId: 'customer@example.com' });

The TypeScript parameter for showCloseButton is now allowUserToCancel instead of shouldShowCloseButton. JavaScript call sites stay showCloseButton(true) and do not need to change.

Appearance return types

setLocalizationLanguage is now Promise<void>; it was incorrectly typed as Promise<string>. setSdkMode, setTheme, and setUXConfig are now Promise<void>; they were Promise<any>. Call sites that only await these methods do not need to change.

Appearance errors

setTheme and setUXConfig now reject the promise with appearanceError when the payload is missing or invalid. They previously resolved { success: false, error }. Wrap these calls in try/catch if you need to handle a failed theme or UX config.

The other appearance methods (setSdkMode, setString, setLocalizationLanguage, showCloseButton, setFaceAuthenticationHint) already rejected on failure.

iOS promise settlement

On iOS, showCloseButton, setLocalizationLanguage, and setString now wait for the native call to finish before the promise resolves. Previously, those methods were fire-and-forget on iOS; await returned immediately.

Removed parameters

  • Removed the waitForTutorials parameter from the initialize method.

Changed default behavior for SSL pinning

Previously, enabling SSL pinning (sslPinningConfig.enabled: true) always forced pinning enforcement, with no way to opt out. Starting in 9.16.0, forced enforcement is controlled by the new forceSSLPinning field and defaults to false.

If you rely on strict/forced SSL pinning enforcement, you must now explicitly set:

sslPinningConfig: { enabled: true, forceSSLPinning: true }

Omitting forceSSLPinning now results in non-forced enforcement.

Minimum Kotlin version raised to 2.2.x

The Android SDK is compiled with Kotlin 2.2.21. Any module that compiles Kotlin source with the SDK on its classpath must use Kotlin Gradle plugin 2.2.21 or higher.

plugins {
  id 'org.jetbrains.kotlin.android' version '2.2.21'
}

Add required OkHttp packaging exclusion

Add the following exclusion to avoid duplicate-resource packaging collisions:

android {
  packaging {
    resources {
      excludes += ['META-INF/versions/9/OSGI-INF/MANIFEST.MF']
    }
  }
}

Upgrade compileSdk / AGP / Gradle wrapper

compileSdk 36

Use Android Gradle Plugin 8.9.1 or higher and Gradle 8.14.5 or higher.

distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.5-bin.zip

Coroutines floor

If your app pins coroutines explicitly, use:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0'

React Native 0.78 Android build compatibility note

If you hit KotlinTopLevelExtension or Kotlin toolchain alignment issues with React Native 0.78.x and Kotlin 2.2.x, disable RNGP Java/Kotlin auto-alignment and enforce Java 17 compile options in your Android projects.

Changed the signature and functionality of the setQuantityStrings method

Changed the signature and functionality of the `setQuantityStrings` method

The setQuantityStrings method's strings parameter was removed and, in its place, locale and quantityStrings parameters were introduced. The first one accepts a language code such as "en", "es", or "en-US", and the latter a map shaped as plural name → quantity keyword → value. With this change, multi-locale-per-call support was removed. Callers integrating two or more languages must now call the method once per locale, like this:

Before:

await IncodeSdk.setQuantityStrings({
  en: {
    onboard_sdk_validation_attempts_remaining: {
      one: "%d attempt remaining",
      other: "%d attempts remaining"
    }
  },
  es: {
    onboard_sdk_validation_attempts_remaining: {
      one: "%d intento restante",
      other: "%d intentos restantes"
    }
  }
});

After:

await IncodeSdk.setQuantityStrings(
  'en',
  {
    onboard_sdk_validation_attempts_remaining: {
      one: "%d attempt remaining",
      other: "%d attempts remaining"
    }
  }
);

await IncodeSdk.setQuantityStrings(
  'es',
  {
    onboard_sdk_validation_attempts_remaining: {
      one: "%d intento restante",
      other: "%d intentos restantes"
    }
  }
);

Now, when erroring out, the method returns a code specific to the cause of the error alongside a message and native stack trace, instead of returning a SET_QUANTITY_STRINGS_ERROR code.

Migration to 9.15.0

Migration to 9.15.0

Removed parameters

  • Removed disableJailbreakDetection parameter from initialize method.
  • Removed jailbreakDetected from IncodeSdkFlowErrorCode.

Migration to 9.14.0

Migration to 9.14.0

Renamed neutral and black color palette tokens on Android

The neutral and black keys in theme's colorPalette have been renamed:

neutral -> neutralLight black -> neutralDark If you provided the theme via a JSON config, rename the keys inside colorPalette:

"colorPalette": {
+  "neutralLight": "#ffffff",
-  "neutral": "#ffffff",
+  "neutralDark": "#000000",
-  "black": "#000000",
  "brand50": "#e5f0ff",
  ...
  "positive500": "#189F60",
  "positive600": "#189F60",
  "positive800": "#0C5030"
}

Theme JSON that still uses the old neutral / black keys will silently fall back to the defaults (#FFFFFF and #000000), because unknown keys are ignored during parsing. Update your JSON to use the new keys to keep your customizations applied.

Migration to 9.13.0

Migration to 9.13.0

Changed the default values of lensesCheck and faceMaskCheck parameters in SelfieScan module

The default values for lensesCheck and faceMaskCheck parameters in SelfieScan module have been changed from false to true. If you did not previously configure these flags, they will now be enforced by default during face capture. To preserve the previous behavior, explicitly disable these flags.

SQLCipher attribution required if you ship an open-source licenses screen on Android

Local Room databases used by the SDK are now encrypted at rest with SQLCipher for Android, distributed under a BSD-style license. The license requires consumers that redistribute binaries (i.e. your application) to reproduce its copyright notice "in the documentation and/or other materials provided with the distribution".

If your application includes an "Open Source Licenses" screen, please add the SQLCipher notice listed in Licenses. No code change is needed if you do not ship such a screen.

Migration to 9.11.0

Migration to 9.11.0

Removed localization keys on iOS

  • incdOnboarding.nameInfo.lastnamePlaceholder
  • incdOnboarding.ccv.invalidCCV

Renamed localization keys on iOS

  • incdOnboarding.email.title -> incdOnboarding.userInformation.email.title
  • incdOnboarding.email.invalidEmail -> incdOnboarding.userInformation.email.wrongFormat
  • incdOnboarding.ccv.title -> incdOnboarding.userInformation.securityCode.title
  • incdOnboarding.nameInfo.title -> incdOnboarding.userInformation.fullName.title
  • incdOnboarding.nameInfo.subtitle -> incdOnboarding.userInformation.fullName.subtitle
  • incdOnboarding.nameInfo.namePlaceholder -> incdOnboarding.userInformation.fullName.placeholder
  • incdOnboarding.nameInfo.continue -> incdOnboarding.userInformation.continue
  • incdOnboarding.ekyc.input.label.fillYourCredentials -> incdOnboarding.ekyc.input.title

Migration to 9.10.0

Migration to 9.10.0

Removed parameters

  • Removed disableHookDetection, disableEmulatorDetection, disableRootDetection, disableVirtualEnvironmentDetection parameters from init method.
  • Removed simulatorDetected, rootDetected, hookDetected, virtualEnvDetected from IncodeSdkFlowError.

Color palette changes on Android

If you previously customized the application appearance by updating these colors from the color palette:

{
    "colorPalette": {
        "negative500": "#FF5A5F",
        "negative600": "#E71111",
        "positive500": "#189F60",
        "positive600": "#189F60"
    }
}

These keys have now been migrated to the following values:

  • negative500 -> negative400
  • negative600 -> negative500
  • positive500 -> positive400
  • positive600 -> positive500

The mentioned colors are used for the following Color Modes:

  • Icon/Status/Negative
  • Icon/Status/Positive
  • Surface/Status/Positive
  • Border/Status/Negative Static
  • Border/Status/Positive Static

ID Capture V2 - Error Screen Customization on Android

Wrong document side customization:

If you previously customized the Wrong document side error screen, add the following new string resources:

Add these strings:

<string name="onboard_sdk_id_capture_error_side_front">Capture the front side of the ID</string>
<string name="onboard_sdk_id_capture_error_side_back">Capture the back side of the ID</string>

Previous string:

<string name="onboard_sdk_id_capture_error_side">You’ve scanned the wrong document side. Please scan your document again.</string>

This string is no longer used.

No internet connection customization:

If you previously customized the No internet connection error screen, add the following new string resource:

Add this string:

<string name="onboard_sdk_no_internet_title">No internet connection</string>

Previous string:

<string name="onboard_sdk_id_capture_error_title">There was a problem</string>

The previously used string is still in use for other error screens and should be kept in your resources.

Retry button customization:

The retry button is now customized using a different string resource:

<string name="onboard_sdk_id_capture_retry">Refresh</string>

Previous string:

<string name="onboard_sdk_no_network_snackbar_action_text">Retry</string>

The previously used string is still in use for other error screens and should be kept in your resources.

Selfie V2 - Error Screen Customization on Android

No internet connection customization:

If you previously customized the No internet connection error screen, add the following new string resource:

Add this string:

<string name="onboard_sdk_no_internet_title">No internet connection</string>

Previous string:

<string name="onboard_sdk_face_scan_failed_feedback_selfie_capture_failed_title">There was a problem</string>

The previously used string is still in use for other error screens and should be kept in your resources.

Changes in behavior for device environment detection on Android

The behavior when detecting device environment vulnerabilities has changed:

  • Hook or virtual environment detection: Detecting hook or virtual environment vulnerabilities in the SDK triggers a native crash, which cannot be caught or handled by application code, resulting in immediate app termination.
  • Emulator and root detection: The flow is not aborted when emulator and root checks are detected. The onboarding process continues normally.

Expected crashes when running in a virtual environment on Android

It is expected that the app crashes with the following stacktraces when a virtual environment is used. For example:

java.lang.NullPointerException
    at com.incode.welcome_sdk.ThemeConfiguration$Builder.setLabelSmallStyle(SourceFile:1066)
    at com.incode.welcome_sdk.f.c(SourceFile:150)
    at com.incode.welcome_sdk.data.local.m.as(SourceFile:22)
    at com.incode.welcome_sdk.IncodeWelcome.startOnboardingSection(SourceFile:18)
java.lang.NullPointerException: Attempt to get length of null array
    at com.incode.welcome_sdk.data.IncodeWelcomeRepository.d(SourceFile:320)
    at com.incode.welcome_sdk.data.IncodeWelcomeRepository.i(SourceFile:214)

Selfie V2 - No Internet Error Screen Retry Button Change on Android

Retry button customization:

The retry button label shown on the Selfie Scan no internet error screen now uses a dedicated string resource:

<string name="onboard_sdk_face_scan_retry">Refresh</string>

Previous string:

<string name="onboard_sdk_try_again">Try again</string>

If you override onboard_sdk_try_again to customize the retry button on the no internet screen, you must now override onboard_sdk_face_scan_retry instead. The onboard_sdk_try_again string is still used for other retry scenarios.

Selfie V2 - Capture-Only Mode Success Screen Text Change on Android

Success label customization:

In capture-only mode, the Selfie Scan success screen now uses a different string resource:

<string name="onboard_sdk_face_captured">Face captured!</string>

Previous string:

<string name="onboard_sdk_enroll_success">Success!</string>

The previously used string is still in use for non-capture-only mode and should be kept in your resources.

ID Capture and Selfie V2 - Permission Open Settings Screen Text Change on Android

Open settings button customization:

The Open settings label shown on the Permission open settings screen now uses a dedicated string resource:

<string name="onboard_sdk_permission_allow_permission_action">Allow permission</string>

Previous string:

<string name="onboard_sdk_permission_open_setting_action">Open settings</string>

The previously used string is still in use for the Geolocation module and should be kept in your resources.

Migration to 9.9.0

Migration to 9.9.0

Parameter Updates in IdScan module

  • Remove usage of enableRotationOnRetakeScreen (this parameter has been removed).
  • Replace showRetakeScreen with showRetakeScreenForManualCapture.
  • Replace showAutoCaptureRetakeScreen with showRetakeScreenForAutoCapture.

Upload error screen customization on Android:

If you previously customized the upload error screen, add the following new string resource:

Add this string: <string name="onboard_sdk_validation_error_button_text">Scan your ID</string>

Previous string: <string name="onboard_sdk_id_capture_tutorial_title">Scan your ID</string>

This string is now used only for customizing the ID Capture V2 tutorial screen title.

Changed default values in FaceMatch module config on Android (optional)

With the move to UxV2, the showUserExists config is now false by default.

Migration to 9.8.0

  • Removed enableRotationOnRetakeScreen parameter for IDScan module.

Update string resources for the "Need Help" screen in the IdScan v2 module on Android

The "Need Help" screen has been redesigned on Android, and the customizable strings have been replaced. If you override any of the following strings in your app, replace them with the new ones listed below.

No action is required if you do not override these strings.

Replaced string resources

Replace overrides of:

<string name="onboard_sdk_id_capture_help_title">Need help?</string>
<string name="onboard_sdk_id_capture_help_subtitle">Some considerations</string>
<string name="onboard_sdk_id_capture_help_manual_photo_button_text">Take the photo manually</string>
<string name="onboard_sdk_id_capture_help_align_title">Center your document in the frame</string>
<string name="onboard_sdk_id_capture_help_align_subtitle">The photo will be taken automatically</string>
<string name="onboard_sdk_id_capture_help_blur_title">Avoid blurriness on the document</string>
<string name="onboard_sdk_id_capture_help_blur_subtitle">Zoom in and out, or tap on the document</string>
<string name="onboard_sdk_id_capture_help_glare_title">Avoid glare on the document</string>
<string name="onboard_sdk_id_capture_help_glare_subtitle">Find a better lighting to avoid reflections</string>
<string name="onboard_sdk_id_capture_help_darkness_title">Avoid darkness on the document</string>
<string name="onboard_sdk_id_capture_help_darkness_subtitle">Find a place with better lighting</string>

with:

<string name="onboard_sdk_id_capture_common_issues_title">Common issues</string>
<string name="onboard_sdk_id_capture_common_issues_glare_title">Glare present</string>
<string name="onboard_sdk_id_capture_common_issues_glare_subtitle">Tilt the ID slightly up or down to minimize the reflection</string>
<string name="onboard_sdk_id_capture_common_issues_blur_title">Blur present</string>
<string name="onboard_sdk_id_capture_common_issues_blur_subtitle">Move ID further away or closer to your phone until the image is focused</string>
<string name="onboard_sdk_id_capture_common_issues_info_not_readable_title">Info is not readable</string>
<string name="onboard_sdk_id_capture_common_issues_info_not_readable_subtitle">Minimize camera shake by holding your phone steady</string>
<string name="onboard_sdk_id_capture_common_issues_try_again_button">@string/onboard_sdk_try_again</string>

Upgrade compileSdk on Android

With the update of the internal CameraX dependencies, you will need to upgrade your project's compileSdk to level 35. CameraX 1.6.1 already pulls kotlinx-coroutines transitively, so no manual dependency declaration is needed. The minimum supported kotlinx-coroutines version is 1.9.0:

compileSdk 35

Update Gradle Wrapper on Android

Android Gradle Wrapper 8.6.0 requires Gradle 8.7 or higher. Update your Gradle wrapper configuration in gradle/wrapper/gradle-wrapper.properties:

distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip

If you use any of the following optional dependencies on Android, make sure to update to the latest versions

implementation 'com.incode.sdk:nfc:1.5.1'

Migration to 9.6.0

Migration to 9.6.0

E2EE variant removed

RN SDK 'e2ee' variant is no longer distributed, as e2ee functionality is now offered in a standard RN SDK variant.

Android optional dependencies

For Android, if you use any of the following optional dependencies, make sure to update to the latest versions

implementation 'com.incode.sdk:nfc:1.4.4'
implementation 'com.incode.sdk:video-streaming:1.6.0'
implementation 'com.incode.sdk:extensions:1.2.1'
implementation 'com.incode.sdk:model-face-recognition:3.5.1'
implementation 'com.incode.sdk:model-id-face-detection:3.5.1'
implementation 'com.incode.sdk:model-liveness-detection:3.2.1'

Android minSdk changes

For Android, if you use the video-streaming dependency, you need to upgrade your minSdk to 24 or higher. The requirement is coming from the OpenTok dependency, which now requires a minimum SDK version of 24. This update is necessary to ensure compatibility with the 16KB page size support mandated by Google starting from November 1st 2025. More info (https://developer.android.com/guide/practices/page-sizes).

Migration to 9.5.0

Migration to 9.5.0

Optional dependencies

For Android, if you use any of the following optional dependencies, make sure to update to the latest versions:

implementation 'com.incode.sdk:extensions:1.2.0'
implementation 'com.incode.sdk:nfc:1.4.3'

Updated resource name

If you wanted to customize the logo at the top of the IdScan V2 module, you needed to override the incode logo resource: onboard_sdk_incode_logo.xml. This resource was not intended to be customizable, so please update your customizations to the new resource name: onboard_sdk_logo_top.xml. By default, this resource is an empty 1x1 image, and you can customize it to your own logo.

Migration to 9.4.0

Migration to 9.4.0

For Android, if you use any of the following optional dependencies, make sure to update to the latest versions:

implementation 'com.incode.sdk:model-face-recognition:3.5.0'
implementation 'com.incode.sdk:model-id-face-detection:3.5.0'
implementation 'com.incode.sdk:nfc:1.4.2'

The qr-face-login dependency is no longer available and has been removed in this version of the SDK. Please update your project configuration accordingly. Remove the qr-face-login dependency from your build.gradle:

Migration to 9.3.0

Migration to 9.3.0
  • Update Android minSdkVersion in you Android projects's build.gradle:
  buildscript {
    ext {
-    minSdkVersion = 21
+    minSdkVersion = 23
    }
  }

Remove com.incode.sdk:camera:1.1.0 dependency in your app’s build.gradle file:

  dependencies {
-    implementation 'com.incode.sdk:camera:1.1.0'
  }

For Expo integrations, update your app.json:

{
  "expo": {
    "plugins": [
      [
        {
- "addCamera": "1.1.0"
        }
      ]
    ]
  }
}

If you are using NFC variant of the SDK follow the steps below to enable NFC scanning on iOS:

  1. Turn on Near Field Communication Tag Reading under the Capabilities tab for the project’s target. This step:

    • Adds the NFC tag-reading feature to the App ID.
    • Adds the Near Field Communication Tag Reader Session Formats Entitlement to the entitlements file.
  2. Add the NFCReaderUsageDescription key as a string item to the Info.plist file. For the value, enter a string that describes the reason the app needs access to the device’s NFC reader. If the app attempts to read a tag without providing this key and string, the app will crash.

  3. Add interface for interacting with an ISO 7816 tag to App's Info.plist:

<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
   <array>
      <string>A0000002471001</string>
      <string>A0000002472001</string>
      <string>00000000000000</string>
   </array>

NOTE If your app supports devices with iOS prior to 13.0, you will also need to set CoreNFC.framework and CryptoTokenKit.framework as an optional frameworks:

Select your app target Under Build Phases -> Link Binary With Libraries add: CoreNFC.framework, CryptoTokenKit.framework and SwiftUI.framework libraries if they are already not on the list. And finally, for all three libraries, under Status, select Optional. Note that even though NFC Scan module will not be performed on devices with iOS version older than 13, these steps are required because otherwise the app will crash on launch time.

If you are using Expo with the NFC variant, in order for it to work on Android it is necessary to:

  • Bump expo-incode-sdk-configuration version to 1.1.4 in package.json.
  {
  "dependencies": {
-   "@incode-sdks/expo-incode-sdk-configuration": "1.1.3"
+   "@incode-sdks/expo-incode-sdk-configuration": "1.1.4"
  }
}
  • Add addNfc plugin in app.json.
"plugins": [
  [
    "@incode-sdks/expo-incode-sdk-configuration",
    {
      "artifactoryUserName": "client_artifactory_username",
      "artifactoryPassword": "client_artifactory_password",
      "addIncodeSourceToPodfile": true,
      "cameraUsageDescription": "The SDK uses the camera in order to verify the identity of the customer, e.g. in ID scan, Selfie scan and so on.",
      "locationWhenInUseUsageDescription": "The SDK uses the current user location in order to detect exact location for Geolocation step.",
      "microphoneUsageDescription": "The SDK uses microphone for performing a video call during Video Conference step or for doing speech recognition during Video Selfie.",
+     "addNfc": "1.3.5"
    }
  ]
]

Migration to 9.1.0

Migration to 9.1.0

To enable the new ID capture experience on Android, add the com.incode.sdk:camera:1.1.0 dependency to your app’s build.gradle file:

  dependencies {
+    implementation 'com.incode.sdk:camera:1.1.0'
  }

For Expo integrations, update your app.json to enable the new ID capture experience:

{
  "expo": {
    "plugins": [
      [
        {
+ "addCamera": "1.1.0"
        }
      ]
    ]
  }
}

Migration to 9.0.0

Migration to 9.0.0
  • RN SDK is now delivered in multiple versions:
    9.0.0: Standard version 9.0.0-vc: Includes streaming 9.0.0-e2ee: Includes end-to-end encryption
  • Remove Android com.incode.sdk:core-light dependency in your app's build.gradle:
    dependencies { implementation 'com.incode.sdk:core-light:2.6.4' }
  • Add these lines to the Podfile:
    source 'https://cdn.cocoapods.org/' source 'git@github.com:Incode-Technologies-Example-Repos/IncdDistributionPodspecs.git' If you don't have access to the Incode's GitHub repo and SSH setup on the machine, please contact your Incode representative for support.
  • For Expo integrations minimum 1.1.2 expo configuration plugin is required:
    "@incode-sdks/expo-incode-sdk-configuration": "1.1.2"

*Only for Expo integrations - Update app.json and remove coreLightVersionparam.

Migration to 8.1.0

Migration to 8.1.0
  • The requirement for a minimum supported React Native version of 0.74 has been removed. You can now use this library with earlier versions of React Native, as long as they meet other necessary dependencies.

Migration to 8.0.0

Migration to 8.0.0
  • The minimum supported React Native version is 0.74 due to the requirements of compileSdk 34 and classpath("org.jetbrains.kotlin:kotlin-gradle-plugin"). Please upgrade your project to React Native version 0.74 or higher to ensure compatibility.

  • Update Android dependency in you app's build.gradle:

  dependencies {
-    implementation 'com.incode.sdk:core-light:2.6.3'
+    implementation 'com.incode.sdk:core-light:2.6.4'
  }
  • Update compileSdk version to 34:
  android {
-    compileSdk 33
+    compileSdk 34
  }
  • Expo integration. Update plugins field in app.json:
 "plugins": [
      [
        "@incode-sdks/expo-incode-sdk-configuration",
        {
-    "coreLightVersion": "2.6.3"
+    "coreLightVersion": "2.6.4"
        }
      ]
   ]

Migration to 6.4.0

Migration to 6.4.0
  • Update Android dependency in you app's build.gradle:
  dependencies {
-    implementation 'com.incode.sdk:core-light:2.6.2'
+    implementation 'com.incode.sdk:core-light:2.6.3'
  }
  • Expo integration. Update plugins field in app.json:
 "plugins": [
      [
        "@incode-sdks/expo-incode-sdk-configuration",
        {
-    "coreLightVersion": "2.6.2"
+    "coreLightVersion": "2.6.3"
        }
      ]
   ]

Migration to 6.2.0

Migration to 6.2.0
  • Update Android dependency in you app's build.gradle:
  dependencies {
-    implementation 'com.incode.sdk:core-light:2.6.1'
+    implementation 'com.incode.sdk:core-light:2.6.2'
  }
  • Expo integration. Update plugins field in app.json:
 "plugins": [
      [
        "@incode-sdks/expo-incode-sdk-configuration",
        {
-    "coreLightVersion": "2.6.1"
+    "coreLightVersion": "2.6.2"
        }
      ]
   ]

Migration to 6.1.0

Migration to 6.1.0
  • Expo integration. Update plugins field in app.json:
 "plugins": [
      [
        "@incode-sdks/expo-incode-sdk-configuration",
        {
+    "coreLightVersion": "2.6.1"
        }
      ]
   ]

Migration to 6.0.0

Migration to 6.0.0
  • Update Incode SDK dependency in package.json:
  "dependencies": {
-    "react-native-incode-sdk": "https://sdk-js.s3.amazonaws.com/react-native/react-native-incode-sdk-5.6.0-nvc.tgz"
+    "@incode-sdks/react-native-incode-sdk": "^6.0.0"
  }
  • Update Podfile:

If RN >= 0.69 remove this line:

-   pod 'react-native-incode-sdk', :path => '../node_modules/react-native-incode-sdk/'

If RN < 0.69 update this line:

-    pod 'react-native-incode-sdk', :path => '../node_modules/react-native-incode-sdk/'
+    pod 'react-native-incode-sdk', :path => '../node_modules/@incode-sdks/react-native-incode-sdk/'
  • Update App.js:
-   import IncodeSdk from 'react-native-incode-sdk';
+   import IncodeSdk from '@incode-sdks/react-native-incode-sdk';
  • Update Android dependency in you app's build.gradle:
  dependencies {
-    implementation 'com.incode.sdk:core-light:2.5.1
+    implementation 'com.incode.sdk:core-light:2.6.1'
  }

Migration to 5.6.1

Migration to 5.6.1
  • Update Android dependency in you app's build.gradle:
  dependencies {
-    implementation 'com.incode.sdk:core-light:2.5.0
+    implementation 'com.incode.sdk:core-light:2.5.1'
  }

Migration to 5.4.0

Migration to 5.4.0
  • Update Android minSdkVersion in you Android projects's build.gradle:
  buildscript {
    ext {
-    minSdkVersion = 17
-    compileSdkVersion = 31
-    targetSdkVersion = 31
+    minSdkVersion = 21
+    compileSdkVersion = 21
+    targetSdkVersion = 21
    }
  }

Migration to 5.3.0

Migration to 5.3.0
  • Update Android dependency in you app's build.gradle:
  dependencies {
-    implementation 'com.incode.sdk:core-light:2.3.0
+    implementation 'com.incode.sdk:core-light:2.5.0'
  }

Migration to 5.2.1

Migration to 5.2.1
  • Update Android dependency in you app's build.gradle:
  dependencies {
-    implementation 'com.incode.sdk:core-light:2.2.0
+    implementation 'com.incode.sdk:core-light:2.3.0'
  }

Migration to 5.1.0

Migration to 5.1.0

Removed startFaceLogin parameter customerToken, specify only customerUUID.

Migration to 5.x

Migration to 5.x
  1. startOnboarding and startOnboardingSection parameter name config renamed to flowConfig.
IncodeSdk.startOnboarding({
-     config: [
+     flowConfig: [
        { module: 'IdScan' },
        { module: 'SelfieScan' },
        { module: 'FaceMatch' },
      ],
    })
IncodeSdk.startOnboardingSection({
-     config: [
+     flowConfig: [
        { module: 'IdScan' },
        { module: 'SelfieScan' },
        { module: 'FaceMatch' },
      ],
    })
  1. Added setupOnboardingSession that replaces creatingNewOnboardingSession and setOnboardingSession
- await IncodeSdk.creatingNewOnboardingSession({})
+ await IncodeSdk.setupOnboardingSession({})
- await IncodeSdk.setOnboardingSession({})
+ await IncodeSdk.setupOnboardingSession({})
  1. validationModules param of createNewOnboardingSession and setOnboardingSession is now part of setupOnboardingSession method's sessionConfig param
- await IncodeSdk.createNewOnboardingSession({
-        sessionConfig: {
-         ...
-        },
-        validationModules: ['id', 'liveness'],
+ await IncodeSdk.setupOnboardingSession({
+        sessionConfig: {
+         ...
+         validationModules: ['id', 'liveness'],
+        },
- await IncodeSdk.setOnboardingSession({
-        sessionConfig: {
-         ...
-        },
-        validationModules: ['id', 'liveness'],
+ await IncodeSdk.setupOnboardingSession({
+        sessionConfig: {
+         ...
+         validationModules: ['id', 'liveness'],
+        },

Migration to 4.5.0-nvc

Migration to 4.5.0-nvc
  • Update Android dependency in you app's build.gradle:
  dependencies {
-    implementation 'com.incode.sdk:core-light:2.0.0
+    implementation 'com.incode.sdk:core-light:2.2.0'
  }

Migration to 4.4.1-nvc

Migration to 4.4.1-nvc
  • In your Android app's build.gradle file set compileSdkVersion to 31 or higher.

Migration to 4.4.0-nvc

Migration to 4.4.0-nvc

UserScoreCompleteEvent fields are now reorganized differently:

  • Basic parsed user score results are stored in result.data
  • Full UserScore data is set as raw JSON in result.extendedUserScoreJsonData field

Migration to 4.x

Migration to 4.x

initialize method changes:

  • Removed conferenceUrl parameter method that wasn't used.
  • Removed regionCode parameter, now part of OnboardingSessionConfig object that is available as an optional parameter in startOnboarding, createOnboardingSession, and setOnboardingSession methods.

startOnboarding method changes:

  • Removed interviewId parameter, now part of sessionConfig object that is available as an optional parameter
  • Removed configurationId parameter, now part of sessionConfig object that is available as an optional parameter
  • Added optional sessionConfig parameter, OnboardingSessionConfig object where you can specify all session parameters.

createOnboardingSession method changes:

  • Removed unused verifiers parameter
  • Added optional sessionConfig parameter, OnboardingSessionConfig object where you can specify all session parameters.
  • Added validationModules parameter, where you can specify the list of validation modules used for a session.

startOnboardingSection method changes:

  • Removed interviewId parameter. Please specify it either in createOnboardingSession or setOnboardingSession via sessionConfig parameter.

Migration to 3.2.x

Migration to 3.2.x

How ID results were provided before 3.2.x:

const setupListeners = () => {
  // returns a callback to unregister your listener, e.g. when your screen is getting unmounted
  const complete = IncodeSdk.onStepCompleted;
  return [
    complete({
      module: 'IdScan',
      listener: (e) => {
        console.log('ID scan result:', e.result);
      },
    }),
  ];
};

How to listen for ID results in 3.2.x:

const setupListeners = () => {
  // returns a callback to unregister your listener, e.g. when your screen is getting unmounted
  const complete = IncodeSdk.onStepCompleted;
  return [
    complete({
      module: 'IdScanFront',
      listener: (e) => {
        console.log('ID scan front result:', e.result);
      },
    }),
    complete({
      module: 'IdScanBack',
      listener: (e) => {
        console.log('ID scan back result: ', e.result);
      },
    }),
    complete({
      module: 'ProcessId',
      listener: (e) => {
        console.log('ProcessId result: ', e.result.extendedOcrData);
      },
    }),
  ];
};

iOS Podfile changes

Standard SDK:

Replace

pod 'react-native-incode-sdk', :path => '../node_modules/react-native-incode-sdk'

with:

pod 'react-native-incode-sdk', :path => '../node_modules/react-native-incode-sdk/ios'

Dynamic Delivery:

Replace

pod 'react-native-incode-sdk/ODR', :path => '../node_modules/react-native-incode-sdk'

with:

pod 'react-native-incode-sdk/ODR', :path => '../node_modules/react-native-incode-sdk/ios'

Migration to 3.1.x

Migration to 3.1.x

If you wish to keep using standard/Non-Dynamic Delivery version of the SDK on Android platform, please add this dependency in you app's build.gradle:

implementation 'com.incode.sdk:core-light:2.0.0'