Migration to 5.49.0
Combined Consents: New IncdFlowError.combinedConsentsNotReceived Case
IncdFlowError gains a new case:
case combinedConsentsNotReceived // new
It is reported through IncdOnboardingDelegate.onError(_:) when the backend returns a mandatory consent that has no readable text or no checkbox id, so the user cannot review and accept it. Text that is empty or only spaces counts the same as missing text. The module ends instead of showing the consent, and the flow stops. Give the consent a text in Dashboard to clear the error.
An optional consent that cannot be shown is still left out and the flow continues, as before. If you switch exhaustively over IncdFlowError, add a handler for this case.
Machine Learning Consent: status Now Reports the User's Choice
MachineLearningConsentResult.status used to report whether the submission call succeeded, so it was true even when the user declined the consent. It now reports the choice the user made and Incode recorded:
func onMachineLearningConsentCompleted(_ result: MachineLearningConsentResult) {
switch result.status {
case true: // the user accepted the consent
case false: // the user declined the consent
default: // the choice could not be recorded, see result.error
}
}
The consent stays optional. The user can continue with or without it, and the flow continues to the next module in both cases. If your compliance rules require the consent, read status and apply your own policy. This is a behavior change only, and no call-site changes are required to compile.
V2 Checkboxes: Drawn from the Theme, Image Assets No Longer Used
The checkbox on the V2 screens is drawn from the V2 color tokens instead of the incdOnboarding.checkBox.checked / incdOnboarding.checkBox.unchecked image assets, so it now follows the brand500 color from your theme configuration.
If you override those two assets, the override still applies on the V1 screens but is ignored on the V2 ones. Set the checkbox color through the theme configuration (brand500) instead, and check the result on the V2 consent and signing screens.
Analytics: No Internet Reported as Its Own Screen
The No Internet screen now reports its own analytics screen name instead of sharing the generic error screen. This changes the analytics stream only; no call-site changes are required to compile.
Face Capture is a replacement. faceCapture.genericErrors is no longer reported at all, and the No Internet screen reports faceCapture.genericErrors.noConnection in its place. Any dashboard, funnel or alert keyed on faceCapture.genericErrors stops receiving events and needs repointing.
Front ID Capture is additive. idCapture.frontCaptureError is still reported for other front-capture errors, and the No Internet screen reports idCapture.frontCaptureError.noConnection alongside it.
The back ID side is unchanged.
Migration to 5.48.0
Migration to 5.48.0
Face Capture and Face Authentication: New videoRecordingFailed Case and Background-Recovery Change
SelfieScanError and FaceAuthenticationError each gain a new case:
case videoRecordingFailed // new
The case is reported when the Deepsight video could not be recorded or finalized — for example when the hardware video encoder was invalidated while the app was in the background. It is non-fatal: the face capture itself completes normally, and the failure is surfaced only via the existing videoRecordingError field on SelfieScanResult / FaceAuthenticationResult — the error field remains reserved for terminal failures, so existing error handling is unaffected. If you switch exhaustively over SelfieScanError or FaceAuthenticationError, add a handler for this case.
Behavior change: backgrounding the app during Face Capture or Face Authentication used to lose the Deepsight video silently, because the invalidated encoder only failed at finalization. The SDK now discards the pre-background footage and records a fresh clip once the app returns to the foreground, so the uploaded video covers the capture from the resume point onward. No call-site changes are required for this.
Migration to 5.47.0
Migration to 5.47.0
ID Capture: New IDFrameAnalysisError.preparingCamera Case
IDFrameAnalysisError gains a new case:
case preparingCamera // new
preparingCamera is reported through IDCaptureFeedback.error while the ID camera is getting ready, before the preview is shown. It is not an error: capture continues normally once the camera is ready, and the SDK's own screens show the existing "Adjusting camera" copy for it, just like settingUpStreaming. If you switch exhaustively over IDFrameAnalysisError, add a handler for this case.
testMode Now Allowed on Real Devices
initIncdOnboarding(...) with testMode: true used to fail on a real device with
IncdInitError.testModeEnabled. It now succeeds, so you can develop against a real device with test mode on. The SDK prints a console warning when test mode is enabled to remind you to set it back to false before distribution.
IncdInitError.testModeEnabled is kept so existing switch statements keep compiling, but it is no longer reported. Remove any handling that relied on initialization failing for this reason.
AES: showCertificateOnSuccess Removed from addAes
The AES module now shows a V2-style success screen instead of listing the signed documents. showCertificateOnSuccess had no other effect, so it was removed from addAes(...). Downloading the signed document is unchanged and still follows AESConfiguration.downloadDocument. When enabled, the success screen offers a "Download document" action.
Old way:
flowConfig.addAes(configuration: aesConfiguration, showCertificateOnSuccess: true)
New way:
flowConfig.addAes(configuration: aesConfiguration)
The code will not compile until the argument is removed. AESConfiguration and AESResult are unchanged.
Electronic Signature (AES/QES): V2 Screens and Localization Key Changes
Both signature modules now run on the Incode Design System V2. The addQes(...) API and both result
types are unchanged. User-visible changes include:
- QES now honors
QESConfiguration.uploadDocument. When enabled, the user picks and uploads a PDF before the signing screen, just like AES. Previously, the flag was ignored, so a session with no documents attached ended withQESResult.error == .noDocuments. - Both signing screens show the close button whenever
IncdOnboardingManager.shared.allowUserToCancelallows it. Previously, it was suppressed unconditionally.
Localization key changes include:
- Removed (overrides of these keys no longer have any effect):
incdOnboarding.qes.terms1.titleincdOnboarding.qes.terms2.title
- Added:
incdOnboarding.qes.consent.qualifiedCertificate,.legalEffect,.qscd,.termsPrivacy, and.reviewedDocuments: The five consent checkboxes on the QES signing screen, replacing the two removed keys above.incdOnboarding.aes.document.namePositionandincdOnboarding.qes.document.namePosition: The document card name used when more than one document is signed.
- Copy updated without renames, so existing overrides keep working:
incdOnboarding.aes.terms1.title,.terms2.title,.terms3.title,incdOnboarding.aes.acceptSign.subtitle,incdOnboarding.aes.document.name, andincdOnboarding.qes.document.name. The last two now hold the single-document name and no longer take a number.
See Localize Display Text for the full key list.
Face Capture and Face Authentication: New videoRecordingError Field and insufficientStorageForVideoRecording Case
SelfieScanResult and FaceAuthenticationResult gain a new optional field:
public var videoRecordingError: SelfieScanError? // on SelfieScanResult
public var videoRecordingError: FaceAuthenticationError? // on FaceAuthenticationResult
SelfieScanError and FaceAuthenticationError each gain a new case:
case insufficientStorageForVideoRecording // new
The case is reported when Deepsight video recording is skipped because the device has less than 15 MB of free storage. It is non-fatal: the face capture itself completes normally, and the skip is surfaced only via videoRecordingError. The error field remains reserved for terminal failures, so existing error handling is unaffected. If you switch exhaustively over SelfieScanError or FaceAuthenticationError, add a handler for this case.
Signature: New SignatureError.retryLimitReached Case
SignatureError gains a new case:
public enum SignatureError {
case error(_ error: IncdError)
case declinedToSignDocument
case retryLimitReached // new
}
retryLimitReached is returned in SignatureFormResult.error when the user exceeds the maximum number of allowed signing attempts. If you switch exhaustively over SignatureError, add a handler for this case.
Migration to 5.45.0
Migration to 5.45.0
Model loading API — extended signatures and auto-unload by default
IncdOnboardingManager.shared.loadModels and IncdOnboardingManager.shared.loadModelsSynchronously now take two additional parameters:
modelGroup: ModelGroup— selects which models to preload. Defaults to.all. Use.idCaptureor.faceCaptureto load only what the next flow needs.autoUnload: Bool— whentrue(default), loaded models are released automatically once onboarding finishes or is cancelled, freeing ~80–100 MB. Passfalseto keep models resident across sessions and release them yourself viaunloadModels().
Existing call sites that rely on the previous defaults continue to compile without changes, but the runtime behavior is now different: models that previously stayed in memory between onboardings are released by default. If you want the prior behavior, opt out explicitly.
Old way:
IncdOnboardingManager.shared.loadModels {
// models loaded
}
IncdOnboardingManager.shared.loadModelsSynchronously()
New way (equivalent, models still released after each onboarding):
IncdOnboardingManager.shared.loadModels(
modelGroup: .all,
autoUnload: true
) {
// models loaded
}
IncdOnboardingManager.shared.loadModelsSynchronously(
modelGroup: .all,
autoUnload: true
)
New way (preserve previous behavior — keep models resident across sessions):
IncdOnboardingManager.shared.loadModels(autoUnload: false) {
// ...
}
// release explicitly when you're done with the SDK
IncdOnboardingManager.shared.unloadModels()
Deepsight configuration — unified DeepsightConfiguration for Face Capture and Face Authentication
Selfie / Face Capture and Face Authentication now express Deepsight capture through a single DeepsightConfiguration, matching the Dashboard flow/workflow model:
DeepsightModality:.singleFrame— single frame, no depth data, no video liveness..singleFrameWithDepth— single frame with depth data, no video liveness..singleFrameWithDepthAndVideo— single frame with depth data and recorded video liveness.
DeepsightConfiguration(enabled:modality:motion:)—enabledtoggles Deepsight,modalityselects what is captured,motionenables motion capture.
Selfie scan
The addSelfieScan overload that took requireDepthData / videoLivenessRecording is deprecated (not removed). Use the new overload that takes a DeepsightConfiguration:
Old way (deprecated):
config.addSelfieScan(
requireDepthData: true,
videoLivenessRecording: true
)
New way:
config.addSelfieScan(
deepsight: DeepsightConfiguration(
enabled: true,
modality: .singleFrameWithDepthAndVideo,
motion: true
)
)
Mapping from the deprecated parameters:
| Deprecated parameters | New DeepsightModality |
|---|---|
videoLivenessRecording: false |
.singleFrameWithDepth (depth captured, preserving previous behavior) |
videoLivenessRecording: true |
.singleFrameWithDepthAndVideo |
Notes:
requireDepthDatano longer affects capture — whether depth is captured is now determined by the modality.- The new
deepsightparameter defaults toDeepsightConfiguration.default(Deepsight disabled). A bareaddSelfieScan()therefore now performs a plain single-frame capture (no depth, no video, no motion); pass an explicitDeepsightConfigurationto enable them.
Face authentication
FaceAuthenticationConfiguration now accepts a DeepsightConfiguration:
let config = FaceAuthenticationConfiguration(
deepsight: DeepsightConfiguration(modality: .singleFrameWithDepthAndVideo, motion: true)
)
When a flow/workflow is fetched from the Dashboard, Deepsight is configured automatically from the backend (ds, deepsightLiveness, and motion); no SDK changes are required for flow/workflow-driven onboarding.
NFC Scan Module — Redesign to Design System V2
The NFC Scan module has been migrated to the Incode Design System V2. The public addNfcScan(...) API and NFCScanResult are unchanged; integration code does not need to be touched. User-visible flow changes:
- After a chip-read failure, a general error screen is shown briefly before the try-again screen.
- The try-again CTA now navigates through the OCR-edit screen so users can confirm document data before retrying. Previously the CTA restarted the scan immediately.
- The passport try-again carousel advances one page per failed attempt (capped at the last page). Previously the carousel was shown only once.
- A dedicated error screen is shown when the device does not support NFC; the module then completes with
NFCScanResult.error == .notAvailable.
Several incdOnboarding.nfc.* strings had their casing/copy updated, and new keys were added for V2-only screens. See SDK Customization for the full key list. No key renames or removals — overrides in your Localizable.strings continue to work.
disableJailbreakDetection removed
The public IncdOnboardingManager.shared.disableJailbreakDetection property has been removed and has no replacement. If you set it anywhere, remove those calls; the code will not compile until you do.
Old way:
IncdOnboardingManager.shared.disableJailbreakDetection = true
New way: remove the call.
Migration to 5.44.0
Migration to 5.44.0
Face Capture validation flags — defaults changed from false to true
When the dashboard configuration omits validateLenses, validateFaceMask, validateClosedEyes, or validateHeadCover, the SDK now defaults them to true. If you relied on these being off, set them explicitly to false in your dashboard configuration — otherwise the corresponding checks will start running and may reject captures that previously passed.
IncdTheme.logo — now also applied to V2 screens
V2 screens now respect IncdTheme.logo, using it before falling back to the host app's incdOnboardingLogo asset and then the SDK default (V1 already worked this way). If you previously set IncdTheme.logo for V1 and a separate incdOnboardingLogo asset expecting V2 to show the asset, V2 will now show IncdTheme.logo on both. Leave IncdTheme.logo unset to keep V2 on the asset.
Migration to 5.43.0
Migration to 5.43.0
IncdFlowError and GeolocationError — new cases
The reworked Geolocation failure UX adds new enum cases. Update any exhaustive switch over IncdFlowError or GeolocationError:
IncdFlowError.locationUnavailable- fired viaIncdOnboardingDelegate.onError(_:)when a non-skippableGeolocationmodule exhausts its retries on the location-unavailable screen and the user tapsQuit process.GeolocationError.locationUnavailable- surfaced viaGeolocationResult.errorwhen a skippableGeolocationmodule is skipped from either failure screen.
Migration to 5.42.0
Migration to 5.42.0
- Removed localization keys
incdOnboarding.nameInfo.lastnamePlaceholderincdOnboarding.ccv.invalidCCV
- Renamed localization keys:
incdOnboarding.email.title->incdOnboarding.userInformation.email.titleincdOnboarding.email.invalidEmail->incdOnboarding.userInformation.email.wrongFormatincdOnboarding.ccv.title->incdOnboarding.userInformation.securityCode.titleincdOnboarding.nameInfo.title->incdOnboarding.userInformation.fullName.titleincdOnboarding.nameInfo.subtitle->incdOnboarding.userInformation.fullName.subtitleincdOnboarding.nameInfo.namePlaceholder->incdOnboarding.userInformation.fullName.placeholderincdOnboarding.nameInfo.continue->incdOnboarding.userInformation.continueincdOnboarding.ekyc.input.label.fillYourCredentials->incdOnboarding.ekyc.input.title
Migration to 5.41.0
Migration to 5.41.0
CURP Validation Module — Localization Key Changes
The CURP Validation module has been redesigned to use the Incode Design System V2. As part of this update:
- Removed localization key:
incdOnboarding.curp.add.generate
- Renamed localization keys:
incdOnboarding.curp.generation.last.name.placeholder→incdOnboarding.curp.generation.first.last.name.placeholderincdOnboarding.curp.generation.name.placeholder→incdOnboarding.curp.generation.first.name.placeholder
If you override CURP-related strings in your Localizable.strings, update the keys above. Unused keys can be safely removed.
ID Document Chooser — idType Behavior Change
The visibility of the ID Document Chooser screen is now controlled only by the "Show document chooser screen" flag on the Dashboard or showIdTypeChooser in addIdScan.
- When using startFlow / startWorkflow, the Dashboard setting is respected.
- When using
startOnboarding/startOnboardingSection: the Dashboard flag is ignored and visibility is controlled exclusively viashowIdTypeChooserinaddIdScan.
Setting idType alone no longer hides the chooser and will be ignored.
If you use startOnboarding / startOnboardingSection and previously relied on idType to suppress the chooser, add an explicit showIdTypeChooser: false:
// Before (implicit suppression via idType — no longer works)
addIdScan(idType: .id)
// After (explicit)
addIdScan(idType: .id, showIdTypeChooser: false)
V2 Theme Color Palette — Positive and Negative Token Renames
The JSON/code keys used for positive and negative semantic colors in IncdTheme's V2 color palette have been renamed. If you customize the color palette via JSON or code, update the following keys:
| Old key | New key |
|---|---|
negative500 |
negative400 |
negative600 |
negative500 |
positive600 |
positive500 |
positive800 |
positive950 |
For the full updated palette reference, see About Colors in the Customization Guide v2.
Migration to 5.40.0
Migration to 5.40.0
- Deprecated
titleanddescriptionparameters fromaddSignaturemethod.- Use
addSignature(descriptionMaxLines:documents:)and customize text via these keys in your app'sLocalizable.strings:"incdOnboarding.signature.title""incdOnboarding.signature.description"
- Use
Migration to 5.39.0
Migration to 5.39.0
- Removed
enableRotationOnRetakeScreenparameter fromaddIdScanmethod. Document in the review screen is shown in vertical orientation always. - Renamed
showRetakeScreenintoshowRetakeScreenForManualCaptureinaddIdScanmethod. - Renamed
showAutoCaptureRetakeScreenintoshowRetakeScreenForAutoCaptureinaddIdScanmethod.
Migration to 5.38.0
Migration to 5.38.0
- Renamed
FaceAuthenticationConfigurationstruct fieldshowTutorialtoshowTutorialsin order to perserve consistent parameter naming with other modules. - Deprecated
enableIdSummaryScreenparameter from addIdProcess. Now function signature is nowaddIdProcess(idCategory: IDCategory). Screen will not appear when using v2 UI. IdSummaryScreen will be removed in future update.