Migrate from iOS SDK v2 to v3

iOS SDK v3 cleans up a few long-deprecated APIs, raises the minimum supported iOS version, and adds SwiftUI support. The inquiry flow hasn’t changed, so your existing Dashboard templates and Inquiry IDs continue to work.

This guide walks through what you need to change in your app to move from v2 to v3. Most integrators only need to update a handful of call sites.

At a glance

ChangeWhat to do
Minimum iOS deployment target raised from 13.0 to 15.0Bump your app’s minimum deployment target to 15.0, or use the latest v2.x release of the SDK.
CocoaPods is no longer publishedMigrate your install path to Swift Package Manager or the manual XCFramework. See Installation.
InquiryConfiguration initializers and the Inquiry(config:delegate:) initializer are removedConstruct inquiries with the builder API: Inquiry.from(templateId:delegate:), Inquiry.from(inquiryId:delegate:), Inquiry.from(templateVersion:delegate:), or Inquiry.from(oneTimeLinkCode:delegate:), then chain configuration setters and call .build().
InquiryDelegate.inquiryError(_:) now takes PersonaError instead of ErrorUpdate your delegate method signature. Switch on PersonaError cases to react to specific failures.
Client-side theming removed (Inquiry.theme, InquiryTheme, theme parameter on InquiryConfiguration)Move client-side styles into your dashboard theme using the Theme Editor. To customize the initial loading screen, use initialLoadingView.
Async upload APIs removed (Inquiry.doAsyncUpload, retrieveUnprocessedFilesForAsyncUpload, AsyncUploadDelegate, asyncUploadDelegate builder parameter)Remove any references to these from your integration.
routingCountry(_:) builder method removedRemove any call to .routingCountry(_:) from your inquiry construction.

Migration details

Minimum iOS deployment target is now 15.0

v3 raises the minimum deployment target from iOS 13.0 to iOS 15.0. If your app needs to support iOS 13–14, stay on the latest v2.x release.

CocoaPods is no longer published

v3 ships only via Swift Package Manager and the manual XCFramework. The PersonaInquirySDK2 CocoaPods spec is not updated past v2.

If you must keep using CocoaPods, stay on v2. Otherwise, migrate your install path to SPM. See the iOS Integration Guide.

InquiryConfiguration is no longer public

The InquiryConfiguration struct and its Inquiry(config:delegate:) initializer have been removed from the public surface. Construct inquiries with the builder API instead.

Before

1let config = InquiryConfiguration(
2 templateId: "itmpl_EXAMPLE",
3 referenceId: "myUser_123",
4 environment: .sandbox
5)
6let inquiry = Inquiry(config: config, delegate: self)
7inquiry.start(from: self)

After

1let inquiry = Inquiry.from(templateId: "itmpl_EXAMPLE", delegate: self)
2 .referenceId("myUser_123")
3 .environment(.sandbox)
4 .build()
5inquiry.start(from: self)

The builder exposes all of the configuration that InquiryConfiguration did. See Configuration in the integration guide for the full list.

InquiryDelegate.inquiryError now receives a typed PersonaError

The signature changed from func inquiryError(_ error: Error) to func inquiryError(_ error: PersonaError). PersonaError is an enum describing what went wrong, with cases such as .networking, .misconfigured, .camera, and .permissions.

Before

1func inquiryError(_ error: Error) {
2 print(error.localizedDescription)
3}

After

1func inquiryError(_ error: PersonaError) {
2 switch error {
3 case .networking:
4 // Show a retry prompt
5 case .misconfigured:
6 // Log a template-configuration error during development
7 default:
8 // Surface a generic error
9 }
10}

See Handle Errors for a complete example.

Client-side theming is removed

Theming is now fully server-driven through the Theme Editor in the Persona Dashboard. The in-code Inquiry.theme API, InquiryTheme struct, and the theme parameter on InquiryConfiguration are no longer available.

Move any client-side colors, fonts, or styles you previously set in Swift into your dashboard theme. The Migrate iOS Theming from Client to Server guide walks through the mapping.

The one exception is the initial loading screen, the view shown after the inquiry is launched and before the first server response arrives. You can replace it with your own SwiftUI view via the new initialLoadingView builder method.

Async upload APIs are removed

The experimental async upload surface has been removed. This includes Inquiry.doAsyncUpload(...), Inquiry.retrieveUnprocessedFilesForAsyncUpload(), the AsyncUploadDelegate protocol, and the asyncUploadDelegate builder parameter. There is no direct replacement; if your integration relied on these APIs, please contact us to discuss alternatives before upgrading.

routingCountry builder method removed

The routingCountry(_:) builder method has been removed. Routing is handled automatically by Persona. Remove any call to .routingCountry(_:) from your inquiry construction.