{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-ios/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["img","admonition"]},"type":"markdown"},"seo":{"title":"Tap to Pay on iPhone Overview | iOS SDK Reference","description":"Accept in-person contactless payments on iPhone with the Finix Tap to Pay on iPhone SDK. No card reader or extra hardware required.","siteUrl":"https://docs.finix.com/","llmstxt":{"hide":false,"sections":[{"title":"Getting Started","includeFiles":["guides/getting-started/**/*.md"],"excludeFiles":[]},{"title":"Online Payments","includeFiles":["guides/online-payments/**/*.md"],"excludeFiles":["guides/online-payments/payment-features/fsa-hsa-non-healthcare-mcc.md"]},{"title":"In-Person Payments","includeFiles":["guides/in-person-payments/**/*.md"],"excludeFiles":[]},{"title":"Subscriptions","includeFiles":["guides/subscriptions/**/*.md"],"excludeFiles":[]},{"title":"After the Payment","includeFiles":["guides/after-the-payment/**/*.md"],"excludeFiles":[]},{"title":"Managing Operations","includeFiles":["guides/managing-operations/**/*.md"],"excludeFiles":[]},{"title":"Platform Payments","includeFiles":["guides/platform-payments/**/*.md"],"excludeFiles":[]},{"title":"Payouts","includeFiles":["guides/payouts/**/*.md"],"excludeFiles":[]},{"title":"Low-Code / No-Code","includeFiles":["low-code-no-code/**/*.md"],"excludeFiles":[]},{"title":"Developers","includeFiles":["additional-resources/developers/**/*.md"],"excludeFiles":[]},{"title":"Plugins","includeFiles":["additional-resources/plugins/**/*.md"],"excludeFiles":[]},{"title":"Industry Considerations","includeFiles":["guides/industry-considerations/**/*.md"],"excludeFiles":[]},{"title":"Regional Considerations","includeFiles":["guides/regional-considerations/**/*.md"],"excludeFiles":[]},{"title":"Release Notes","includeFiles":["release-notes/**/*.md"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"tap-to-pay-on-iphone-sdk","__idx":0},"children":["Tap to Pay on iPhone SDK"]},{"$$mdtype":"Tag","name":"Image","attributes":{"src":"/assets/tap-to-pay-on-iphone-hero.6ab2e0bdbb399acf8ed27de49b31e3617195338281a1680f412dcde320f2f22e.fec90461.webp","alt":"A hand holds an iPhone showing a Tap to Pay on iPhone prompt to pay $17.25 while another hand taps a contactless card against the phone","withLightbox":true,"width":"600","style":"box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); border-radius: 8px"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Accept in-person contactless payments on iPhone with no extra hardware. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FinixTapToPaySDK"]}," is built on Apple's Tap to Pay on iPhone technology and handles the full payment through Finix. Your app starts a transaction, the Buyer taps a card or digital wallet on the merchant's iPhone, and the SDK returns a completed Finix Transfer."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Using the Finix Checkout app?"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This section is for developers integrating ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FinixTapToPaySDK"]}," into their own iOS app. To accept Tap to Pay on iPhone payments without writing code, see ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/low-code-no-code/mobile-apps/finix-checkout/tap-to-pay-on-iphone"},"children":["Accept Payments with Tap to Pay on iPhone"]}," in the Finix Checkout app."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"how-it-works","__idx":1},"children":["How it works"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Your app starts a transaction with an amount and a transaction type."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The SDK presents Apple's secure card-reading sheet and the Buyer taps a card or device. The card read happens entirely inside Apple's Tap to Pay on iPhone technology, so your app and the SDK never see raw card data."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The SDK submits the payment to Finix itself and waits for the outcome. You do not make a separate API call to create the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Transfer"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The SDK returns a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TapToPayTransactionResult"]}," with the Finix ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Transfer"]}," ID, its state, and masked card details."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Throughout the transaction, the SDK publishes progress events (card reading, processing, success or failure) that you can use to drive your UI."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The SDK source is available on ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://github.com/finix-payments/finix-taptopay-ios-sdk"},"children":["GitHub"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"what-the-sdk-handles-and-what-you-build","__idx":2},"children":["What the SDK handles and what you build"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["The SDK handles:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Apple's Tap to Pay on iPhone session and card-reading UI."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Presenting Apple's Terms and Conditions when you link the merchant's Apple Account."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Authentication with Finix and secure token lifecycle. You never handle tokens."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Submitting the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Transfer"]}," to Finix and returning the outcome."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Progress events for your transaction UI."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Your app builds:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The Apple entitlement setup and App Review requirements. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/app-review"},"children":["Prepare for App Review"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Merchant onboarding, education, and enablement screens."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The checkout button and the processing and outcome screens around a transaction."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Digital receipts."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Device provisioning against the Finix API, typically from your backend. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/device-setup"},"children":["Set up a Device"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"system-requirements","__idx":3},"children":["System requirements"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"device-and-os","__idx":4},"children":["Device and OS"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Requirement"},"children":["Requirement"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Value"},"children":["Value"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Device"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["iPhone XS or later."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["iOS version"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["18.1 or later."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Testing"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Physical iPhone required. The simulator cannot accept taps."]}]}]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"iPad is not supported"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Tap to Pay on iPhone is not available on iPad."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"development-environment","__idx":5},"children":["Development environment"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Requirement"},"children":["Requirement"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Value"},"children":["Value"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Xcode"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["16.0 or later."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Swift"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["5.9 or later."]}]}]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"apple-requirements","__idx":6},"children":["Apple requirements"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Membership in the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://developer.apple.com/support/enrollment/"},"children":["Apple Developer Program"]}," with an organization account."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The Tap to Pay on iPhone entitlement, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["com.apple.developer.proximity-reader.payment.acceptance"]},", granted by Apple. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/apple-entitlement"},"children":["Apple entitlement setup"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"finix-requirements","__idx":7},"children":["Finix requirements"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A Finix account with access to the Finix Dashboard."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["API credentials (username and password) for the environment you are targeting."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["An approved merchant. You need its ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Merchant"]}," ID (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["MUxxxxxxxxxxxxx"]},"), its processing MID, and its display name."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["An activated Finix ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Device"]}," resource representing the iPhone, created in ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/device-setup"},"children":["Set up a Device"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"environments","__idx":8},"children":["Environments"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Finix Sandbox and Production are independent environments with their own credentials and merchants. The environment is explicit in the SDK configuration (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".sandbox"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":[".production"]},"), and a configuration's credentials, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Merchant"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Device"]}," must all belong to the same environment. All examples in this guide run against Sandbox. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/credentials"},"children":["Credentials and environments"]}," for details."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"integration-checklist","__idx":9},"children":["Integration checklist"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Work through the parts of this guide in order. Each step links to the section that covers it."]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Confirm the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"#system-requirements"},"children":["system requirements"]},": iPhone XS or later, iOS 18.1 or later, and a physical device."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Request the Apple entitlement and configure your Xcode project. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/apple-entitlement"},"children":["Apple entitlement setup"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Gather your Finix Sandbox API credentials and merchant details. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/credentials"},"children":["Credentials and environments"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create a Finix ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Device"]}," for the iPhone. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/device-setup"},"children":["Set up a Device"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Add the SDK package, build a configuration, and initialize the SDK. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/installation"},"children":["Installation and initialization"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Link the merchant's Apple Account. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/account-linking"},"children":["Account linking"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Warm up the reader. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/transactions#prepare-the-reader"},"children":["Prepare the reader"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Take a payment and handle the result. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/transactions"},"children":["Transactions"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Test end to end, review privacy disclosures, and prepare your App Review submission. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/testing"},"children":["Test your integration"]},", ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/privacy"},"children":["Privacy and data collection"]},", and ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/app-review"},"children":["Prepare for App Review"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"best-practices","__idx":10},"children":["Best practices"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Each of these is covered in more detail in the linked section."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Warm up the reader before the first tap."]}," Prepare the reader at app launch or when the app returns to the foreground, and enable ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["autoPrepareOnForeground"]}," so an existing session is re-prepared automatically. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/transactions#prepare-the-reader"},"children":["Prepare the reader"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Gate every entry point on ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["FinixTapToPay.isSupported()"]},"."]}," This keeps the Tap to Pay on iPhone button hidden on devices that can't use it."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Subscribe to transaction events before starting a transaction, and show your processing screen immediately."]}," Apple expects your UI to respond within about a second of the merchant starting a payment. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/transactions#subscribe-to-transaction-events"},"children":["Subscribe to transaction events"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Create the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Device"]}," once and cache its ID."]}," Provision it from your backend and reuse the stored ID on every launch instead of creating duplicates. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/device-setup#cache-and-reuse-the-device-id"},"children":["Cache and reuse the Device ID"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Deliver credentials from your backend instead of embedding them in the app binary."]}," See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/credentials#keep-credentials-off-the-client-where-you-can"},"children":["Keep credentials off the client"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Build Apple's user-experience requirements in from the start."]}," Follow the Human Interface Guidelines, use Apple's built-in merchant education UI on iOS 18+, and keep the checkout button prominent and always visible. Retrofitting these requirements later often delays App Review. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/app-review"},"children":["Prepare for App Review"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Test on a physical iPhone running a release version of iOS."]}," The simulator cannot accept taps, and Tap to Pay on iPhone does not work on iOS beta releases. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/testing"},"children":["Test your integration"]},"."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Next:"]}," ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/ios/tap-to-pay/apple-entitlement"},"children":["Apple entitlement setup"]},"."]}]},"headings":[{"value":"Tap to Pay on iPhone SDK","id":"tap-to-pay-on-iphone-sdk","depth":1},{"value":"How it works","id":"how-it-works","depth":2},{"value":"What the SDK handles and what you build","id":"what-the-sdk-handles-and-what-you-build","depth":2},{"value":"System requirements","id":"system-requirements","depth":2},{"value":"Device and OS","id":"device-and-os","depth":3},{"value":"Development environment","id":"development-environment","depth":3},{"value":"Apple requirements","id":"apple-requirements","depth":3},{"value":"Finix requirements","id":"finix-requirements","depth":3},{"value":"Environments","id":"environments","depth":2},{"value":"Integration checklist","id":"integration-checklist","depth":2},{"value":"Best practices","id":"best-practices","depth":2}],"frontmatter":{"seo":{"title":"Tap to Pay on iPhone Overview | iOS SDK Reference","description":"Accept in-person contactless payments on iPhone with the Finix Tap to Pay on iPhone SDK. No card reader or extra hardware required."}},"lastModified":"2026-08-11T19:49:07.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/ios/tap-to-pay","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}