Skip to main content
This migration guide covers significant changes in the SDK API that might affect your integration.

[8.6.x] to [8.7.5]

Updated country selection UISearchBar to support iOS 26

Follow this migration guide point if you have implemented custom views of CountrySelectionViewableV2.
Update the country search bar to the following to avoid iOS 26 rounding up the corners:
    public var countrySearchBar: UISearchBar = {
        let searchBar = UISearchBar()
        searchBar.translatesAutoresizingMaskIntoConstraints = false
        searchBar.setImage(UIImage(), for: .search, state: .normal)
        searchBar.setPositionAdjustment(UIOffset(horizontal: -10, vertical: 0), for: .search)
        searchBar.semanticContentAttribute = .forceLeftToRight
        searchBar.barTintColor = IdenfyCountrySelectionViewUISettingsV2.idenfyCountrySelectionViewCountrySearchBarBackgroundColor
        searchBar.backgroundColor = IdenfyCountrySelectionViewUISettingsV2.idenfyCountrySelectionViewCountrySearchBarBackgroundColor
        searchBar.backgroundImage = UIImage()
        searchBar.layer.cornerRadius = IdenfyCountrySelectionViewUISettingsV2.idenfyCountrySelectionViewCountrySearchBarCorderRadius
        searchBar.layer.borderWidth = IdenfyCountrySelectionViewUISettingsV2.idenfyCountrySelectionViewCountrySearchBarBorderWidth
        searchBar.layer.borderColor = IdenfyCountrySelectionViewUISettingsV2.idenfyCountrySelectionViewCountrySearchBarBorderColor.cgColor
        let textField = searchBar.searchTextField
        textField.backgroundColor = IdenfyCountrySelectionViewUISettingsV2.idenfyCountrySelectionViewCountrySearchBarBackgroundColor
        textField.textColor = IdenfyCountrySelectionViewUISettingsV2.idenfyCountrySelectionViewCountrySearchBarTextColor
        textField.borderStyle = .none
        textField.clearButtonMode = .never
        textField.font = IdenfyCountrySelectionViewUISettingsV2.idenfyCountrySelectionViewSearchBarFont
        if #available(iOS 26.0, *) {
            textField.layer.cornerRadius = 0
            textField.layer.borderWidth = 0
            textField.layer.masksToBounds = true
        }
        return searchBar
    }()

[8.6.2] to [8.6.3]

Updated face capture oval design

Face Oval V2
Follow this migration guide point if you have implemented custom views of FaceCameraViewableV2.
A new idenfyUIViewFaceOvalV3 oval class was added, which replaces idenfyUIViewFaceOval in FaceCameraViewableV2:
    public var idenfyUIViewFaceOvalV3: IdenfyFaceOvalV3? = {
        let view = IdenfyFaceOvalV3(frame: .zero)
        view.translatesAutoresizingMaskIntoConstraints = false
        view.isOpaque = false
        return view
    }()
    
    func setupUIViewFaceOval() {
        if let unwrappedIdenfyUIViewFaceOvalV3 = idenfyUIViewFaceOvalV3 {
            addSubview(unwrappedIdenfyUIViewFaceOvalV3)
            unwrappedIdenfyUIViewFaceOvalV3.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
            unwrappedIdenfyUIViewFaceOvalV3.bottomAnchor.constraint(equalTo: cameraSessionsButtons.idenfyUIViewContainerOfButtons.topAnchor).isActive = true
            let top = CameraSessionUIHelper.getDrawerHeight()
            unwrappedIdenfyUIViewFaceOvalV3.topAnchor.constraint(equalTo: topAnchor, constant: top).isActive = true
            unwrappedIdenfyUIViewFaceOvalV3.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
            unwrappedIdenfyUIViewFaceOvalV3.rightAnchor.constraint(equalTo: rightAnchor).isActive = true
            unwrappedIdenfyUIViewFaceOvalV3.setNeedsDisplay()
        }
    }
The idenfyUIViewFaceOval is still available but deprecated and will be removed in the future.

[8.5.x] to [8.6.0]

Added realtime blur glare detection in document capture

