A document frame option was added to the Front, Back and Passport steps: StepBuilder.setGraphicOverlayEnable(_:). When true, a semi-transparent document frame is shown over the camera and the recognized MRZ text is drawn on the frame; when false (default), the document's template image is shown. It is the same setting as graphicOverlayEnable in the Android SDK.
The ID card front, ID card back and Russian passport template images were added back to the SDK; Asset.Images.idGuideFront, Asset.Images.idGuideBack and Asset.Images.idGuideRuPassport were re-added to the public Asset enum.
Changed
Default behavior change: In versions 1.8.0 – 1.13.0, the Front, Back and Passport steps always showed the document frame. Since setGraphicOverlayEnable defaults to false, the template image is now shown if the setting is not provided. To keep the previous look, use setGraphicOverlayEnable(true) in the relevant steps.
An Apple privacy manifest (PrivacyInfo.xcprivacy) was added to the framework bundle. It declares that the SDK does no tracking and collects no data; the file timestamp access that comes from Lottie (NSPrivacyAccessedAPICategoryFileTimestamp, reason C617.1) is declared in this file.
Changed
Lottie is now inside the SDK: the airbnb/lottie-spm dependency was removed. lottie-ios 4.6.1 is compiled from unmodified sources as a separate KYCLottie module and embedded statically in the KYCFramework binary. Class and symbol names use the KYCLottie… form and are not exposed; the two copies are independent of your app's own Lottie (SPM or CocoaPods, any version). No link errors, "implemented in both" warnings or version mismatches occur. The Lottie license (LICENSE-Lottie, NOTICE-Lottie) ships with the framework.
Note: If your app uses Lottie (import Lottie) only because it came in through KYCFramework, without adding it as its own dependency, you must add Lottie to your project yourself.
If your app already includes Lottie, the Lottie code exists in two copies (the app's and the SDK's); the impact on app size is about 2 MB (about 0.7 MB in download size).
The framework bundle version (CFBundleShortVersionString) matches the release version again; the 1.11.0 binary incorrectly reported its version as 1.9.0.
Fixed
The Undefined symbol: Lottie… link error seen in React Native projects using use_frameworks! (lottie-react-native) with versions 1.9.0 – 1.11.0 was fixed.
Blink detection was added to the VideoRecord step: StepBuilder.setBlinkDetectionEnabled(_:). When enabled, the user's blink count is measured during the recording and sent to the backend logs as a liveness signal (LIVENESS_SIGNALS); it does not affect the outcome of the flow. The default value is false, and it only takes effect on the .videoRecord step.
Device and system information (SYSTEM_INFO) is now sent to the backend logs once per flow.
Changed
For events other than start, log entries without extra information now include the verification library's accumulated logs in JSON format (aligned with Android).
The IdVerification dependency was upgraded to 1.0.9. After upgrading, running File > Packages > Reset Package Caches in Xcode is recommended.
Lottie (airbnb/lottie-spm, 4.5.0 ..< 5.0.0) is now declared as an SPM dependency. Lottie is no longer embedded in the SDK binary and is linked dynamically; if your app also uses Lottie, SPM merges both into a single Lottie.framework. Lottie is not part of the SDK's public API, and no extra configuration is required on the integration side.
Changed
The IdVerification dependency was upgraded to 1.0.7. After upgrading, running File > Packages > Reset Package Caches in Xcode is recommended.
Duplicate MRZ / OCR packages were removed from the dependency graph: QKMRZScanner, QKMRZParser, SwiftyTesseract and libtesseract are no longer added to the project, and ocrb.traineddata is bundled into the app only once.
The SDK binary and its resources are significantly smaller, reducing the impact on app size.
The package without video call does not include the LiveKit / WebRTC dependencies (client-sdk-swift, webrtc-xcframework, livekit-uniffi-xcframework, swift-protobuf). Versions with video call are published separately under tags suffixed with -withLivekit and -withVideocall.
In the LiveKit variant (-withLivekit), the client-sdk-swift package dependency was removed and replaced by webrtc-xcframework (exact: 150.7871.2) and livekit-uniffi-xcframework (0.1.9).
The framework bundle version (CFBundleShortVersionString) now matches the release tag.
Removed
Template images and animations that became unused in 1.8.0 were removed from the SDK. Accordingly, Asset.Animations.idHologram, Asset.Animations.loading, Asset.Images.card, Asset.Images.idGuideFront, Asset.Images.idGuideBack, Asset.Images.idGuideRuPassport and Asset.Images.passport were removed from the public Asset enum. Integrations that access these assets directly need to be updated.
Notes
If your app also uses lottie-spm, a one-time Class _TtC11_LottieStub10LottieStub is implemented in both … warning may appear at launch. This class is an empty helper target of lottie-spm and is never used; the warning is harmless and does not affect Lottie animations.
The passport step now automatically detects whether the passport is a new or old type. The detected type is sent to the backend in the document upload request as the passport_type field (new, old, or unknown). No additional configuration is required on the integration side.
Changed
Redesigned the capture screen in the ID front, ID back, and passport steps: the static template images were removed, and the area where the document should be placed is now shown as a document frame over a semi-transparent background.
Face detection in the liveness step now waits for the user's face to become stable before capturing an image, reducing blurry captures caused by moving frames.
Upgraded the IdVerification dependency to version 1.0.6. After upgrading, running File > Packages > Reset Package Caches in Xcode is recommended.
Fixed
Fixed the device screen dimming and auto-locking during the flow. The SDK now keeps the screen awake for the duration of the flow and restores the setting when the flow ends.
Added the KPS step: an Identity Sharing System verification with no user interface, in which the SDK performs the backend query directly and moves to the next step based on the result. Used via .setStepType(.kps).
Added per-step NFC text configuration: successfulReadText, scanDescription, and retryDescription can be customized with StepBuilder.setNFCTextConfig(_:).
Added device security check: setSecurityCheckEnabled(true) enables jailbreak, simulator, debugger, and hooking detection. Every run emits a SECURITY_CHECK_PASSED or SECURITY_WARNING event; on compromised devices the flow is stopped with a fail screen. Messages can be customized with setSecurityErrorMessage.
Success screen texts are now customizable: setCompletedScreenTexts(_:) and CompletedScreenTexts (titleText, descriptionText, buttonText).
Lighting warnings are now configurable: setOverexposureWarning(_:) and setLowLightWarning(_:) together with WarningConfig (.enabled(message:) / .disabled). The default value is .disabled.
Expanded the UIConfig theme tokens. ColorsConfig gained primaryColor, onPrimaryColor, surfaceColor, onSurfaceColor, backgroundColor, errorColor, successColor, textPrimaryColor, textSecondaryColor, and lineButtonTextColor; ShapesConfig gained cardCornerRadius, imageFrameCornerRadius, and bottomSheetCornerRadius; TypographyConfig gained promptFontSize and promptFontWeight.
Added startButtonText and stopButtonText to TextConfig for the video record screen.
Added per-step button text and close button control: setApproveButtonText, setRetakeButtonText, and setCancelButtonIsActive on StepBuilder. Per-step values override the global texts provided through UIConfig.textConfig.
Added the roomName parameter to enterKYC, used as the appointment identifier in video call requests.
Documented every LogState event delivered through onEvent, together with its raw value.
Documented the KYCManager.onError closure as an alternative to the delegate, and the title, message, and extraDetail fields readable from TeydexError.
Added an informational note about package variants and Reset Package Caches to the installation section.
Place of birth is now read in the NFC step.
Changed
Breaking change: the case names of the TeydexError sub-enums moved to UPPER_SNAKE_CASE. For example: .cameraPermissionDenied → .CAMERA_PERMISSION_DENIED, .deviceNotHaveNfc → .DEVICE_NOT_HAVE_NFC, .nfcDisabled → .NFC_NOT_ENABLED, .deviceInitFailed → .CAMERA_CONFIGURATION_FAILED, .externalAuthFailed → .CARD_AUTH_FAILED. Integrations passing dictionaries to methods such as setCameraErrorMessage and setNFCErrorMessage need to be updated.
The enterKYC(clientToken:...) signature is marked deprecated; use enterKYC(from:...), which takes the screen the flow is started from, instead.
Added new error families: TeydexError.PermissionError, TeydexError.SecurityError, TeydexError.NetworkError, and TeydexError.VideoRecordError. The setPermissionErrorMessage, setSecurityErrorMessage, setNetworkErrorMessage, and setVideoRecordErrorMessage methods are available for these families.
Added the FACE_DETECTION_FAILED and APP_WENT_BACKGROUND cases to the CameraSourceError family.
Fixed
Fixed the dark screen problem in video calls.
Fixed the freeze that occurred on unsuccessful video calls.
Fixed a crash in the liveness step.
Fixed the recording preview not being shown in the video record step.
Fixed the audio problem in the video record step and updated the default timeout duration.
Added the VideoRecord step: a voice-verified video step in which the user creates a video recording by reading the on-screen text aloud. Used via .setStepType(.videoRecord); configurable with setStartButtonText, setStopButtonText, setApproveButtonText, setRetakeButtonText, and setVideoRecordDuration.
Changed
The signature of KYCProcessResult.failed and cancelled (returned via onProcessFinished) changed: step: KYCStep? is now stepName: String?, and the failed case's reason: TeydexError is now reason: String. Integrations relying on these types need to be updated.