Install the Incode Onboarding Cordova Plugin and complete per-platform setup for Android and iOS.
Prerequisites
- Node.js version 18 or later, for the Cordova CLI and your app.
- Cordova CLI version 11 or later. Install with
npm install -g cordova. - Android Studio / SDK: API 23 or later,
compileSdk35, Java 11 or later. Required for Android builds. - Xcode with iOS 13 or later target. Required for iOS builds (macOS only).
- Incode API credentials: API key and base URL, provided by Incode.
- GitHub personal access token with
read:packagesscope, for Incode's Android Maven repository.
Install the plugin
cordova plugin add https://github.com/Incode-Technologies-Example-Repos/CordovaPluginReleases.git#release/[VERSION]
For the NFC variant (NFC-capable hardware required):
cordova plugin add "https://github.com/Incode-Technologies-Example-Repos/CordovaPluginReleases.git#release/[VERSION]-nfc"
The SDK uses the camera to capture ID and face, so add the camera plugin:
cordova plugin add cordova-plugin-camera
If you use the geolocation module, add the geolocation plugin as well:
cordova plugin add cordova-plugin-geolocation
Then add the platforms you target. Pin the platform versions confirmed compatible with the SDK rather than relying on defaults:
cordova platform add android@^14.0.1
cordova platform add ios@^7.1.1 # macOS only
Android setup
Android resolves the Incode native SDK from Incode's GitHub Maven package repository, which requires authentication:
- Create a GitHub username and ask your Incode representative for a GitHub personal access token.
- Expose the username and token to the build as
GITHUB_USERNAMEandGITHUB_TOKEN, either as environment variables or as Gradle properties (github_username/github_token).
The Maven repository that hosts the native dependency is:
https://maven.pkg.github.com/Incode-Technologies-Example-Repos/android-omni-packages
Add a hook within the config.xml file inside widget, after your platform element. It will be triggered after platform is added:
<hook type="after_platform_add" src="hooks/after_platform_add/add-incode-maven-repo.js" />
add-incode-maven-repo.js content that can be reused:
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
const repoBlock = `maven {
url = uri("https://maven.pkg.github.com/Incode-Technologies-Example-Repos/android-omni-packages")
credentials {
username = project.findProperty("github_username") ?: System.getenv("GITHUB_USERNAME")
password = project.findProperty("github_token") ?: System.getenv("GITHUB_TOKEN")
}
}`;
function removeIncodeMavenBlocks(block) {
let idx = 0;
while (true) {
const mavenIndex = block.indexOf('maven {', idx);
if (mavenIndex === -1) break;
// Only consider blocks containing the Incode repo URL
const urlIdx = block.indexOf('repo.incode.com/artifactory/libs-incode-welcome', mavenIndex);
if (urlIdx === -1) {
idx = mavenIndex + 7;
continue;
}
// Find the matching closing brace for maven { ... }
let braceCount = 0;
let endIdx = mavenIndex;
let found = false;
for (; endIdx < block.length; endIdx++) {
if (block[endIdx] === '{') braceCount++;
else if (block[endIdx] === '}') braceCount--;
if (braceCount === 0 && endIdx > mavenIndex) {
found = true;
break;
}
}
if (found) {
block = block.slice(0, mavenIndex) + block.slice(endIdx + 1);
idx = mavenIndex; // Continue searching after removed block
} else {
break; // Malformed, stop
}
}
return block;
}
function insertRepoFirst(block) {
block = removeIncodeMavenBlocks(block);
return block.replace(/repositories\s*\{/, match => `${match}\n${repoBlock}\n`);
}
function patchGradle(context) {
const projectRoot = context.opts && context.opts.projectRoot ? context.opts.projectRoot : process.cwd();
const appGradlePath = path.join(projectRoot, 'platforms/android/app/build.gradle');
if (!fs.existsSync(appGradlePath)) {
console.log('app/build.gradle not found:', appGradlePath);
return;
}
let appGradle = fs.readFileSync(appGradlePath, 'utf8');
// Patch buildscript
appGradle = appGradle.replace(/(buildscript\s*\{[\s\S]*?)(\n\s*dependencies\s*\{)/, (match, p1, p2) => {
let beforeDeps = p1;
if (/repositories\s*\{/.test(beforeDeps)) {
beforeDeps = insertRepoFirst(beforeDeps);
} else {
beforeDeps = beforeDeps.replace(/buildscript\s*\{/, m => `${m}\n repositories {\n${repoBlock}\n }\n`);
}
return beforeDeps + p2;
});
// Patch allprojects
appGradle = appGradle.replace(/(allprojects\s*\{[\s\S]*?)(\n\s*task |\n\s*ext |\n\s*android |\n\s*\/\*|$)/, (match, p1, p2) => {
let beforeNext = p1;
if (/repositories\s*\{/.test(beforeNext)) {
beforeNext = insertRepoFirst(beforeNext);
} else {
beforeNext = beforeNext.replace(/allprojects\s*\{/, m => `${m}\n repositories {\n${repoBlock}\n }\n`);
}
return beforeNext + p2;
});
fs.writeFileSync(appGradlePath, appGradle, 'utf8');
}
// Cordova will call as a function during the build, but allow running directly for manual testing
module.exports = patchGradle;
if (require.main === module) {
patchGradle({ opts: { projectRoot: process.cwd() } });
}
iOS setup
iOS native dependencies are managed through CocoaPods and are installed when you add the iOS platform. If pod installation fails, run pod repo update and re-add the platform:
cordova platform rm ios && cordova platform add ios@^7.1.1
Initialize the SDK
On startup, call initializeSDK() with your Incode API key and base URL:
cordova.exec(
function () { console.log("SDK ready"); },
function (err) { console.log("Init error:", err); },
"Cplugin",
"initializeSDK",
[
"YOUR_API_KEY", // apiKey
"https://your.api.url", // apiUrl
"true", // loggingEnabled
"false", // testMode
"false", // isExternalTokenEnabled
"experimentV2", // clientExperimentId (opts iOS into V2 UI; use null for V1)
"https://your.e2ee.api.url", // e2eeUrl
{ enabled: false, forceSSLPinning: false } // sslPinningConfig
]
);
Keep all credentials out of source control. For the full argument breakdown, see the API Reference.