Follow this migration guide point if you have implemented custom views of DocumentCameraViewableV2.
With the latest realtime blur glare detection feature, a warning alert card was added to DocumentCameraViewableV2:
    public var documentCameraAlertCard: UIView = {
        let view = UIView(frame: .zero)
        view.translatesAutoresizingMaskIntoConstraints = false
        view.backgroundColor = IdenfyDocumentCameraSessionUISettingsV2.idenfyDocumentCameraAlertCardBackgroundColor
        view.isHidden = true
        return view
    }()

    public var documentCameraAlertCardImage: UIImageView = {
        let imageView = UIImageView()
        imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.layer.masksToBounds = true
        imageView.image = UIImage(named: "idenfy_ic_warning_alert", in: Bundle(identifier: "com.idenfy.idenfyviews"), compatibleWith: nil)?.withRenderingMode(.alwaysTemplate)
        imageView.contentMode = .scaleAspectFit
        imageView.tintColor = IdenfyDocumentCameraSessionUISettingsV2.idenfyDocumentCameraAlertCardImageTintColor
        return imageView
    }()

    public var documentCameraAlertCardTitle: UILabel = {
        let label = UILabel(frame: .zero)
        label.translatesAutoresizingMaskIntoConstraints = false
        label.numberOfLines = 0
        label.font = IdenfyDocumentCameraSessionUISettingsV2.idenfyDocumentCameraAlertCardTitleFont
        label.textAlignment = .left
        label.textColor = IdenfyDocumentCameraSessionUISettingsV2.idenfyDocumentCameraAlertCardTitleColor
        return label
    }()

[8.5.x] to [8.5.7]

KYC Questionnaire FILE and IMAGE questions merged

ImageQuestionCell has been removed:
    .withImageQuestionCellView(ImageQuestionCell.self)

[8.4.x] to [8.5.0]

Added Face Detection progress View to the camera drawer

Follow this migration guide point if you have implemented custom views of DrawerContentViewableV2.
With the latest face authentication auto capture feature, a progress view was added to DrawerContentViewableV2:
    public var faceDetectionProgressView: UIProgressView = {
        let progressView = UIProgressView(frame: .zero)
        progressView.translatesAutoresizingMaskIntoConstraints = false
        progressView.progressTintColor = IdenfyInstructionAlertUISettigsV2.idenfyInstructionAlertProgressBarFillColor
        progressView.trackTintColor = UIColor.clear
        progressView.isHidden = true
        return progressView
    }()
    
    ...
    
    open func setupProgressView() {
        addSubview(faceDetectionProgressView)
        faceDetectionProgressView.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
        faceDetectionProgressView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
        faceDetectionProgressView.rightAnchor.constraint(equalTo: rightAnchor).isActive = true
        faceDetectionProgressView.heightAnchor.constraint(equalToConstant: 3).isActive = true
    }

[8.3.x] to [8.4.0]

Removed Dynamic OnBoarding view

.withOnBoardingViewType(.multipleDynamic) option is no longer available in IdenfyUISettingsV2.
Follow this migration guide point if you have implemented custom views of DynamicCameraOnBoardingViewableV2.
The IdenfyViewsBuilderV2 will no longer have a .withDynamicCameraOnBoardingView option. Use .withStaticCameraOnBoardingView viewable instead. You can check new, fully implemented views in the sample application. The IdenfyDynamicCameraOnBoardingViewUISettingsV2 class has been removed. The static onBoarding view has its own IdenfyStaticCameraOnBoardingViewUISettingsV2 class.

[8.2.x] to [8.3.0]

Removed instructions drawer option from camera view

