iOS Integration Guide

Integrate the Persona Inquiry flow directly into your iOS app with our native SDK.


To integrate the Persona Inquiry SDK in your iOS app you can use CocoaPods. Unfortunately Carthage is not yet an option as XCFrameworks are not currently supported.

Please note: iOS 11.0 or later is required.

Install via CocoaPods

To install the SDK with CocoaPods, add PersonaInquirySDK as one of your target dependencies in your Podfile:

source ''

target 'Your Project' do
    pod 'PersonaInquirySDK'

Please be sure to run pod update and use pod install --repo-update to ensure you have the most recent version of the SDK installed.

Update your Info.plist

In addition to importing the dependency, you also need to modify your Info.plist:

  1. Navigate to your project’s settings in Xcode and click the Info tab
  2. Add a new “Privacy - Camera Usage Description” (NSCameraUsageDescription) entry (if not already present) to enable camera access.
  3. Add a new “Privacy - Photo Library Usage Description” (NSPhotoLibraryUsageDescription) entry (if not already present) to enable photo library access.


The Persona Inquiry verification flow is initiated with an InquiryConfiguration. This configuration can be initialized with either a templateId or an inquiryId.

Please refer to the code sample below and replace my_template_id with your template ID. You can find your template ID on the Persona Dashboard under “Development”.

This starts the Inquiry flow and takes control of the user interface. Once the flow completes the control of the user interface is returned to the app and the appropriate delegate method will be called.

class ViewController: UIViewController, InquiryDelegate {

    // This is hooked up to a button which starts the flow
    @IBAction func buttonTapped(_ sender: UIButton) {
        let config = InquiryConfiguration(templateId: "my_template_id")

        // Create the inquiry with the view controller 
        // as the delegate and presenter.
        Inquiry(config: config, delegate: self).start(from: self)

    // MARK: - Inquiry Delegate Methods

    func inquirySuccess(inquiryId: String, attributes: Attributes, relationships: Relationships) {
        // ✅ Inquiry succeeded

    func inquiryCancelled() {
        // ⏏️ Inquiry cancelled by user

    func inquiryFailed(inquiryId: String, attributes: Attributes, relationships: Relationships) {
        // ❌ Inquiry failed

    func inquiryError(_ error: Error) {
        // ⚠️ Inquiry errored

Inquiry Results

The results of the inquiry are passed back to the InquiryDelegate, and are as follows

  • inquirySuccess — the inquiry passed
  • inquiryFailed — the inquiry failed
  • inquiryCancelled — the inquiry was cancelled by the user
  • inquiryError — the inquiry errored

Configuration Options

Some different configuration examples can be found below:

// Configuration with only a template ID
let config = InquiryConfiguration(
    templateId: "tmpl_JAZjHuAT738Q63BdgCuEJQre"

// Configuration with only a template ID in the sandbox
let config = InquiryConfiguration(
    templateId: "tmpl_JAZjHuAT738Q63BdgCuEJQre", 
    environment: .sandbox

// Configuration with a template and reference ID
let config = InquiryConfiguration(
    templateId: "tmpl_JAZjHuAT738Q63BdgCuEJQre", 
    referenceId: "myReference"

// Configuration with a template and account ID
let config = InquiryConfiguration(
    templateId: "tmpl_JAZjHuAT738Q63BdgCuEJQre", 
    accountId: "act_W6thEnEU19gphPqq5uTzZ4Y8"

// Configuration with only an inquiry ID
let config = InquiryConfiguration(
    inquiryId: "inq_JAZjHuAT738Q63BdgCuEJQre", 

// Configuration with only a template ID and a theme
var theme = InquiryTheme()
theme.backgroundColor = .purple
theme.bodyTextColor = .white

let config = InquiryConfiguration(
    templateId: "tmpl_JAZjHuAT738Q63BdgCuEJQre", 
    theme: theme


Make the Persona Inquiry flow look and feel like your app.

Replacing Strings

You can replace any title, body, or button text by providing your own strings file called Persona.strings in your app bundle. At runtime, the SDK will use any of the strings found there.

For example:


"inquiryStartTitle" = "Verify your identity";
"inquiryStartBody" = "Let’s make sure you’re you!";
"inquiryStartButton" = "Get started";

Available String Keys

  • governmentIdFailedTitle
  • governmentIdStartTitle
  • governmentIdStartBody
  • governmentIdSubmittingTitle
  • governmentIdSubmittingBody
  • selfieFailedTitle
  • selfieFailedBody
  • selfieFailedButton
  • selfieStartTitle
  • selfieStartBody
  • selfieStartButton
  • selfieSubmittingTitle
  • selfieSubmittingBody
  • countrySelectTitle
  • countrySelectBody
  • countrySelectButton
  • inquiryCompleteTitle
  • inquiryCompleteBody
  • inquiryCompleteButton
  • inquiryFailedTitle
  • inquiryFailedBody
  • inquiryFailedButton
  • inquiryStartTitle
  • inquiryStartBody
  • inquiryStartButton