Skip to content

Frequently Asked Questions

Braden edited this page Feb 16, 2023 · 34 revisions

How can I translate the SDK/customize the strings?

Please consult our dedicated Localization Guide.

What is the size impact of the iOS SDK?

The size impact on the downloadable (compressed) size of your app by adding the iProov iOS Biometrics SDK is approximately 1.2 MB.

This estimate is based on the following assumptions:

  • Your app is already using Swift, or your device is running iOS 12.2+ (otherwise the size impact will be greater, as the Swift standard libraries will be bundled and downloaded with your app.)

  • Your app does not already include dependencies on Starscream or SwiftProtobuf (otherwise the size will impact will be less, as iProov can use the existing dependencies in your app).

These calculations were performed in November 2022 using Xcode 13.4.1 with iProov Biometrics SDK 10.0.0.

What is module stability?

Module stability is a feature introduced with Swift 5.1 which means that frameworks can be consumed by any version of the Swift compiler.

Prior to the introduction of module stability, the version of Xcode/Swift used to compile iProov (or any other binary framework) was version-locked to the exact version of Xcode/Swift used to consume the framework (i.e. the version that you, the developer, use to build your app).

You would typically see a compiler error such as:

Module compiled with Swift 5.0 cannot be imported by the Swift 5.1 compiler

The only way to resolve this error would be for the framework vendor to provide a new version of their framework, compiled against the new compiler version.

With module stability, this is no longer necessary, as frameworks can be consumed by Swift 5.1 and above, regardless of compiler version.

Does iProov support module stability?

Yes, in SDK v7.2.0 and above.

Why does iProov require workarounds for Cocoapods/Carthage?

To enable module stability for a specific framework, one must enable the "Build Libraries for Distribution" option in Xcode at compile-time. This ensures that Xcode enables the necessary settings for module stability, including generation of the .swiftinterface files.

Since iProov SDK v7.2.0, this option is enabled at compile-time on our build machines.

However, iProov's framework dependencies (Starscream & SwiftProtobuf) are all built from source on your machine, this option must be enabled when compiling your app.

Unfortunately neither Cocoapods nor Carthage currently support this behaviour, therefore it must be enabled manually via workarounds.

You can track the development of this feature for Cocoapods here and for Carthage here.

Help! My app crashes on launch with __abort_with_payload

If you are using Cocoapods or Carthage, check you have applied the required workarounds to ensure that iProov's dependencies are built with the correct settings for modular stability.

If you are managing iProov's dependencies manually (not recommended), you must ensure they were built with the "Build Libraries for Distribution" option enabled.

If you continue to encounter issues, please contact iProov.

Whilst developing, can I use iProov from the iOS Simulator?

Whilst the iProov SDK is distributed with the i386 and x86_64 architectures to allow your app to continue to be built to run on the simulator, it is not possible to actually run an iProov claim in the simulator.

The simple reason for this is because the iProov SDK requires access to the camera in order to capture imagery, and the iOS Simulator has no access to the camera.

Does iProov support SwiftUI?

Yes

Help! I get "unknown attribute" errors when attempting to build my app on Xcode 11.3 or earlier

If attempting to use the latest iProov SDK versions in Xcode 11.3 or earlier, you will get compiler errors such as:

  • Unknown attribute '_inheritsConvenienceInitializers
  • Unknown attribute '_hasMissingDesignatedInitializers

This is due to these being new attributes which are not supported in older Xcode versions.