The instructions drawer has been removed. The top drawer will remain static as if instructions were disabled, and will only hold camera descriptions and the app bar. .withInstructions(IdenfyInstructionsType.drawer) option is no longer available in IdenfyUIBuilderV2.
Follow this migration guide point if you have implemented custom views of DrawerContentViewableV2, DocumentCameraViewableV2 or FaceCameraViewableV2.
The IdenfyViewsBuilderV2 will no longer have a .withDrawerContentView option. However, DocumentCameraViewableV2 and FaceCameraViewableV2 now include the DrawerContentViewableV2 view, which you can easily override:
    public var drawerContentView: DrawerContentViewableV2 = {
        let view = DrawerContentViewV2(frame: .zero)
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()
    
    @objc private func setupConstraints() {
        ...
        setupDrawerView()
    }
    
    func setupDrawerView() {
        addSubview(drawerContentView)
        drawerContentView.topAnchor.constraint(equalTo: topAnchor).isActive = true
        drawerContentView.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
        drawerContentView.rightAnchor.constraint(equalTo: rightAnchor).isActive = true
        drawerContentView.heightAnchor.constraint(equalToConstant: CameraSessionUIHelper.getDrawerHeight()).isActive = true
    }
The setupUIViewFaceOval() function of FaceCameraViewV2 has been refactored with a helper function to get the drawer height:
    func setupUIViewFaceOval() {
        addSubview(idenfyUIViewFaceOval)
        idenfyUIViewFaceOval.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
        idenfyUIViewFaceOval.bottomAnchor.constraint(equalTo: cameraSessionsButtons.idenfyUIViewContainerOfButtons.topAnchor, constant: -16).isActive = true
        var top = CameraSessionUIHelper.getDrawerHeight()
        // adding more for better margin
        top += 16
        idenfyUIViewFaceOval.topAnchor.constraint(equalTo: topAnchor, constant: top).isActive = true
        idenfyUIViewFaceOval.widthAnchor.constraint(equalTo: idenfyUIViewFaceOval.heightAnchor, multiplier: 0.7).isActive = true
    }
The DrawerContentViewableV2 protocol has changed:
public protocol DrawerContentViewableV2: UIView {
    var delegate: CameraSessionDrawerDelegate? { get set }
    var toolbar: IdenfyToolbarV2CameraSession { get }
    var infoLabel: UILabel { get }
    var descriptionLabelV2: UILabel { get }
    var faceDetectionAlertImage: UIImageView { get }
}
As well as the CameraSessionDrawerDelegate:
public protocol CameraSessionDrawerDelegate: AnyObject {
    func backButtonPressedAction()
    func toggleFlashButtonPressedAction()
    func instructionDialogButtonPressedAction()
}
You can check new, fully implemented views in the sample application. All colors and UI customizations related to the instructions drawer have been removed. See the updated UI customization files.

After capturing photos, camera results view will appear instantly

Since the camera results view will appear instantly, it will show a loading spinner while the photo loads.
Follow this migration guide point if you have implemented custom views of CameraResultViewableV2.
The CameraResultViewableV2 now has an additional photoResultDetailsSpinner view you must implement:
    public var photoResultDetailsSpinner: LottieAnimationView = {
        let lottieView = LottieAnimationView(frame: .zero)
        lottieView.translatesAutoresizingMaskIntoConstraints = false
        if let path = Bundle(identifier: "com.idenfy.idenfyviews")?.path(forResource: "idenfy_custom_animation_photo_result_loading_indicator", ofType: "json") {
            lottieView.animation = LottieAnimation.filepath(path)
        }
        lottieView.contentMode = .scaleAspectFit
        lottieView.play()
        lottieView.loopMode = .loop
        lottieView.backgroundBehavior = .pauseAndRestore
        lottieView.alpha = 0.6
        lottieView.isHidden = true
        return lottieView
    }()
Fully implemented views can be found in the sample application.

Changed photo cropping to preserve higher resolution

The position of the document camera rectangle has been changed to match the logic of the Android SDK. Now the x position will be 0.05 * screen width. The CameraSessionsButtonsViewV2 height multiplier has been moved to a constant. It affects picture cropping. Make sure you change the height of idenfyUIViewContainerOfButtons by changing the idenfyCameraBottomControlsHeightMultiplier constant:
    /**
     idenfyCameraBottomControlsHeightMultiplier is used in photo cropping,
     make sure you change the height of idenfyUIViewContainerOfButtons by changing the idenfyCameraBottomControlsHeightMultiplier constant
     */
    open func setupUIViewContainerOfButtons() {
        addSubview(idenfyUIViewContainerOfButtons)
        idenfyUIViewContainerOfButtons.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
        idenfyUIViewContainerOfButtons.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
        idenfyUIViewContainerOfButtons.heightAnchor.constraint(equalTo: heightAnchor, multiplier: ConstsIdenfyUI.idenfyCameraBottomControlsHeightMultiplier).isActive = true
        idenfyUIViewContainerOfButtons.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
    }
Fully implemented views can be found in the sample application.