Install the Payrails iOS SDK with Swift Package Manager, create a session, and render a working card payment screen.
Quick Start
Get up and running with the Payrails iOS SDK in about 15 minutes. By the end you will have a working card payment screen in your app.
Prerequisites
Xcode 16.4+. Each release is built with Xcode 16.4. Swift’s module interface format is not backward compatible across toolchains, so an older Xcode cannot load the prebuilt framework.
iOS 14.0+ deployment target.
Swift 5.0+.
A Payrails merchant account and a backend that can fetch an init payload.
Step 1: Install the SDK
The SDK ships as a prebuilt, signed XCFramework. Swift Package Manager is the only supported installation method.In Xcode, click File → Add Package Dependencies and enter the package URL:
https://github.com/payrails/ios-sdk.git
Select the Payrails product and add it to your app target.To declare the dependency in a Package.swift instead:
Swift Package Manager downloads the framework and verifies it against the checksum published in the package manifest. Resolution also pulls in PayrailsCSE and PayPalCheckout, so three packages appear in your project, not one.
Step 2: Enable Apple Pay capability (optional)
If you plan to use Apple Pay, add the Apple Pay capability in Xcode under Signing & Capabilities and provide your merchant identifier.
Step 3: Fetch the init payload from your backend
The SDK requires an init payload that your backend fetches from the Payrails API. This payload is a base64-encoded JSON string along with a version string.
// Your backend call — implementation depends on your networking layerfunc fetchInitPayload() async throws -> (data: String, version: String) { // Call your backend, which calls the Payrails /checkout/initialize endpoint // Returns the `data` and `version` fields from the Payrails response}
Step 4: Initialize the SDK session
Async/await
import Payrailslet initData = Payrails.InitData( version: "2", // version returned from your backend data: "<base64-payload>" // data returned from your backend)let configuration = Payrails.Configuration( initData: initData, option: Payrails.Options(env: .production) // use .test for sandbox)do { let session = try await Payrails.createSession( with: configuration, onSessionExpired: { completion in // Re-run your backend's init flow (authentication + initSdk) and hand // the fresh InitData back. The SDK swaps its internal config in place — // your `session` reference and any cached buttons / forms keep working. fetchFreshPayrailsInitData { result in completion(result) } } ) // session is ready; store it or proceed to build your UI} catch { print("SDK initialization failed:", error.localizedDescription)}
Recommendedsupply onSessionExpired at createSession time. The SDK invokes it when it detects the current execution is no longer reusable (most commonly: the user abandoned a 3DS challenge). Without it, the next payment attempt against the poisoned Session fails naturally and the SDK logs a warning at init.
Callback
Payrails.createSession(with: configuration) { result in switch result { case .success(let session): // session is ready case .failure(let error): print("SDK initialization failed:", error.localizedDescription) }}
Step 5: Build a card payment screen
Payrails provides UIKit-based elements. Add them to your view hierarchy:
import UIKitimport Payrailsclass CheckoutViewController: UIViewController, PaymentPresenter { var encryptedCardData: String? override func viewDidLoad() { super.viewDidLoad() // 1. Create the card form let cardForm = Payrails.createCardForm() // 2. Create the pay button let payButton = Payrails.createCardPaymentButton( translations: CardPaymenButtonTranslations(label: "Pay now") ) payButton.delegate = self payButton.presenter = self // PaymentPresenter: required to present 3DS challenges // 3. Add to view hierarchy view.addSubview(cardForm) view.addSubview(payButton) // 4. Layout (use Auto Layout or frames as preferred) cardForm.translatesAutoresizingMaskIntoConstraints = false payButton.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ cardForm.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 24), cardForm.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16), cardForm.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16), payButton.topAnchor.constraint(equalTo: cardForm.bottomAnchor, constant: 16), payButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16), payButton.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16), ]) } // PaymentPresenter: called when a view controller must be presented (e.g. 3DS) func presentPayment(_ viewController: UIViewController) { present(viewController, animated: true) }}
Step 6: Handle payment results
Conform to PayrailsCardPaymentButtonDelegate:
extension CheckoutViewController: PayrailsCardPaymentButtonDelegate { func onPaymentButtonClicked(_ button: Payrails.CardPaymentButton) { // Notification only — the SDK does not wait for this. Use it for analytics or a // loading indicator. To make the payment conditional on your own check, see // How to Run a Merchant Check Before Authorization. } func onAuthorizeSuccess(_ button: Payrails.CardPaymentButton) { // Payment succeeded — navigate to confirmation screen } func onAuthorizeFailed(_ button: Payrails.CardPaymentButton, failure: AuthorizationFailure) { switch failure.code { case .userCancelled: // User dismissed the 3DS sheet or otherwise abandoned the flow. // The SDK has already triggered the `onSessionExpired` refresh closure // (supplied at `createSession`) so retries continue to work against // the same `Session` reference. statusLabel.text = "Payment cancelled." case .authorizationError: // Issuer declined / 3DS rejected. `failure.message` is the backend's // extracted failure reason (e.g. "Insufficient funds") with a generic // fallback — never nil. statusLabel.text = "Declined: \(failure.message)" case .authenticationError: // Session token rejected (401 / 403). The SDK fires `onSessionExpired` // in the background; ask the user to retry. statusLabel.text = "Session expired. Please retry." case .unknownError: // Network, SDK, or other unexpected error. `failure.rawError` carries // the underlying error when one exists. statusLabel.text = "Payment failed: \(failure.rawError?.localizedDescription ?? failure.message)." } } func onThreeDSecureChallenge(_ button: Payrails.CardPaymentButton) { // 3DS challenge is being presented — optional hook }}
Step 7: Test with the sandbox environment
Change the environment to .test when initializing the session:
let configuration = Payrails.Configuration( initData: initData, option: Payrails.Options(env: .test))
Use Payrails sandbox card numbers to test different payment outcomes.
What’s next
Concepts — understand the Session, Elements, and Delegates mental model
Styling Guide — customise card form and button appearance
{"docsConfig":{"theme":"palm","$schema":"https://mintlify.com/docs.json","name":"Payrails Docs","description":"Developer and operator documentation for Payrails, the payment operating system for global enterprises: payment orchestration across providers, PCI-compliant tokenization, analytics and reporting, Chargebacks, and the Payrails REST API.","colors":{"primary":"#D63D00","light":"#E4853A"},"logo":{"light":"https://mintcdn.com/payrails-42074109/knNnlxc2J__TB9tW/logo/light.svg?fit=max\u0026auto=format\u0026n=knNnlxc2J__TB9tW\u0026q=85\u0026s=2692c29175ef45b637b4e2df6e2da330","dark":"https://mintcdn.com/payrails-42074109/knNnlxc2J__TB9tW/logo/dark.svg?fit=max\u0026auto=format\u0026n=knNnlxc2J__TB9tW\u0026q=85\u0026s=651119b7fb40dda938e2f9a7a276ee1c"},"favicon":"https://mintcdn.com/payrails-42074109/zqk7oWHZbW3YniA1/favicon.png?fit=max\u0026auto=format\u0026n=zqk7oWHZbW3YniA1\u0026q=85\u0026s=70b0991c3a7ad3c2faa4530e27040cf8","api":{"params":{"expanded":"all","post":["nullable","x-internal"]},"playground":{"display":"simple"},"examples":{"defaults":"required","prefill":true,"autogenerate":true},"url":"full"},"appearance":{"default":"light"},"navbar":{"links":[{"href":"https://www.payrails.com","label":"Go to payrails.com"}],"primary":{"type":"button","label":"Book a demo","href":"https://www.payrails.com/contact"}},"footer":{"socials":{"x":"https://x.com/Payrails_com","github":"https://github.com/payrails","linkedin":"https://www.linkedin.com/company/payrails"},"links":[{"header":"Company","items":[{"label":"payrails.com","href":"https://www.payrails.com"}]}]},"seo":{"metatags":{"og:locale":"en_US","twitter:site":"@Payrails_com","msvalidate.01":"7723ABF900EAD08F0500790E9BFC62E7"},"organization":{"id":"https://www.payrails.com#organization","name":"Payrails","legalName":"Payrails GmbH","url":"https://www.payrails.com/","logo":"https://www.payrails.com/payrails-logo.svg","sameAs":["https://www.linkedin.com/company/payrails/","https://www.crunchbase.com/organization/payrails","https://www.wikidata.org/wiki/Q137211152","https://x.com/Payrails_com"]}},"styling":{"eyebrows":"breadcrumbs","latex":false},"integrations":{"cookies":{"key":"mintlify_telemetry_enabled","value":"true"}},"contextual":{"options":["copy","view","download-spec","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"thumbnails":{"appearance":"dark","background":"https://mintcdn.com/payrails-42074109/_AaiU-jGVknFpls9/images/common/og-thumbnail-bg-v5.png?fit=max\u0026auto=format\u0026n=_AaiU-jGVknFpls9\u0026q=85\u0026s=b08b137c9aa7638918675c41a07b33c6"},"interaction":{"drilldown":true},"metadata":{"timestamp":true},"markdown":{"instructions":["Use the Payrails Web SDK v6 for new browser integrations. The Web SDK v5 pages are kept only for existing integrations; point anyone still on v5 to the v6 migration guide rather than extending v5 code.","Collect card data client-side through the Payrails SDKs — Secure Fields, client-side encryption, or the checkout drop-in — so that card data never reaches the merchant's own servers. Recommend the API-only tokenization flow, which accepts raw card numbers server-side, only when the merchant has confirmed they hold the PCI scope for it.","Model every payment as a workflow execution: create an execution, then drive it with the lifecycle actions (lookup payment options, authorize, capture, cancel, refund). Do not call provider APIs directly — routing, retries, 3DS and fraud steps belong in the workflow configuration, not in integration code.","Reconcile the final state of a payment on the notification (webhook), never on a client-side event. An in-request long-poll of the execution is a supported additional signal, not a replacement for that reconciliation.","Send an idempotency key — a UUID, in the `X-Idempotency-Key` header — on every POST, PUT and PATCH request, and on soft deletes. GET requests need none, and hard deletes cannot be idempotent.","Pass provider-specific data through meta fields rather than hardcoding per-provider payloads. Payrails translates meta fields into each provider's own format.","Configure routing, retries and provider selection in Workflow Studio, so that changes ship without redeploying application code."]},"navigation":{"global":{"anchors":[]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"payrails-42074109","hasAudioNarration":false,"actualSubdomain":"payrails-42074109","customDomains":["docs.payrails.com"],"gitSource":{"type":"github","owner":"payrails","repo":"docs-payrails-com","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af71dc7bd8b0362cded3cc6","clientVersion":"0.0.4128","searchFilterCounts":[{"language":"default","tag":"Payment Orchestration","count":247},{"language":"default","tag":"Integrations","count":234},{"language":"default","tag":"API Reference","count":192},{"language":"default","tag":"Payment methods","count":147},{"language":"default","tag":"Guides","count":129},{"language":"default","tag":"Payment providers","count":60},{"language":"default","tag":"Dispute","count":57},{"language":"default","tag":"Disputes","count":57},{"language":"default","tag":"SDKs","count":38},{"language":"default","tag":"Payment","count":28}],"searchSettings":{"showContentSnippets":true}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"type":"link","url":"https://www.payrails.com/contact"}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"privacy":{"consentBanner":{"enabled":false}},"googleFontsInlined":false},"customCss":[{"filePath":"css/styles.css","content":"*,:before,:after{box-sizing:border-box}:before,:after{--tw-content: \"\"}html,:host{-webkit-text-size-adjust:100%;tab-size:4;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;font-family:ui-sans-serif,\n system-ui,\n sans-serif,\n Apple Color Emoji,\n Segoe UI Emoji,\n Segoe UI Symbol,\n Noto Color Emoji;line-height:1.5}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}a{color:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-feature-settings:normal;font-variation-settings:normal;font-family:ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n Liberation Mono,\n Courier New,\n monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-0.25em}sup{top:-0.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,select{text-transform:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}#page-context-menu-button{border-radius:var(--border-radius-sm) 0 0 var(--border-radius-sm)}#page-context-menu-button+button,#page-context-menu-button+*+button{border-left:none;border-radius:0 var(--border-radius-sm) var(--border-radius-sm) 0}.peer:not(.is-custom) [data-docs-theme] header+div,header#navbar>div.mx-auto{margin:0 auto;max-width:100rem}[data-active-nav-item=\"true\"]>button,[data-active-nav-item=\"true\"]>a{color:var(--accent)}#navbar>div.mx-auto div.h-16{height:calc(var(--spacing) * 13)}#navbar>div.mx-auto div.h-12{height:calc(var(--spacing) * 8)}@media (min-width: 1024px){#sidebar-content{margin-top:calc(var(--mintlify-slot-header-height, 7rem) - var(--spacing) * 21)}}#navbar>div.mx-auto button.h-9{height:calc(var(--spacing) * 8)}#topbar-cta-button a>div{height:calc(var(--spacing) * 8);padding:0 calc(var(--spacing) * 3.5);border:1px solid rgb(var(--gray-400) / 0.3);border-radius:8px;background:rgb(var(--background-light));color:rgb(var(--gray-500))}#topbar-cta-button a svg{display:none}#topbar-cta-button a:hover>div{color:rgb(var(--gray-800))}html.dark #topbar-cta-button a>div{border-color:rgb(var(--gray-600) / 0.3);background:rgb(var(--background-dark));color:rgb(var(--gray-300))}html.dark #topbar-cta-button a:hover>div{color:rgb(var(--gray-100))}#navbar.peer.is-not-custom.is-not-wide.is-not-center+div,#navbar+div .page-content{max-width:100rem;margin:0 auto}#content-container>div.max-w-5xl{max-width:70rem}.mdx-content a{color:var(--accent);text-decoration:none;\u0026:hover,\u0026:focus{color:var(--link-hover)}\u0026:active,\u0026:active:hover{color:var(--link-active)}}.mdx-content a.link:not(:has(div,img,picture)):not(.not-prose *){border-bottom:0;text-decoration-line:underline;text-decoration-thickness:max(1px, 0.0625rem);text-underline-offset:0.2em;text-decoration-skip-ink:auto;text-decoration-color:color-mix(in srgb, currentColor 70%, transparent);\u0026:hover,\u0026:focus,\u0026:has(>code){text-decoration-color:currentColor}}.callout .prose :where(h1,h2,h3,h4):not(:where([class~=\"not-prose\"],[class~=\"not-prose\"] *)){margin-top:0}#content-area>#content{margin-bottom:calc(var(--spacing) * 8)}#content-area>:is(#content,[id^=\"api-playground\"])+div:not([id]){padding-bottom:calc(var(--spacing) * 6)}#footer.advanced-footer>div{padding-bottom:calc(var(--spacing) * 8);padding-top:calc(var(--spacing) * 8);gap:calc(var(--spacing) * 4)}#footer [data-testid=\"mode-switch-light\"],#footer [data-testid=\"mode-switch-dark\"],#footer [data-testid=\"mode-switch-system\"]{display:none}@media (min-width: 1024px){[role=\"group\"]:has(>[data-theme-preference-value]){width:fit-content;gap:2px;padding:1px}[role=\"group\"]>[data-theme-preference-value]{width:1.5rem;height:1.5rem}}html:not(.dark) #sidebar-content a.text-gray-700{color:rgb(var(--gray-700))}html:not(.dark) #sidebar-content a.text-gray-700:hover{color:rgb(var(--gray-950))}#navigation-items li>button[aria-expanded]{width:100%}#navigation-items li>button[aria-expanded]>div:first-child:has(>svg){order:1}#navigation-items li>button[aria-expanded]>div:first-child>svg{width:0.75rem}#navigation-items li>button[aria-expanded]>div:first-child>svg:not(.text-primary){color:rgb(var(--gray-500) / 0.8)}html.dark #navigation-items li>button[aria-expanded]>div:first-child>svg:not(.text-primary){color:rgb(var(--gray-400))}@media (hover: hover){#navigation-items li>button[aria-expanded]:hover>div:first-child>svg,html.dark #navigation-items li>button[aria-expanded]:hover>div:first-child>svg{color:inherit}}#navigation-items ul ul{margin-left:-0.5rem}html.dark :is(#content,#header>.prose,#table-of-contents),html.dark :is(#navbar,#sidebar-content,#content-area) .dark\\:text-gray-400,html.dark #footer a.dark\\:text-white\\/50{color:rgb(var(--gray-300))}html.dark :is(#navbar,#sidebar-content,#content-area) .dark\\:text-gray-400:hover,html.dark #footer a.dark\\:text-white\\/50:hover,html.dark #table-of-contents .toc-item:not([data-active])>a:hover{color:rgb(var(--gray-100))}html.dark #search-bar-entry{color:rgb(var(--gray-400))}html.dark #footer .dark\\:bg-gray-600{background-color:rgb(var(--gray-400))}html.dark #footer .dark\\:bg-gray-600:hover{background-color:rgb(var(--gray-200))}html.dark .sidebar-group-icon[src*=\"/images/icons/nav/\"]{filter:invert(0.9)}html:not(.dark) .nav-tag-pill-text{color:var(--button-primary-bg-active)}html:not(.dark) .text-green-700.bg-green-400\\/20{color:#166534}html:not(.dark) .text-yellow-700.bg-yellow-400\\/20{color:#854d0e}html:not(.dark) .text-orange-700.bg-orange-400\\/20{color:#9a3412}.text-\\[\\#FFFFFF\\].bg-\\[\\#2AB673\\]{background-color:#15803d}.text-\\[\\#FFFFFF\\].bg-\\[\\#C28C30\\]{background-color:#a16207}.text-\\[\\#FFFFFF\\].bg-\\[\\#DA622B\\]{background-color:#c2410c}html:not(.dark) [data-component-part=\"field-required-pill\"]{color:#b91c1c}html:not(.dark) [data-component-part=\"code-group-tab-bar\"] .text-gray-500:not(:hover){color:rgb(var(--gray-600))}html:not(.dark) [data-component-part=\"code-group-tab-bar\"] .text-primary{color:var(--button-primary-bg-hover)}html:not(.dark) [data-component-part=\"field-info-pill\"] .text-stone-400{color:rgb(var(--gray-600))}html.dark [data-component-part=\"field-info-pill\"] .dark\\:text-stone-500{color:rgb(var(--gray-400))}html.dark :is(#navbar a.dark\\:text-gray-200,#content-area a.dark\\:text-gray-50){color:rgb(var(--gray-50))}html.dark #content-area a.dark\\:text-gray-50:hover{color:var(--accent)}html.dark #content-area a.dark\\:text-gray-50>svg{color:rgb(var(--gray-400))}#table-of-contents .toc-item[data-active]>a{color:var(--accent)}@layer theme{.peer.is-custom~#footer.advanced-footer{display:flex!important;margin-top:auto!important}div:has(>.peer.is-custom~#footer.advanced-footer){display:flex!important;flex-direction:column;min-height:100vh}}#sidebar-content img[src^=\"https://assets.payrails.io/img/logos/\"],#sidebar-content img[src*=\"/images/icons/letters/\"],#sidebar-content img[src*=\"/images/icons/nav/\"]:not(.sidebar-group-icon){width:1.5rem;height:1.5rem;--tile-radius: 0.375rem;border-radius:var(--tile-radius)}#sidebar-content img[src*=\"/images/icons/nav/\"]:not(.sidebar-group-icon){padding:3px;background:var(--tag-neutral-bg)}#sidebar-content img[src^=\"https://assets.payrails.io/img/logos/\"],#sidebar-content img[src*=\"/images/icons/letters/\"],.prose img.page-logo,.provider-card-logo,.payment-method-logo{--tile: var(--tag-neutral-bg);--r: calc(var(--tile-radius) - 1px);background:radial-gradient(circle at 100% 100%, var(--tile) calc(var(--r) - 0.5px), transparent var(--r)) 1px 1px / var(--r) var(--r) no-repeat,\n radial-gradient(circle at 0 100%, var(--tile) calc(var(--r) - 0.5px), transparent var(--r)) calc(100% - 1px) 1px / var(--r) var(--r) no-repeat,\n radial-gradient(circle at 100% 0, var(--tile) calc(var(--r) - 0.5px), transparent var(--r)) 1px calc(100% - 1px) / var(--r) var(--r) no-repeat,\n radial-gradient(circle at 0 0, var(--tile) calc(var(--r) - 0.5px), transparent var(--r)) calc(100% - 1px) calc(100% - 1px) / var(--r) var(--r) no-repeat,\n linear-gradient(var(--tile), var(--tile)) center / calc(100% - 2px) calc(100% - 2 * var(--r)) no-repeat,\n linear-gradient(var(--tile), var(--tile)) center / calc(100% - 2 * var(--r)) calc(100% - 2px) no-repeat}@media (max-width: 767px){.expandable-content{margin:0!important;padding-left:6px!important;padding-right:0!important}.expandable-content .expandable{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.expandable-content .expandable-content{min-width:16rem}.expandable-content:not(.expandable-content *){overflow-x:auto}.expandable-content .prose{padding-right:12px}.param-head div{min-width:0}[data-component-part=\"field-info-pill\"]{display:inline-block!important;max-width:100%;vertical-align:bottom}[data-component-part=\"field-info-pill\"]>span{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden}}.page-logos{display:flex;gap:0.75rem;margin:-1rem 0 1.75rem}.prose .page-logos picture{margin:0}.prose img.page-logo{display:block;width:3.5rem;height:3.5rem;margin:0;--tile-radius: 0.75rem;border-radius:var(--tile-radius);object-fit:contain}@media (prefers-reduced-motion: no-preference){html{scroll-behavior:smooth}}"},{"filePath":"css/vars.css","content":":root{--pr-orange: #d63d00;--pr-black: #000;--pr-white: #fff;--pr-heritage: #0a6cff;--pr-antalya-sea: #597991;--pr-dublin-ale: #e4853a;--pr-baku-brass: #8a725c;--pr-cairo-sand: #d6cbc1;--accent: rgb(var(--primary));--link-active: var(--button-primary-bg-active);--link-hover: var(--button-primary-bg-hover);--main-color: var(--pr-orange);--background: var(--pr-white);--badge-new-bg: #ffedd5;--badge-new-text: #ad3100;--bento-media-gradient-end: #100;--bento-media-gradient-start: #f34f12;--border-radius-sm: 4px;--border-hover: #d1d1d1;--border-subtle: #e5e5e5;--button-focus-outline: #09090b;--button-ghost-bg-active: #e4e4e7;--button-ghost-bg-hover: #f4f4f5;--button-ghost-text: #18181b;--button-primary-bg: var(--main-color);--button-primary-bg-active: #a32e00;--button-primary-bg-hover: #be3600;--button-primary-text: #fff;--button-quaternary-bg: #fff;--button-quaternary-bg-active: #e4e4e7;--button-quaternary-bg-hover: #f4f4f5;--button-quaternary-text: #18181b;--button-secondary-bg: transparent;--button-secondary-bg-active: #fadcc0;--button-secondary-bg-hover: #ffedd5;--button-secondary-border: #ad3100;--button-secondary-text: #ad3100;--button-tertiary-bg: #fff2e1;--button-tertiary-bg-active: #fed7aa;--button-tertiary-bg-hover: #ffedd5;--button-tertiary-text: #ad3100;--capability-chip-bg: #f0f6ff;--capability-chip-border: #d8e6ff;--capability-chip-text: #002e99;--container-gutter-default: 16px;--container-gutter-lg: 32px;--container-max-2xl: 1360px;--foreground: #000;--logo-fallback-0-bg: #eff6ff;--logo-fallback-0-text: #1d4ed8;--logo-fallback-1-bg: #f0fdf4;--logo-fallback-1-text: #15803d;--logo-fallback-2-bg: #fffbeb;--logo-fallback-2-text: #b45309;--logo-fallback-3-bg: #faf5ff;--logo-fallback-3-text: #7e22ce;--logo-fallback-4-bg: #fff1f2;--logo-fallback-4-text: #be123c;--logo-fallback-5-bg: #ecfeff;--logo-fallback-5-text: #0e7490;--status-in-progress: #f0b400;--status-in-progress-bg: #fff4d1;--status-in-progress-text: #7e6612;--status-live: #2ba027;--status-live-bg: #dbf6da;--status-live-text: #207c40;--surface-1: #fff;--surface-2: #f5f5f5;--surface-warm: #f1f0ec;--tag-neutral-bg: #f6f7fa;--tag-neutral-border: #f0f2f6;--tag-neutral-text: #3f4d67;--text-muted: #404040;--text-soft: #666c79;--text-strong: #171717;--text-subtle: #9ca3af}html.dark{--accent: rgb(var(--primary-light));--link-active: #c96f28;--link-hover: #f0a266}"},{"filePath":"snippets/general/card.css","content":".pr-card-group{container-type:inline-size;display:grid;gap:var(--space-4, 16px);margin:var(--space-4, 16px) 0}.pr-card-group--cols-1{grid-template-columns:1fr}.pr-card-group--cols-2{grid-template-columns:repeat(2, minmax(0, 1fr))}.pr-card-group--cols-3{grid-template-columns:repeat(3, minmax(0, 1fr))}.pr-card-group--cols-4{grid-template-columns:repeat(4, minmax(0, 1fr))}@container (max-width: 620px){.pr-card-group--cols-3,.pr-card-group--cols-4{grid-template-columns:repeat(2, minmax(0, 1fr))}}@container (max-width: 340px){.pr-card-group{grid-template-columns:1fr}}.pr-card{display:flex;flex-direction:column;height:100%;overflow:hidden;border:1px solid #e5e5e5;border-radius:1rem;background-color:#fff;box-shadow:0 1px 2px 0 rgb(0 0 0 / 0.05);text-decoration:none;transition:transform 0.2s ease,\n background 0.2s ease,\n box-shadow 0.2s ease}.pr-card:hover{background-color:#f5f5f5;box-shadow:0 10px 15px -3px rgb(0 0 0 / 0.1),\n 0 4px 6px -4px rgb(0 0 0 / 0.1)}.pr-card__image{display:block;background-size:cover;width:100%;height:auto;aspect-ratio:16 / 9;margin:0;object-fit:cover;background-color:#f3f4f6}.pr-card__body{display:flex;flex-direction:column;gap:0.5rem;height:100%;padding:1.5rem}.pr-card__header{display:flex;align-items:center;gap:0.5rem}.pr-card__icon{display:flex;flex-shrink:0;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;border-radius:1rem;background-color:rgb(var(--primary) / 0.1);color:var(--accent)}.pr-card__body:not(:first-child){border-top:1px solid #e5e5e5}.pr-card__title{margin:0;font-size:1.25rem;font-weight:600;line-height:1.25rem;color:var(--foreground)}.pr-card__text{margin:0;font-size:0.875rem;font-weight:400;line-height:1.5rem;color:var(--text-muted)}.dark .pr-card{border-color:#262626;background-color:#171717}.dark .pr-card:hover,.dark .pr-card__image{background-color:#262626}.dark .pr-card__body:not(:first-child){border-top-color:#404040}.dark .pr-card__icon{background-color:#262626}.dark .pr-card__title{color:#fff}.dark .pr-card__text{color:#f5f5f5}.pr-card.hover-zoom{transform:scale(1);\u0026:hover,\u0026:focus{transform:scale(1.05) translateY(-2%)}}@media (prefers-reduced-motion: reduce){.pr-card.hover-zoom{transform:none;\u0026:hover,\u0026:focus{transform:none}}}.provider-card{display:flex;align-items:center;gap:0.75rem;text-align:left}.provider-card-logo{display:block;width:2.5rem;height:2.5rem;flex-shrink:0;overflow:hidden;--tile-radius: 0.5rem;border-radius:var(--tile-radius)}.provider-card-logo img{width:100%;height:100%;margin:0;object-fit:contain}.provider-card-logo-fallback{display:flex;align-items:center;justify-content:center;width:100%;height:100%;background:var(--tag-neutral-bg);color:var(--tag-neutral-text);font-size:1.25rem;font-weight:600;line-height:1}.provider-card-name,.provider-card-type{margin:0}.provider-card-name{font-weight:600}.provider-card-type{font-size:0.875rem;line-height:1.25rem;color:rgb(var(--gray-500))}.dark .provider-card-type{color:rgb(var(--gray-400))}"},{"filePath":"snippets/payment-methods/explorer.css","content":".payment-methods-explorer:empty{min-height:3000px}.payment-method-logo{display:inline-flex;width:28px;height:28px;flex-shrink:0;overflow:hidden;--tile-radius: 0.375rem;border-radius:var(--tile-radius)}.payment-method-logo img{width:100%;height:100%;margin:0;object-fit:contain}"},{"filePath":"snippets/integrations/filterable-list.css","content":".integrations-filter{container-type:inline-size}.integrations-filter:empty::before{content:\"\";display:block;height:184px}@container (min-width: 310px){.integrations-filter:empty::before{height:140px}}@container (min-width: 364px){.integrations-filter:empty::before{height:96px}}@container (min-width: 665px){.integrations-filter:empty::before{height:52px}}.integration-card{display:flex;flex-direction:column}.integration-card>.card{flex:1}.integration-card[hidden]{display:none!important}"}],"page":{"pagePath":"docs/sdks/ios","slug":"/docs/sdks/ios","pageMetadata":{"title":"iOS SDK quick start","sidebarTitle":"Quick start","description":"Install the Payrails iOS SDK with Swift Package Manager, create a session, and render a working card payment screen.","href":"/docs/sdks/ios"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Install the Payrails iOS SDK with Swift Package Manager, create a session, and render a working card payment screen.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,hr:`hr`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Tip}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`quick-start`,children:`Quick Start`}),`\n`,_jsx(_components.p,{children:`Get up and running with the Payrails iOS SDK in about 15 minutes. By the end you will have a working card payment screen in your app.`}),`\n`,_jsx(Heading,{level:`3`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Xcode 16.4+. Each release is built with Xcode 16.4. Swift’s module interface format is not backward compatible across toolchains, so an older Xcode cannot load the prebuilt framework.`}),`\n`,_jsx(_components.li,{children:`iOS 14.0+ deployment target.`}),`\n`,_jsx(_components.li,{children:`Swift 5.0+.`}),`\n`,_jsx(_components.li,{children:`A Payrails merchant account and a backend that can fetch an init payload.`}),`\n`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`3`,id:`step-1-install-the-sdk`,children:`Step 1: Install the SDK`}),`\n`,_jsx(_components.p,{children:`The SDK ships as a prebuilt, signed XCFramework. Swift Package Manager is the only supported installation method.`}),`\n`,_jsxs(_components.p,{children:[`In Xcode, click `,_jsx(_components.strong,{children:`File → Add Package Dependencies`}),` and enter the package URL:`]}),`\n`,_jsx(CodeBlock,{numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`https://github.com/payrails/ios-sdk.git`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Select the `,_jsx(_components.code,{children:`Payrails`}),` product and add it to your app target.`]}),`\n`,_jsxs(_components.p,{children:[`To declare the dependency in a `,_jsx(_components.code,{children:`Package.swift`}),` instead:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`swift`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`swift`,children:_jsxs(_components.code,{language:`swift`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`dependencies`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`package`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`url`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://github.com/payrails/ios-sdk.git\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"3.2.0\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Swift Package Manager downloads the framework and verifies it against the checksum published in the package manifest. Resolution also pulls in `,_jsx(_components.code,{children:`PayrailsCSE`}),` and `,_jsx(_components.code,{children:`PayPalCheckout`}),`, so three packages appear in your project, not one.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`3`,id:`step-2-enable-apple-pay-capability-optional`,children:`Step 2: Enable Apple Pay capability (optional)`}),`\n`,_jsxs(_components.p,{children:[`If you plan to use Apple Pay, add the `,_jsx(_components.strong,{children:`Apple Pay`}),` capability in Xcode under `,_jsx(_components.strong,{children:`Signing \u0026 Capabilities`}),` and provide your merchant identifier.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`3`,id:`step-3-fetch-the-init-payload-from-your-backend`,children:`Step 3: Fetch the init payload from your backend`}),`\n`,_jsx(_components.p,{children:`The SDK requires an init payload that your backend fetches from the Payrails API. This payload is a base64-encoded JSON string along with a version string.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`swift`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`swift`,children:_jsxs(_components.code,{language:`swift`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Your backend call — implementation depends on your networking layer`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`func`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` fetchInitPayload`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`async`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` throws`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ->`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (data: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`String`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, version: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`String`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) {`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Call your backend, which calls the Payrails /checkout/initialize endpoint`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:\" // Returns the `data` and `version` fields from the Payrails response\"})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`3`,id:`step-4-initialize-the-sdk-session`,children:`Step 4: Initialize the SDK session`}),`\n`,_jsx(Heading,{level:`4`,id:`async/await`,children:`Async/await`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`28`,language:`swift`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`swift`,children:_jsxs(_components.code,{language:`swift`,numberOfLines:`28`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Payrails`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`let`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` initData `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Payrails.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`InitData`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` version`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"2\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// version returned from your backend`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` data`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003cbase64-payload>\"`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // data returned from your backend`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`let`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` configuration `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Payrails.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`Configuration`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` initData`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: initData,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` option`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: Payrails.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`Options`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`env`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: .`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`production`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// use .test for sandbox`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`do`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` let`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` session `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` try`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Payrails.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`createSession`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` with`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: configuration,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` onSessionExpired`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: { completion `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`in`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Re-run your backend's init flow (authentication + initSdk) and hand`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // the fresh InitData back. The SDK swaps its internal config in place —`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:\" // your `session` reference and any cached buttons / forms keep working.\"})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` fetchFreshPayrailsInitData`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { result `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`in`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` completion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(result)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` )`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // session is ready; store it or proceed to build your UI`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`} `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`catch`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` print`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"SDK initialization failed:\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, error.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`localizedDescription`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(Tip,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Recommended`})}),_jsxs(_components.p,{children:[`supply `,_jsx(_components.code,{children:`onSessionExpired`}),` at `,_jsx(_components.code,{children:`createSession`}),` time. The SDK invokes it when it detects the current execution is no longer reusable (most commonly: the user abandoned a 3DS challenge). Without it, the next payment attempt against the poisoned `,_jsx(_components.code,{children:`Session`}),` fails naturally and the SDK logs a warning at init.`]})]}),`\n`,_jsx(Heading,{level:`4`,id:`callback`,children:`Callback`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`swift`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`swift`,children:_jsxs(_components.code,{language:`swift`,numberOfLines:`8`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`Payrails.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`createSession`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`with`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: configuration) { result `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`in`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` switch`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` result {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` case`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`success`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`let`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` session)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // session is ready`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` case`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`failure`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`let`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` error)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` print`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"SDK initialization failed:\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, error.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`localizedDescription`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`3`,id:`step-5-build-a-card-payment-screen`,children:`Step 5: Build a card payment screen`}),`\n`,_jsx(_components.p,{children:`Payrails provides UIKit-based elements. Add them to your view hierarchy:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`44`,language:`swift`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`swift`,children:_jsxs(_components.code,{language:`swift`,numberOfLines:`44`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` UIKit`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` Payrails`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` CheckoutViewController`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`UIViewController`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`PaymentPresenter `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` var`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` encryptedCardData: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`String`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` override`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` func`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` viewDidLoad`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` super`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`viewDidLoad`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // 1. Create the card form`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` let`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` cardForm `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Payrails.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`createCardForm`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // 2. Create the pay button`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` let`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` payButton `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Payrails.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`createCardPaymentButton`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` translations`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`CardPaymenButtonTranslations`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`label`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Pay now\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` )`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` payButton.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`delegate`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` self`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` payButton.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`presenter`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` self`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // PaymentPresenter: required to present 3DS challenges`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // 3. Add to view hierarchy`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` view.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`addSubview`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(cardForm)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` view.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`addSubview`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(payButton)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // 4. Layout (use Auto Layout or frames as preferred)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` cardForm.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`translatesAutoresizingMaskIntoConstraints`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` false`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` payButton.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`translatesAutoresizingMaskIntoConstraints`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` false`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` NSLayoutConstraint.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`activate`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`([`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` cardForm.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`topAnchor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`constraint`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`equalTo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: view.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`safeAreaLayoutGuide`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`topAnchor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`constant`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`24`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` cardForm.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`leadingAnchor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`constraint`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`equalTo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: view.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`leadingAnchor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`constant`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`16`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` cardForm.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`trailingAnchor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`constraint`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`equalTo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: view.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`trailingAnchor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`constant`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`-16`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` payButton.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`topAnchor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`constraint`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`equalTo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: cardForm.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`bottomAnchor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`constant`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`16`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` payButton.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`leadingAnchor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`constraint`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`equalTo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: view.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`leadingAnchor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`constant`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`16`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` payButton.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`trailingAnchor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`constraint`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`equalTo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: view.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`trailingAnchor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`constant`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`-16`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ])`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // PaymentPresenter: called when a view controller must be presented (e.g. 3DS)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` func`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` presentPayment`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`_`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` viewController`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: UIViewController) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` present`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(viewController, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`animated`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`3`,id:`step-6-handle-payment-results`,children:`Step 6: Handle payment results`}),`\n`,_jsxs(_components.p,{children:[`Conform to `,_jsx(_components.code,{children:`PayrailsCardPaymentButtonDelegate`}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`40`,language:`swift`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`swift`,children:_jsxs(_components.code,{language:`swift`,numberOfLines:`40`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`extension`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` CheckoutViewController`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`PayrailsCardPaymentButtonDelegate `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` func`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` onPaymentButtonClicked`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`_`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` button`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: Payrails.CardPaymentButton) {`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Notification only — the SDK does not wait for this. Use it for analytics or a`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // loading indicator. To make the payment conditional on your own check, see`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // How to Run a Merchant Check Before Authorization.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` func`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` onAuthorizeSuccess`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`_`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` button`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: Payrails.CardPaymentButton) {`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // Payment succeeded — navigate to confirmation screen`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` func`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` onAuthorizeFailed`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`_`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` button`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: Payrails.CardPaymentButton, `}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`failure`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: AuthorizationFailure) {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` switch`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` failure.code {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` case`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`userCancelled`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // User dismissed the 3DS sheet or otherwise abandoned the flow.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:\" // The SDK has already triggered the `onSessionExpired` refresh closure\"})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:\" // (supplied at `createSession`) so retries continue to work against\"})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:\" // the same `Session` reference.\"})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` statusLabel.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:`text`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Payment cancelled.\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` case`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`authorizationError`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:\" // Issuer declined / 3DS rejected. `failure.message` is the backend's\"})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // extracted failure reason (e.g. \"Insufficient funds\") with a generic`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // fallback — never nil.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` statusLabel.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:`text`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Declined: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`\\\\(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`failure.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`message`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`)`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` case`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`authenticationError`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:\" // Session token rejected (401 / 403). The SDK fires `onSessionExpired`\"})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // in the background; ask the user to retry.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` statusLabel.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:`text`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Session expired. Please retry.\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` case`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` .`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`unknownError`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:\" // Network, SDK, or other unexpected error. `failure.rawError` carries\"})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // the underlying error when one exists.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` statusLabel.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#9CDCFE`},children:`text`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Payment failed: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`\\\\(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`failure.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`rawError`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`?`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`localizedDescription`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ??`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:` failure.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`message`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`)`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`.\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` func`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` onThreeDSecureChallenge`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`_`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` button`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: Payrails.CardPaymentButton) {`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // 3DS challenge is being presented — optional hook`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`3`,id:`step-7-test-with-the-sandbox-environment`,children:`Step 7: Test with the sandbox environment`}),`\n`,_jsxs(_components.p,{children:[`Change the environment to `,_jsx(_components.code,{children:`.test`}),` when initializing the session:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`swift`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`swift`,children:_jsxs(_components.code,{language:`swift`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`let`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` configuration `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Payrails.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`Configuration`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` initData`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: initData,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` option`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: Payrails.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`Options`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`env`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: .`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`test`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Use Payrails sandbox card numbers to test different payment outcomes.`}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`what’s-next`,children:`What’s next`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/docs/sdks/ios/sdk-concepts`,children:`Concepts`}),` — understand the Session, Elements, and Delegates mental model`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/docs/sdks/ios/styling-guide`,children:`Styling Guide`}),` — customise card form and button appearance`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/docs/sdks/ios/sdk-concepts#how-to-tokenize-a-card`,children:`How to Tokenize a Card`}),` — save a card without immediate payment`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/docs/sdks/ios/sdk-api-reference#how-to-query-session-data`,children:`How to Query Session Data`}),` — read execution ID, amount, and more`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/docs/sdks/ios/sdk-concepts#how-to-run-a-merchant-check-before-authorization`,children:`How to Run a Merchant Check Before Authorization`}),` — approve a payment against your own backend first`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/docs/sdks/ios/sdk-concepts#how-to-support-co-branded-cards`,children:`How to Support Co-branded Cards`}),` — let the shopper choose the payment network`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/docs/sdks/ios/sdk-concepts#how-to-handle-expired-stored-cards`,children:`How to Handle Expired Stored Cards`}),` — hide or flag saved cards past their expiry`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/docs/sdks/ios/sdk-api-reference`,children:`iOS SDK API Reference`}),` — complete API documentation`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/docs/sdks/ios/troubleshooting`,children:`Troubleshooting`}),` — common issues and fixes`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"iOS SDK quick start","sidebarTitle":"Quick start","description":"Install the Payrails iOS SDK with Swift Package Manager, create a session, and render a working card payment screen.","href":"/docs/sdks/ios"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Quick Start","slug":"quick-start","depth":2,"children":[{"title":"Prerequisites","slug":"prerequisites","depth":3,"children":[]},{"title":"Step 1: Install the SDK","slug":"step-1-install-the-sdk","depth":3,"children":[]},{"title":"Step 2: Enable Apple Pay capability (optional)","slug":"step-2-enable-apple-pay-capability-optional","depth":3,"children":[]},{"title":"Step 3: Fetch the init payload from your backend","slug":"step-3-fetch-the-init-payload-from-your-backend","depth":3,"children":[]},{"title":"Step 4: Initialize the SDK session","slug":"step-4-initialize-the-sdk-session","depth":3,"children":[]},{"title":"Async/await","slug":"async/await","depth":4,"children":[]},{"title":"Callback","slug":"callback","depth":4,"children":[]},{"title":"Step 5: Build a card payment screen","slug":"step-5-build-a-card-payment-screen","depth":3,"children":[]},{"title":"Step 6: Handle payment results","slug":"step-6-handle-payment-results","depth":3,"children":[]},{"title":"Step 7: Test with the sandbox environment","slug":"step-7-test-with-the-sandbox-environment","depth":3,"children":[]}]},{"title":"What’s next","slug":"what’s-next","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/payrails-42074109/138fc948c6832630/consent.js","/_mintlify/custom/payrails-42074109/6a6f8c8ba4227cb9/same-tab-links.js","/_mintlify/custom/payrails-42074109/6e438b650fe2798f/noindex-other-hosts.js"],"subdomain":"payrails-42074109","siteName":"Payrails Docs","title":"iOS SDK quick start - Payrails Docs","relatedPagesConfig":{"enabled":true,"limit":3,"mode":"automatic"},"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-13T10:55:00.087Z","gitLastModified":"2026-11-13T10:54:28.000Z","originalFileLocation":"docs/sdks/ios.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Install the Payrails iOS SDK with Swift Package Manager, create a session, and render a working card payment screen.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Payrails Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/payrails-42074109/xPEGo5yZy52JZSmG/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/payrails-42074109/xPEGo5yZy52JZSmG/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/payrails-42074109/xPEGo5yZy52JZSmG/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/payrails-42074109/xPEGo5yZy52JZSmG/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/payrails-42074109/xPEGo5yZy52JZSmG/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/payrails-42074109/xPEGo5yZy52JZSmG/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/payrails-42074109/xPEGo5yZy52JZSmG/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/payrails-42074109/xPEGo5yZy52JZSmG/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/payrails-42074109/xPEGo5yZy52JZSmG/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"iOS SDK quick start - Payrails Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Install the Payrails iOS SDK with Swift Package Manager, create a session, and render a working card payment screen.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Payrails Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.payrails.com/docs/sdks/ios\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://payrails-42074109.mintlify.site/_mintlify/api/og/v2?division=iOS+SDK\u0026amp;title=iOS+SDK+quick+start\u0026amp;description=Install+the+Payrails+iOS+SDK+with+Swift+Package+Manager%2C+create+a+session%2C+and+render+a+working+card+payment+screen.\u0026amp;theme=fc36d2d43704e46c9451c8d9\u0026amp;signature=f5ded6b1586bde1e1b0052411c1ae22a82ece00019804139452d6283e7d59dd5\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"iOS SDK quick start - Payrails Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Install the Payrails iOS SDK with Swift Package Manager, create a session, and render a working card payment screen.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://payrails-42074109.mintlify.site/_mintlify/api/og/v2?division=iOS+SDK\u0026amp;title=iOS+SDK+quick+start\u0026amp;description=Install+the+Payrails+iOS+SDK+with+Swift+Package+Manager%2C+create+a+session%2C+and+render+a+working+card+payment+screen.\u0026amp;theme=fc36d2d43704e46c9451c8d9\u0026amp;signature=f5ded6b1586bde1e1b0052411c1ae22a82ece00019804139452d6283e7d59dd5\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/payrails-42074109/xPEGo5yZy52JZSmG/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Payrails Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#D63D00\">\u003cmeta data-mint-head name=\"og:locale\" content=\"en_US\">\u003cmeta data-mint-head name=\"msvalidate.01\" content=\"7723ABF900EAD08F0500790E9BFC62E7\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.payrails.com/docs/sdks/ios\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/sdks/ios.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://www.payrails.com#organization\",\"name\":\"Payrails\",\"legalName\":\"Payrails GmbH\",\"url\":\"https://www.payrails.com/\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://www.payrails.com/payrails-logo.svg\"},\"sameAs\":[\"https://www.linkedin.com/company/payrails/\",\"https://www.crunchbase.com/organization/payrails\",\"https://www.wikidata.org/wiki/Q137211152\",\"https://x.com/Payrails_com\"]},{\"@type\":\"WebSite\",\"@id\":\"https://docs.payrails.com#website\",\"name\":\"Payrails Docs\",\"url\":\"https://docs.payrails.com\",\"publisher\":{\"@id\":\"https://www.payrails.com#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.payrails.com/docs/sdks/ios#webpage\",\"url\":\"https://docs.payrails.com/docs/sdks/ios\",\"name\":\"iOS SDK quick start\",\"description\":\"Install the Payrails iOS SDK with Swift Package Manager, create a session, and render a working card payment screen.\",\"dateModified\":\"2026-11-13T10:54:28.000Z\",\"isPartOf\":{\"@id\":\"https://docs.payrails.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.payrails.com/docs/sdks/ios#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.payrails.com/docs/sdks/ios#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Payrails Docs\",\"item\":\"https://docs.payrails.com\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"iOS SDK quick start\",\"item\":\"https://docs.payrails.com/docs/sdks/ios\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.payrails.com/docs/sdks/ios#article\",\"headline\":\"iOS SDK quick start\",\"name\":\"iOS SDK quick start\",\"description\":\"Install the Payrails iOS SDK with Swift Package Manager, create a session, and render a working card payment screen.\",\"url\":\"https://docs.payrails.com/docs/sdks/ios\",\"mainEntityOfPage\":{\"@id\":\"https://docs.payrails.com/docs/sdks/ios#webpage\"},\"dateModified\":\"2026-11-13T10:54:28.000Z\",\"publisher\":{\"@id\":\"https://www.payrails.com#organization\"},\"isPartOf\":{\"@id\":\"https://docs.payrails.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Payrails Docs\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Payrails\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/docs/sdks/ios.md","siteName":"Payrails Docs","nav":{"global":{"anchors":[]},"tabs":[{"tab":"Home","pages":[{"title":"Home","href":""}]},{"tab":"Guides","pages":[{"title":"Guides","href":"/docs/explore-payrails"}]},{"tab":"Integrations","pages":[{"title":"Integrations","href":"/docs/integrations"}]},{"tab":"SDKs","groups":[{"group":"Getting Started","icon":"https://mintlify.s3.us-west-1.amazonaws.com/payrails-42074109/images/icons/nav/rocket_launch.svg","pages":[{"title":"SDKs","sidebarTitle":"Overview","href":"/docs/sdks"},{"title":"Checkout SDKs","href":"/docs/sdks/checkout-sdks"}]},{"group":"Web SDK","icon":"https://mintlify.s3.us-west-1.amazonaws.com/payrails-42074109/images/icons/nav/language.svg","pages":[{"title":"Web SDK quick start","sidebarTitle":"Quick start","href":"/docs/sdks/web"},{"group":"Guides","pages":[{"title":"Customize the web SDK checkout's appearance","sidebarTitle":"Customize the appearance","href":"/docs/sdks/web/guides/customize-the-checkouts-appearance"},{"title":"Accept card payments with the web SDK","sidebarTitle":"Accept card payments","href":"/docs/sdks/web/guides/accept-card-payments"},{"title":"Collect tax IDs for card payments in the web SDK","sidebarTitle":"Collect tax IDs","href":"/docs/sdks/web/guides/collect-tax-ids-for-card-payments"},{"title":"Add Apple Pay and Google Pay to the web SDK","sidebarTitle":"Add Apple Pay and Google Pay","href":"/docs/sdks/web/guides/add-apple-pay-and-google-pay"},{"title":"Accept APMs without a redirect in the web SDK","sidebarTitle":"Accept APMs without a redirect","href":"/docs/sdks/web/guides/accept-alternative-payment-methods-without-a-redirect"},{"title":"Collect card data with Secure Fields in the web SDK","sidebarTitle":"Collect card data with Secure Fields","href":"/docs/sdks/web/guides/collect-card-data-with-secure-fields-collect-container"},{"title":"Handle the actionRequired event in the web SDK","sidebarTitle":"Handle actionRequired","href":"/docs/sdks/web/guides/action-required-event"}]},{"group":"v6 Migration Guide","pages":[{"title":"Web SDK v6 migration guide","sidebarTitle":"Migration guide","href":"/docs/sdks/web/v6-migration/v6-migration-guide"},{"title":"Web SDK v6 migration runbook for AI agents","sidebarTitle":"Agent runbook","href":"/docs/sdks/web/v6-migration/agent-runbook-v6-migration"}]},{"group":"Web SDK v5","tag":"Legacy","pages":[{"title":"Web SDK v5 Secure Fields","sidebarTitle":"Secure Fields","href":"/docs/sdks/web-v5-legacy/secure-fields"},{"title":"Web SDK v5 Elements","sidebarTitle":"Elements","href":"/docs/sdks/web-v5-legacy/elements"},{"title":"Web SDK v5 Drop-in","sidebarTitle":"Drop-in","href":"/docs/sdks/web-v5-legacy/drop-in"},{"title":"Web SDK v5 events glossary","sidebarTitle":"Events glossary","href":"/docs/sdks/web-v5-legacy/sdk-events-glossary"},{"title":"Web SDK v5 headless integration","sidebarTitle":"Headless integration","description":"Use the Web SDK v5 `api()` and `query()` methods to update or delete stored instruments and read session configuration from the client.","href":"/docs/sdks/web-v5-legacy/headless-integration-using-sdk"}]}]},{"group":"iOS SDK","icon":"https://mintlify.s3.us-west-1.amazonaws.com/payrails-42074109/images/icons/nav/phone_iphone.svg","pages":[{"title":"iOS SDK quick start","sidebarTitle":"Quick start","href":"/docs/sdks/ios"},{"title":"iOS SDK concepts","sidebarTitle":"Concepts","description":"This page explains the mental model behind the Payrails iOS SDK so you can reason about integration decisions confidently.","href":"/docs/sdks/ios/sdk-concepts"},{"title":"iOS SDK styling guide","sidebarTitle":"Styling guide","href":"/docs/sdks/ios/styling-guide"},{"title":"iOS SDK troubleshooting","sidebarTitle":"Troubleshooting","href":"/docs/sdks/ios/troubleshooting"}]},{"group":"Android SDK","icon":"https://mintlify.s3.us-west-1.amazonaws.com/payrails-42074109/images/icons/nav/android.svg","pages":[{"title":"Android SDK quick start","sidebarTitle":"Quick start","href":"/docs/sdks/android"},{"title":"Android SDK concepts","sidebarTitle":"Concepts","href":"/docs/sdks/android/sdk-concepts"},{"group":"Guides","expanded":false,"pages":[{"title":"Support co-branded cards","sidebarTitle":"Co-branded cards","href":"/docs/sdks/android/co-branded-cards"},{"title":"Build your own pay button","sidebarTitle":"Custom pay button","href":"/docs/sdks/android/custom-pay-button"},{"title":"Gate payment authorization","sidebarTitle":"Gate payment authorization","href":"/docs/sdks/android/gate-payment-authorization"},{"title":"Run headless payments","sidebarTitle":"Headless payments","href":"/docs/sdks/android/execute-payment-headless"},{"title":"Accept PayPal payments","sidebarTitle":"PayPal payments","href":"/docs/sdks/android/accept-paypal-payments"},{"title":"Query session data","sidebarTitle":"Query session data","href":"/docs/sdks/android/query-session-data-at-runtime"},{"title":"Accept redirect payments","sidebarTitle":"Redirect payments","href":"/docs/sdks/android/accept-redirect-payments"},{"title":"Tokenize a card without charging it","sidebarTitle":"Tokenize without charging","href":"/docs/sdks/android/tokenize-card"},{"title":"Update the checkout amount","sidebarTitle":"Update checkout amount","href":"/docs/sdks/android/update-checkout-amount"}]},{"title":"Android SDK styling guide","sidebarTitle":"Styling guide","href":"/docs/sdks/android/styling-guide"},{"title":"Android SDK troubleshooting","sidebarTitle":"Troubleshooting","href":"/docs/sdks/android/troubleshooting"}]},{"group":"React Native SDK","icon":"https://mintlify.s3.us-west-1.amazonaws.com/payrails-42074109/images/icons/nav/devices.svg","pages":[{"title":"React Native SDK quick start","sidebarTitle":"Quick start","href":"/docs/sdks/react-native"},{"title":"Integrate the React Native SDK","sidebarTitle":"Integrate","href":"/docs/sdks/react-native/integrate"},{"title":"React Native SDK concepts","sidebarTitle":"Concepts","href":"/docs/sdks/react-native/sdk-concepts"}]},{"group":"Fraud SDK","icon":"https://mintlify.s3.us-west-1.amazonaws.com/payrails-42074109/images/icons/nav/shield_person.svg","pages":[{"title":"Payrails Web Fraud SDK","href":"/docs/sdks/fraud-sdk"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/reference"}]}]},"basePath":"","title":"iOS SDK quick start - Payrails Docs","buildId":"dpl_5tKr6cUUeuVJdEZ9JAEY3h4soMJ8","deploymentId":"dpl_5tKr6cUUeuVJdEZ9JAEY3h4soMJ8","dynamics":[],"chunks":[]}