The Persona iOS SDK lets you run identity verification flows in your iOS app from UIKit or SwiftUI. The SDK takes care of the hard parts of identity capture: selfies, government ID scanning and classification, NFC passport reads, document uploads, and silent network authentication. Each flow is configured from a template you manage in the Persona Dashboard.
The SDK requires a minimum deployment target of iOS 17.6 or later. If your app needs to support iOS versions below 17.6, please continue using the latest v2.x release.
To install the SDK with Swift Package Manager:
+ to add a package.https://github.com/persona-id/inquiry-ios-2.git, and click Next.In addition to importing the dependency, you also need to modify your Info.plist and add the required permissions:
Info tab.NSCameraUsageDescription) entry (if not already present) to enable camera access.NSLocationWhenInUseUsageDescription) entry (if not already present) to enable GPS access. Unfortunately, Apple does not provide tools to differentiate when the API is in use. Therefore, even if your app or inquiry flow does not utilize the GPS functionality, the usage string must be included because the Persona SDK supports the functionality.NSBluetoothAlwaysUsageDescription) entry (if not already present) to enable bluetooth scanning. Unfortunately, Apple does not provide tools to differentiate when the API is in use. Therefore, even if your app or inquiry flow does not utilize the bluetooth functionality, the usage string must be included because the Persona SDK supports the functionality.NSMicrophoneUsageDescription) entry (if not already present) to enable microphone access.NFCReaderUsageDescription) entry (if not already present) to enable NFC access.This SDK collects a user’s IDFV for fraud prevention purposes. In App Store Connect > Your App > App Privacy, if you haven’t already add in a “Device Identifier,” and fill out the questionnaire with the following answers:
Be sure to also update your privacy manifest according to the features you are making use of from the SDK. See our iOS Privacy Manifest instructions for more information.
Please refer to Creating inquiries for more information. After getting up and running consider moving inquiry creation to your backend for security reasons.
Start an inquiry with a template ID, inquiry ID, or one-time link code. The samples below use a template ID — replace itmpl_EXAMPLE with your own. You can find your Inquiry Template ID in the Persona Dashboard.
When the flow is presented, the SDK takes control of the user interface. Once the flow completes, control returns to your app and the appropriate result handler is called.
Build the inquiry with Inquiry.from(templateId:delegate:) and call start(from:) with the presenting view controller.
SDK callbacks are intended for coordination between your app’s UI and Persona’s UI (e.g. opening and closing the flow UI). They do NOT guarantee that data are up-to-date, and cannot be reliably used to guarantee data integrity. Webhooks should be used for logic that depends on Inquiry state.
For more information, see Accessing Inquiry status and data.
To receive the inquiry result, implement the InquiryDelegate protocol. For example:
In rare cases, the Persona Inquiry SDK can encounter client-side errors that cannot be resolved. When that happens, the SDK ends the flow and reports a typed PersonaError value to your app. The most common reasons include unrecoverable networking errors, misconfigured templates (should only be encountered during development), or failing to establish a connection to the device camera. PersonaError conforms to LocalizedError, so its errorDescription returns a human-readable string suitable for display or logging.
Handle errors in your InquiryDelegate.inquiryError(_:) implementation.
The builder API exposes a number of optional methods that let you tailor an inquiry to your integration — link it to a known user, pre-fill data, control which environment it runs in, and more. Chain any of the following on top of Inquiry.from(...) (or pass them through personaInquiry’s builder: closure in SwiftUI).
accountId and referenceId are mutually exclusive. Setting an account ID clears any value previously set via referenceId.
If your integration uses Persona accounts to associate the same user across multiple inquiries, pass the account ID (prefixed with act_) to the inquiry.
accountId and referenceId are mutually exclusive. Setting a reference ID clears any value previously set via accountId.
To make it easier to find Inquiries in the Persona Dashboard, we recommend passing in your system’s user ID for the Inquiry reference ID.
If you want to add extra information to the Inquiry before the user even starts, you can pass them in as fields.
When you create an Inquiry on the server, you can pass the Inquiry ID instead of the Template ID.
If the Inquiry has already started, you will need to also pass in the session token.
Our SDK will automatically use the language and region selected on a users device to determine localization. If your app has specific localization requirements independent of user’s device settings, you can pass the localization directly to the inquiry as follows:
By default, an inquiry runs in the .production environment. To start an inquiry in your sandbox while you develop, pass .sandbox instead. If you maintain multiple sandbox environments, you can also identify a specific one by ID.
If your template uses a step that hands off to a browser or another app (for example, an external verification provider), the SDK uses the redirect URI to return the user to your app. Provide a URL whose scheme is registered for your app.
If a user has already verified themselves with another organization on Persona and consents to reuse that data with you, you can redeem a share token (prefixed with cnst_) when starting an inquiry. The server pulls the previously verified fields, and the inquiry only asks the user for whatever is still missing.
You can configure the styles that are applied to the inquiry template in the Persona Dashboard. For more information on using the theme editor, see our help article.
If you have multiple themes configured on the inquiry template, you can pick which one the SDK should use by passing its theme set ID (prefixed with thm_). If you don’t set a theme set ID, the template’s default theme is used.
By default, the SDK uses the light or dark variant of the active theme to match the device’s system appearance. Pass a StyleVariant to force a specific variant.
By default, the iOS SDK only has access to the device’s system font. Non system fonts can either be downloaded at runtime when uploaded to your inquiry template, or bundled into your hosting application.
Custom fonts that are not available in Persona themes are only available to customers on Enterprise plans.
Bundling a font
For example, if you choose the font ‘Rubik’ in your template’s Theme configuration, you will need to add a font file named Rubik.ttf (or any compatible format) to your project by following the instructions here.
If you need to use different font weights for a given family, name each font file such that the weight is appended to the end of the family name with a -. For example, a bold version of the Rubik font would be named Rubik-Bold.ttf. Valid font weight suffixes are Light, Regular, Medium, Bold, and ExtraBold.
The initial loading screen is shown after the inquiry is launched and before the first server response arrives. It is the only view in the SDK that is not configured by the server; every other screen is rendered from the theme set in the Persona Dashboard. You can replace the default loading animation with your own SwiftUI view to brand this moment.
Once the first server response arrives, subsequent loading screens use the theme configured in the Persona Dashboard and are not affected by this setting.
In order to use a template that includes Government Id NFC reading capabilities on iOS, follow these steps:
TAG and PACE for the Near Field Communication Tag Reader Session Formats:
Privacy - NFC Scan Usage Description to your info.plist file, along with a description.ISO7816 application identifiers for NFC Tag Reader Session to your info.plist file with these values in the following order: A0000002471001, A0000002472001, and 00000000000000.PersonaNfcAdapter() into the Inquiry builder for the .nfcAdapter function. You will need to import PersonaNfc to access this.In order to enable video recording over WebRTC on iOS follow these steps:
PersonaWebRtcAdapter() into the Inquiry builder for the .webRtcAdapter function. You will need to import PersonaWebRtc to access this.Privacy - Microphone Usage Description to your Info.plist file.In order to enable local video recording upload on iOS follow these steps:
Privacy - Microphone Usage Description to your Info.plist file.In order to use a template that includes phone number silent network authentication on iOS, follow these steps:
PersonaSnaAdapter() into the Inquiry builder for the .snaAdapter function. You will need to import PersonaSna to access this.The Persona iOS SDK is shipped with the licenses for the 3rd party software that it uses. Be sure to include these licenses in your app as well. See here for a list of the 3rd party software that we use and their associated licenses.