We strongly advise upgrading to the latest version of Xcode, however if that is not possible for whatever reason, the following workaround can be applied to strip the offending attributes from the SDK at build-time:

  1. Edit the Scheme(s) used to build your app.

  2. Under the "Build" section, select "Pre-actions".

  3. Press the + button at the bottom left of the pane and select "New Run Script Action".

  4. Next to "Provide build settings from", select your app target.

  5. Add the following script:

    # Cocoapods
    if [ -d "${PROJECT_DIR}/Pods/iProov" ]; then
    	find ${PROJECT_DIR}/Pods/iProov/iProov.xcframework -type f -name '*.swiftinterface' -exec sed -i '' s/'@_inheritsConvenienceInitializers '// {} +
    	find ${PROJECT_DIR}/Pods/iProov/iProov.xcframework -type f -name '*.swiftinterface' -exec sed -i '' s/'@_hasMissingDesignatedInitializers '// {} +
    fi
    
    # Carthage
    if [ -d "${PROJECT_DIR}/Carthage/Build/iOS/iProov.framework" ]; then
        find ${PROJECT_DIR}/Carthage/Build/iOS/iProov.framework -type f -name '*.swiftinterface' -exec sed -i '' s/'@_inheritsConvenienceInitializers '// {} +
        find ${PROJECT_DIR}/Carthage/Build/iOS/iProov.framework -type f -name '*.swiftinterface' -exec sed -i '' s/'@_hasMissingDesignatedInitializers '// {} +
    fi
    
  6. You should now be able to build your app successfully.

Help! I get an error when attempting to distribute my app: "IPA processing failed"

The iProov SDK is distributed as a "fat" framework which includes both simulator & device architectures within a single framework.

When you distribute your app you must remove the simulator architectures. Cocoapods will automatically do this for you (one of the reasons we recommend Cocoapods!) but you can also do this manually by adding a "Run Script" build phase in Xcode after the "Embed Frameworks" step, with the following code:

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"

# This script loops through the frameworks embedded in the application and
# removes unused architectures.
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
    FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
    FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
    echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"

    EXTRACTED_ARCHS=()

    for ARCH in $ARCHS
    do
        echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
        lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
        EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
    done

    echo "Merging extracted architectures: ${ARCHS}"
    lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
    rm "${EXTRACTED_ARCHS[@]}"

    echo "Replacing original executable with thinned version"
    rm "$FRAMEWORK_EXECUTABLE_PATH"
    mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"

done

Check the box entitled "Run script only when installing" which means this script will only be executed when archiving.

Help! I get an error when running my app: dyld: Symbol not found: ...

If iProov's dependencies are not built with the "Build Libraries for Distribution" option enabled, you will get dyld errors when running your app.

A typical error in this case is as follows:

dyld: Symbol not found: _$s8SocketIO0A11ClientEventO10disconnectyA2CmFWC

  Referenced from: /Users/me/Library/Developer/CoreSimulator/Devices/117048E7-4BE7-418B-AE3F-49C833078BF7/data/Containers/Bundle/Application/3BE3039D-3F9C-4249-9F17-4896DE96D7CA/MyApp.app/Frameworks/iProov.framework/iProov
  Expected in: /Users/me/Library/Developer/CoreSimulator/Devices/117048E7-4BE7-418B-AE3F-49C833078BF7/data/Containers/Bundle/Application/3BE3039D-3F9C-4249-9F17-4896DE96D7CA/MyApp.app/Frameworks/SocketIO.framework/SocketIO
 in /Users/me/Library/Developer/CoreSimulator/Devices/117048E7-4BE7-418B-AE3F-49C833078BF7/data/Containers/Bundle/Application/3BE3039D-3F9C-4249-9F17-4896DE96D7CA/MyApp.app/Frameworks/iProov.framework/iProov

The solution for this is to ensure that "Build Libraries for Distribution" is enabled when building iProov's dependencies (including SocketIO).

If you are using Cocoapods or Carthage you should make sure you have applied the module stability workarounds to your Podfile, or the carthage build command. See the installation instructions for further details.

Can I use iProov from React Native/Xamarin/Cordova/Flutter/etc?

We currently support Xamarin, Flutter and React Native. Follow the links to learn more.

If you wish to express an interest in iProov being made available on other platforms, we'd love to hear from you! Please contact support@iproov.com.

Does the iProov SDK support bitcode?

Yes, the SDK has support for bitcode. However, as bitcode is deprecated in Xcode 14, support for bitcode will be removed in a future version.

Does the iProov SDK support landscape orientation?

The iProov SDK will work in landscape orientation, but the user will be prompted to rotate their iPad to portrait orientation before the scan will commence.

Does the iProov SDK run on iPad?

Yes, but the user needs to be in portrait mode, and not using multitasking as iProov requires full screen. If necessary, the user will be prompted to exit multitasking and/or rotate their iPad to portrait orientation before the iProov scan will commence.