Skip to content

Tap to Pay on iPhone

Discipline-enforcing skill for accepting contactless card payments on iPhone via the ProximityReader framework. Tap to Pay replaces external card readers — no Bluetooth dongles, no terminals — but the Apple integration is roughly half the work. The other half is PSP onboarding, which Apple's documentation barely mentions and which is usually where projects stall.

When to Use

Use this skill when:

  • Adding contactless card acceptance to a point-of-sale iOS app
  • Submitting the Tap to Pay managed entitlement request via /contact/request/tap-to-pay-on-iphone/
  • Configuring the com.apple.developer.proximity-reader.payment.acceptance entitlement and provisioning profile
  • Choosing a PSP (Stripe Terminal, Adyen, Square) for your launch regions
  • Wiring PaymentCardReader lifecycle into your app's scene phase handling
  • Implementing loyalty NFC pass reads at point-of-sale via ProximityReader
  • Recovering from a Tap to Pay entitlement stuck in "Submitted" status for weeks
  • Switching from the deprecated prepare(using:updateHandler:) to the async stream API

Example Prompts

Real questions developers ask that this skill answers:

  • "I want to add Tap to Pay on iPhone to my point-of-sale app — where do I start?"
  • "My Tap to Pay entitlement has been Submitted for two weeks — what do I do?"
  • "Why does the first tap after my app foregrounds hang indefinitely?"
  • "Which PSPs support Tap to Pay in the UK?"
  • "Can I use 'Tap to Pay' as a button label for refunds?"
  • "How do I read a loyalty card from Wallet at checkout?"
  • "Does Tap to Pay work in the iOS Simulator?"

What This Skill Provides

  • What Tap to Pay actually is — supported payment types (contactless card, Apple Pay, other digital wallets, NFC loyalty passes), hardware floor (iPhone XS+), region gating
  • The PSP-onboarding reality — three Apple-supported PSPs as of writing, the per-region certification and account-flag requirements, the in-writing PSP confirmation rule before spending engineering time
  • Managed-entitlement workflow — the nine-step flow from request form to App Review, the Quinn-the-Eskimo mental model for managed capabilities, dev vs distribution entitlement (each requested separately), per-extension-bundle requests
  • "Submitted" stuck pattern — the 7-business-day escalation rule and the Apple Developer Support case path (not Feedback Assistant)
  • Merchant onboarding flowisSupported, isAccountLinked, linkAccount(using:), relinkAccount(using:); the PSP-issued token at runtime; never roll your own T&C sheet
  • HIG: always offer the button — even during configuration, with determinate or indeterminate progress; never hide the button while configuration is in progress
  • PaymentCardReader lifecycleprepare(using:) on launch AND on every foregrounding (the most-violated invariant); events async stream observation; returnReadResultImmediately for 1-2 second savings
  • Non-payment uses — card lookup without charging (refund without receipt, store-card-on-file) and loyalty NFC reads from Wallet
  • HIG button label rule — "Tap to Pay on iPhone" or "Tap to Pay" only; never the Apple logo; generic labels (Look Up, Verify, Refund) for non-payment actions
  • ProximityReaderDiscovery — Apple-maintained tutorial UI for merchant education; use instead of rolling your own
  • Tap to Pay ReferencePaymentCardReader API surface, event cases, session methods, Store and Forward mode, MobileDocumentReader cross-reference
  • Wallet Passes — the pass.json nfc block schema for loyalty passes that Tap to Pay reads at checkout
  • Apple Pay — sibling for online card acceptance on the same device
  • Payments Diagnostics — entitlement-stuck patterns, prepare() not called on foreground, isSupported false root causes
  • Code Signing Reference — generic managed-capability mechanics the Tap to Pay entitlement plugs into

Released under the MIT License