{"id":18753362,"url":"https://github.com/pingidentity/pingone-verify-mobile-sdk-ios","last_synced_at":"2026-04-17T13:04:23.568Z","repository":{"id":76718137,"uuid":"334091329","full_name":"pingidentity/pingone-verify-mobile-sdk-ios","owner":"pingidentity","description":"PingOneVerify Native SDK for iOS","archived":false,"fork":false,"pushed_at":"2024-08-07T21:58:14.000Z","size":181177,"stargazers_count":2,"open_issues_count":0,"forks_count":2,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-03-26T18:57:24.597Z","etag":null,"topics":["identity","ios","mobile","sdk","verification"],"latest_commit_sha":null,"homepage":"https://www.pingidentity.com/en/platform/capabilities/identity-verification.html","language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pingidentity.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2021-01-29T09:06:21.000Z","updated_at":"2024-08-07T21:52:54.000Z","dependencies_parsed_at":null,"dependency_job_id":"5537b66b-79ae-437f-8876-8f7166ce77da","html_url":"https://github.com/pingidentity/pingone-verify-mobile-sdk-ios","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pingidentity%2Fpingone-verify-mobile-sdk-ios","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pingidentity%2Fpingone-verify-mobile-sdk-ios/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pingidentity%2Fpingone-verify-mobile-sdk-ios/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pingidentity%2Fpingone-verify-mobile-sdk-ios/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pingidentity","download_url":"https://codeload.github.com/pingidentity/pingone-verify-mobile-sdk-ios/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248650590,"owners_count":21139670,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["identity","ios","mobile","sdk","verification"],"created_at":"2024-11-07T17:25:30.429Z","updated_at":"2026-04-17T13:04:23.560Z","avatar_url":"https://github.com/pingidentity.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PingOne Verify SDK for iOS\n\n\nPingOneVerify iOS SDK provides a secure interface for an iOS app to use the PingOne Verify service for validating a user's identity. The SDK also parses the responses received from the service for different operations and forwards the same to the app via callbacks.\n\n\n### Running the Sample App\n\n\n[Download the Sample App](https://github.com/pingidentity/pingone-verify-mobile-sdk-ios).\n\n\n### Prerequisites\n\n* Xcode 12 or greater\n* iOS 13 or greater\n\n### Set Up and Clone or Download\n\nThe sample app cannot run on a simulator and works only on a device, because the app requires the camera to capture a selfie and the related user ID documents.\n\n\n1. Ensure your Xcode is set up with a provisioning profile and a signing certificate to be able to install the app on a device. See the Apple Xcode document [Run an app on a device](https://help.apple.com/xcode/mac/current/#/dev5a825a1ca) for more information.\n\n\n2. Clone or download the [PingOne Verify SDK for iOS sample code](https://github.com/pingidentity/pingone-verify-mobile-sdk-ios) to your computer and open `PingOneVerify.xcodeproj` located in the `PingOneVerify_iOS` directory.\n\n\nYou will find all other XCFramework dependencies required for PingOne Verify in the `PingOneVerify_iOS/common` directory.\n\nAlso all common dependencies required for PingOne Verify in the `PingOneVerify_iOS/common` directory.\n \n\n3. To run the sample app, select the scheme `PingOneVerify_iOS` --\u003e , and click **Run**.\n\n### Integrating PingOne Verify SDK with Your App\n\nPingOneVerify iOS SDK provides a secure interface for an iOS app to use the PingOne Verify service for validating a user's identity. The SDK also parses the responses received from the service for different operations and forwards the same to the app via callbacks.\n\n### Getting started\n\nAdd the dependencies needed for your application.\n\n\nThe PingOne Verify iOS SDK relies on XCFramework components. You'll need to add these to Xcode for use by your application.\n\n\n1. Drag and drop the following components from the `SDK/Verify` folder to the section `Frameworks`, `Libraries`, and `Embedded Content` in Xcode:\n\n\n    * PingOneVerify.xcframework\n    \n    * BlinkID.xcframework\n    \n    * BlinkIDUX.xcframework\n        \n    * NeoInterfaces.xcframework\n    \n    * LanguagePackProvider.xcframework\n    \n    * IDLiveFaceIAD.xcframework\n    \n    * IDLiveFaceDetection.xcframework\n    \n    * IDLiveFaceCamera.xcframework\n    \n    * GeoLocationProvider.xcframework\n    \n2. Right click from your project folder and select **Add Files to (your project name)**.\n\n## ⚠️ IMPORTANT: Using Wallet and Verify SDKs in the Same Application\n\nWhen integrating both the Wallet SDK and Verify SDK into a single application, note that they share common dependencies located in the SDK/Common directory. These shared modules contain utilities and components required by both SDKs.\n\n### Dependencies Configuration\n\n- If using **only the Wallet SDK** → include `Wallet/SDK/Common`\n- If using **only the Verify SDK** → include `Verify/SDK/Common`\n- If using **both Wallet and Verify** → include inly once instance of `SDK/Common` (preferably from `Wallet/SDK/Common`)\n\n** ⚠️ DO NOT INCLUDE BOTH `Wallet/SDK/Common` \u0026 `Verify/SDK/Common` in your project**\n\nIncluding multiple copies of SDK/Common can result in:\n\n  - Build time errors (e.g. duplicate symbols)\n  - Runtime crashes due to conflicting modules\n  - Increased binary size due to unnecessary duplication\n\n3. Add `import PingOneVerify` to the top of the Swift file where the SDK is initialized\n\n### Initializing PingOneVerifyClient\n\n\n1. Import `PingOneVerify_iOS` in your desired ViewController (It must **extend UIViewController**)\n\n```\nimport PingOneVerify_iOS\n\n```\n\n2. Extend [DocumentSubmissionListener](#documentsubmissionlistener-callbacks) protocol and its functions\n\n\n```\nclass YourViewController: UIViewController, DocumentSubmissionListener {\n\n    func onDocumentSubmitted(response: DocumentSubmissionResponse) {\n        // Callback when document is successfully submitted\n    }\n\n    func onSubmissionComplete(status: DocumentSubmissionStatus) {\n        // Callback when verification transaction is completed\n    }\n\n    func onSubmissionError(error: DocumentSubmissionError) {\n    // Callback when there is an error during submission\n    }\n\n}\n\n```\n\n3. Extend [BackActionListener](#BackActionListener-callbacks) protocol and its functions\n\n\n```\nclass YourViewController: UIViewController, BackActionListener {\n\n   func onBackAction(exitFlow: @escaping (Bool) -\u003e Void) {\n        // Callback when user taps on back button\n        // Show alert if needed to confirm exit\n        // exitFlow(true) to exit the flow\n        // exitFlow(false) to stay in the flow\n    }\n\n}\n\n```\n\n4. Instantiate a `PingOneVerifyClient.Builder` and set its `listener`, `BackActionHandler` and `rootViewController` **(Required)**\n\n\n```\nPingOneVerifyClient.Builder()\n    .setListener(self)\n    .setRootViewController(self)\n    .setBackActionHandler(self)\n\n```\n\n5. Optionally, you can set an explicit **qrString** using the `PingOneVerifyClient.Builder`\n\n\n```\nPingOneVerifyClient.Builder()\n    .setListener(self)\n    .setBackActionHandler(self)\n    .setRootViewController(self)\n    .setQrString(qrString: \"https://api.pingone.com...\")\n\n```\n\n6. Start Verification Process\n\n```\nPingOneVerifyClient.Builder()\n    .setListener(self)\n    .setRootViewController(self)\n    .setBackActionHandler(self)\n    .startVerification { pingOneVerifyClient, clientBuilderError in\n        if let pingOneVerifyClient = pingOneVerifyClient {\n            // Handle pingOneVerifyClient\n        } else if let clientBuilderError = clientBuilderError {\n            // Handle builderError\n        }\n    }\n\n```\n\n### DocumentSubmissionListener Callbacks\n\n\n\n1. `onDocumentSubmitted(response: DocumentSubmissionResponse)`\n\n\n    * Called whenever a document is successfully submitted.\n    * Appropriate [DocumentSubmissionResponse](#documentsubmissionresponse) is returned\n```\nfunc onDocumentSubmitted(response: DocumentSubmissionResponse) {\n    print(\"The document status is \\(response.documentStatus)\")\n    print(\"The document submission status is \\(response.documentSubmissionStatus)\")\n        \n    guard let documents = response.document else { return }\n    for (key, value) in documents {\n        print(\"\\(key): \\(value)\")\n    }\n}\n\n```\n\n2. `onSubmissionComplete(status: DocumentSubmissionStatus)`\n\n\n    * Called when all required documents have been submitted for a transaction.\n    * [DocumentSubmissionStatus](#documentsubmissionstatus) will always be `.completed`\n```\nfunc onSubmissionComplete(status: DocumentSubmissionStatus) {\n    // present a basic alert to indicate completion\n    let alertController = UIAlertController(title: \"Document Submission Complete\", message: \"All documents have been successfully submitted\", preferredStyle: .alert)\n    alertController.addAction(UIAlertAction(title: \"Okay\", style: .default))\n    DispatchQueue.main.async {\n        self.present(alertController, animated: true)\n    }\n}\n\n```\n\n3. `onSubmissionError(error: DocumentSubmissionError)`\n\n\n    * Called when error occurs during SDK flow.\n    * Appropriate [DocumentSubmissionError](#documentsubmissionerror) is returned\n```\nfunc onSubmissionError(error: DocumentSubmissionError) {\n    print(error.localizedDescription)\n}\n\n```\n\n#### BackActionListener Callbacks\n\n\n\n1. `onBackAction(exitFlow: @escaping (Bool) -\u003e Void)`\n\n\n    * Called whenever a user taps back.\n    * Return the exitFlow completion handler with `true` to exit the flow or `false` to stay in the flow.\n```\n    func onBackAction(exitFlow: @escaping (Bool) -\u003e Void) {\n        let alertController = UIAlertController(title: \"Cancel Transaction\", message: \"Do you want to cancel this transaction?\", preferredStyle: .alert)\n        let yesAction = UIAlertAction(title: \"Yes\", style: .destructive) { _ in\n            exitFlow(true)\n        }\n        let noAction = UIAlertAction(title: \"No\", style: .cancel) { _ in\n            exitFlow(false)\n        }\n        alertController.addAction(noAction)\n        alertController.addAction(yesAction)\n        self.presentedViewController?.present(alertController, animated: true)\n    }\n}\n\n```\n\n#### Class Reference\n\n#### DocumentSubmissionResponse\n\n`DocumentSubmissionResponse` object holds information pertaining to the document that was successfully submitted to the ID Verification service.\n\n\n```\n@objc public class DocumentSubmissionResponse: NSObject, Codable {\n    public var documentStatus: [String: DocumentStatus]\n    public var documentSubmissionStatus: DocumentSubmissionStatus\n    public var document: [String: String]\n    public var createdAt: String // Timestamp of when transaction was created\n    public var updatedAt: String // Timestamp of when transaction was last updated\n    public var expiresAt: String // Timestamp of when transaction expires\n\n    public func getDocumentStatus() -\u003e [String: DocumentStatus]\n    public func getDocumentSubmissionStatus() -\u003e DocumentSubmissionStatus\n    public func getDocument() -\u003e [String: String]\n    public func getCreatedAt() -\u003e String\n    public func getUpdatedAt() -\u003e String\n    public func getExpiresAt() -\u003e String\n}\n\n```\n\n`documentStatus` dictionary shows the status of each document requested. For example, if the requested documents for a certain transaction are the following:\n\n* Email\n\n* Phone\n\n* Selfie\n\nand the callback `onDocumentSubmitted(response: DocumentSubmissionResponse` was fired after submitting `Email`, the `documentStatus` property will look like this:\n\n```\n[\"Email\": .PROCESSED, \"Phone\": .REQUIRED, \"Selfie\", .REQUIRED]\n\n```\n\nThe list of `DocumentStatus` states can be found in [DocumentStatus](#documentstatus)\n\n\n`documentSubmissionStatus` property shows the status of the entire verification transaction. Detailed information regarding `DocumentSubmissionStatus` can be found in [DocumentSubmissionStatus](#documentsubmissionstatus)\n\n\n`document` dictionary holds information about the document that was just submitted to the ID Verification service. **Only applicable keys** are populated in the `document` dictionary\n\n\nData model of `document`\n\n\n| Key | Description |\n| --- | --- |\n| `frontImage` | Base64 encoded string of the front image of a document |\n| `backImage` | Base64 encoded string of the back image of a document |\n| `barcode` | Barcode Data found on the document |\n| `mrzData` | MRZData found on passport and other relevant document |\n| `firstName` | User's first name as shown on the document |\n| `middleName` | User's middle name as shown on the document |\n| `lastName` | User's last name as shown on the document |\n| `fullName` | User's full name |\n| `additionalNameInfo` | Additional name info about the user |\n| `addressStreet` | User's street address as shown on the document |\n| `addressCity` | User's residence city as shown on the document |\n| `addressState` | User's residence state as shown on the document |\n| `addressZip` | User's ZIP Code as shown on the document |\n| `country` | User's residence country as shown on the document |\n| `sex` | User's sex as shown on the document |\n| `dateOfBirth` | User's date of birth as shown on the document |\n| `placeOfBirth` | User's place of birth as shown on the document |\n| `nationality` | User's nationality as shown on the document |\n| `maritalStatus` | User's marital status as shown on the document |\n| `race` | User's race as shown on the document |\n| `religion` | User's religion as shown on the document |\n| `residentialStatus` | User's residential status as shown on the document |\n| `documentNumber` | Document number as shown on the document |\n| `documentAdditionalNumber` | Additional document number as shown on the document |\n| `personalIdNumber` | Personal Id number as shown on the document |\n| `dateOfIssue` | Date of issuance of the document |\n| `dateOfExpiry` | Date of expiration of the document |\n| `issuingAuthority` | Issuing authority of the document |\n| `employer` | Employer as shown on the document |\n| `profession` | Profession as shown on the document |\n\n\n### DocumentStatus\n\nAn enum describing the status of a particular document\n\n\n```\n@objc public enum DocumentStatus {\n    case REQUIRED // document is required\n    case OPTIONAL // document is optional; user may choose to skip\n    case COLLECTED // document has been collected\n    case PROCESSED // document has been processed\n    case SKIPPED // document is skipped by user's choice\n}\n\n```\n\n### DocumentSubmissionStatus\n\nAn enum describing the status of the verification transaction\n\n```\n@objc public enum DocumentSubmissionStatus {\n    case not_started // transaction has not been initiated\n    case started // transaction has been initiated, but not completed\n    case process // transcation is being processed\n    case completed // transaction has been processed and is completed\n}\n\n```\n\n### SelfieCaptureSettings\n\nA configurable object to customize selfie capture experience\n\n```\n@objc public class SelfieCaptureSettings {\n    public let captureTime: TimeInterval // selfie capture time (default is 45 seconds)\n    public let shouldCaptureAfterTimeout: Bool // whether user should be able to capture selfie after timeout (default is true)\n    public var optional: Bool // whether user can decide to skip selfie capture (default is false)\n}\n\n```\n\n### PingOne Verify SDK Errors\n### ClientBuilderError\n`ClientBuilderError` is returned when *PingOneVerify SDK* is initialized **incorrectly**. It subclasses `BuilderError` and `QRError` and is returned during `Builder.startVerification()`\n\n\n### BuilderError\n\n| Error | Description |\n| --- | --- |\n| `.missingRootViewController` | RootViewController was not set using `.setRootViewController(viewController: UIViewController)` in the builder |\n| `.missingDocumentSubmissionListener` | `DocumentSubmissionListener` was not set using `.setDocumentSubmissionListener(listener: DocumentSubmissionListener)` in the builder |\n\n\n### QRError\n\n| Error | Description |\n| --- | --- |\n| `.invalidQR` | Not a valid PingOne QR Code |\n| `.unableToParse` | Unable to parse QR Code |\n| `.missingQueryItems` | QR Code is missing important query items required to start transaction |\n| `.missingVerificationCode` | QR Code is missing verification code |\n| `.missingTransactionId` | QR Code is missing transactionId |\n\n\n### DocumentSubmissionError\n\n\n\n\n| Error | Description |\n| --- | --- |\n| `.initiateDocumentTransactionError` | Error when initiating a transaction |\n| `.submissionError` | Error when submitting a document |\n| `.noDocumentToSubmitError` | No more documents to submit |\n| `.missingDocumentType` | Document type is missing |\n| `.invalidKeyMap` | A valid key map for the document does not exist |\n| `.documentCaptureError` | Error when capturing the data |\n| `.documentSubmissionTimeoutError` | Document Submission has expired |\n| `.missingOTPDestination` | OTP Destination is missing |\n| `.failedOTP` | OTP failed with invalid code |\n\n\n\n### UI Customization\n\n###  UI Customization for PingOne Verify\n\n###  UIAppearanceSettings\n\n`UIAppearanceSettings` instance allows you to customize the SDK's user interface during run time.\n\n```swift\n    @objc public class UIAppearanceSettings: NSObject {\n        private var logoImage: UIImage?\n        private var backgroundColor: UIColor?\n        private var bodyTextColor: UIColor?\n        private var headingTextColor: UIColor?\n        private var navigationBarColor: UIColor?\n        private var navigationBarTextColor: UIColor?\n        private var iconTintColor: UIColor?\n        private var solidButtonAppearance: ButtonAppearance?\n        private var borderedButtonAppearance: ButtonAppearance?\n}\n```\n| Method                                                                                     | Description                         |\n|--------------------------------------------------------------------------------------------|-------------------------------------|\n| `setLogoImage(_ image: UIImage) -\u003e UIAppearanceSetting`                                    | Set logo image that is shown at the center of the navigation bar |\n| `setBackgroundColor(_ color: UIColor) -\u003e UIAppearanceSetting`                              | Set application background color    |\n| `setBodyTextColor(_ color: UIColor) -\u003e UIAppearanceSetting`                                | Set body text color                 |\n| `setHeadingTextColor(_ color: UIColor) -\u003e UIAppearanceSetting`                             | Set heading text color              |\n| `setNavigationBarColor(_ color: UIColor) -\u003e UIAppearanceSetting`                           | Set navigation bar background color |\n| `setNavigationBarTextColor(_ color: UIColor) -\u003e UIAppearanceSetting`                       | Set navigation bar text color       |\n| `setIconTintColor(_ color: UIColor) -\u003e UIAppearanceSetting`                                | Set icon tint color                 |\n| `setSolidButtonAppearance(_ buttonAppearance: ButtonAppearance) -\u003e UIAppearanceSettings`   | Set solid button appearance         |\n| `setBorderedButtonAppearance(_ buttonAppearance: ButtonAppearance) -\u003e UIAppearanceSettings`| Set bordered button appearance      |\n| `setAttributedStrings(_ attributedStrings: [String: NSAttributedString]) -\u003e UIAppearanceSettings`| Set attributed text for the app texts and customize it as per need.\n| `showSessionExpiresTimer(_ isTimerShown: Bool) -\u003e UIAppearanceSettings`                    | Set visibility for session expiration timer      |\n| `setNavigationTitle(_ text: NSAttributedString) -\u003e UIAppearanceSettings`                   | Set navigation bar title text      |\n\nExample usage:\n\n```swift\n    private func getUiAppearanceSettings() -\u003e UIAppearanceSettings {\n        let solidButtonAppearance = ButtonAppearance(backgroundColor: .red, textColor: .white, borderColor: .red)\n        let borderedButtonAppearance = ButtonAppearance(backgroundColor: .clear, textColor: .red, borderColor: .red)\n        \n        let text = \"Identity Verification\"\n        let identityString = NSMutableAttributedString(\n            string: text,\n            attributes: [.font: UIFont.systemFont(ofSize: 18),\n                         .foregroundColor: UIColor.purple]\n        )\n        \n        var attributedStringDict: [String : NSAttributedString] = [:]\n\n        let clearText = \"Is It Readable?\"\n        let paragraphStyle = NSMutableParagraphStyle()\n        paragraphStyle.alignment = .center\n        let clearAttributedString = NSMutableAttributedString(\n            string: clearText,\n            attributes: [.paragraphStyle: paragraphStyle,\n                         .font: UIFont.systemFont(ofSize: 25),\n                         .backgroundColor: UIColor.lightGray]\n        )\n        attributedStringDict[\"idv_data_check_clear\"] = clearAttributedString\n        \n        return UIAppearanceSettings()\n            .setSolidButtonAppearance(solidButtonAppearance)\n            .setBorderedButtonAppearance(borderedButtonAppearance)\n            .setAttributedStrings(attributedStringDict)\n            .showSessionExpiresTimer(false)\n            .setNavigationTitle(identityString)\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        let uiAppearanceSetting = self.getUiAppearanceSettings()\n        \n        PingOneVerifyClient.Builder(isOverridingAssets: false)\n        .setListener(self)\n        .setRootViewController(self)\n        .setUIAppearanceSetting(uiAppearanceSetting)\n        .startVerification { pingOneVerifyClient, clientBuilderError in\n            if let pingOneVerifyClient = pingOneVerifyClient {\n                // Handle pingOneVerifyClient\n            } else if let clientBuilderError = clientBuilderError {\n                // Handle builderError\n            }\n        }\n    }\n```\n###  UI Customization\n\n### Customizing icon tint color\nIf using custom image resources, set `PingOneVerifyClient.Builder(isOverridingAssets: Bool)` to `true`. When the `isOverridingAssets` flag is `true`, the icon tint color is not applied to the custom images.\n\nIf `PingOneVerifyClient.Builder(isOverridingAssets: Bool)` is set to `false`, the icon tint color is automatically applied to all the icon images.\n\n### Customizing image resource\nYou can customize these images:\n\n| Asset Name  | Description                                                            | \n|-------------|------------------------------------------------------------------------|\n| idv_logo    | Logo image that appears at the center of the navigation bar            |\n|idv_gov_id   | Image that is shown when government id is requested                    |                      \n| idv_selfie  | Image that is shown when selfie is requested                           |\n| idv_phone   | Image that is shown when phone number verification is requestede       |\n| idv_email   | Image that is shown when email verification is requested               |\n| idv_cancel  | mage that is used for cancel button at top left of the navigation bar  |\n\nTo customize an image resource:\n\n1. Include your custom image with the same name in the app asset folder\n\n### Customizing color resource\nYou can customize the following color resources:\n\n- navigation color\n- button color\n- button background color\n- button text color\n- button border color\n- application background color\n- heading text color\n- body text color\n\nTo customize:\n\n 1. Pass a custom [UIAppearanceSettings](https://apidocs.pingidentity.com/pingone/native-sdks/v1/api/#uiappearancesettings) instance in the `PingOneVerifyClient.Builder`.\n\n 2. Use [Branding](https://apidocs.pingidentity.com/pingone/platform/v1/api/#branding) from the PingOne platform API.\n\n 3. Use **Branding \u0026 Themes** tab found in PingOne Admin Console -\u003e Experiences -\u003e Branding \u0026 Themes as described in [Branding and themes](https://docs.pingidentity.com/pingone/user_experience/p1_branding_themes.html).\n\n  [UIAppearanceSettings](https://apidocs.pingidentity.com/pingone/native-sdks/v1/api/#uiappearancesettings) **always has higher priority** than [Branding and themes](https://docs.pingidentity.com/pingone/user_experience/p1_branding_themes.html).\n\n Thus, if both [UIAppearanceSettings](https://apidocs.pingidentity.com/pingone/native-sdks/v1/api/#uiappearancesettings) and [Branding and themes](https://docs.pingidentity.com/pingone/user_experience/p1_branding_themes.html) are used, the configuaration specified in [UIAppearanceSettings](https://apidocs.pingidentity.com/pingone/native-sdks/v1/api/#uiappearancesettings) is shown.\n \n ### Customizing localization\n For localization and messages, you can replace the values found in [PingOneVerifyLocalizable.strings](https://github.com/pingidentity/pingone-verify-mobile-sdk-ios/blob/master/Sample%20Code/PingOne%20Verify/PingOne%20Verify/PingOneVerifyLocalizable.strings).\n \n ## UI Customization from PingOne Admin Console\n \n You can customize items such as:\n\n- logo\n- navigation color\n- button color\n- button background\n- button text\n- application background\n- heading text\n- body text\n \n To customize:\n \n - Use [Branding](https://apidocs.pingidentity.com/pingone/platform/v1/api/#branding) from the PingOne platform API.\n - Use **Branding \u0026 Themes** tab found in *PingOne Admin Console -\u003e Experiences -\u003e Branding \u0026 Themes* as described in [Branding and themes](https://docs.pingidentity.com/pingone/user_experience/p1_branding_themes.html).\n \n For Localization, use the `Localizable.strings` file to modify.\n\n\n\n\n### Verify Policy\n\n\n\nPingOne Verify Native SDK utilizes Verify Policies. You can apply policies two ways:\n\n\n* Use [Verify Policies](https://apidocs.pingidentity.com/pingone/platform/v1/api/#verify-policies) from the PingOne platform API.\n\n\n* Use **Policies** tab found in *PingOne Admin Console -\u003e PingOne Verify -\u003e Policies* to customize verify policy for a particular environment.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpingidentity%2Fpingone-verify-mobile-sdk-ios","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpingidentity%2Fpingone-verify-mobile-sdk-ios","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpingidentity%2Fpingone-verify-mobile-sdk-ios/lists"}