Test and go live
Test your integration in test mode on a real iPhone. Then use the checklist to go live.
Test mode
- A test mode API key gives a test token. Payments with a test token are test payments. They show only in test mode in the MONEI Dashboard.
- In test mode, you tap a real card on the iPhone. MONEI replaces it with a Mastercard test card before the charge. Your card is never charged. See Test Tap to Pay.
- A live API key gives a live token.
- Do not use test and live tokens on the same device.
Tap to Pay on iPhone does not run in the iOS Simulator. Test on a supported iPhone: an iPhone XS or newer with iOS 18.5 or later. For the test and live API keys, see Testing.
Test these cases before you go live:
- An approved payment and a declined payment, each with its signed webhook. In test mode, an amount ending in 65 cents (for example 10.65) is declined.
- A payment that the user cancels on Apple's screen.
- An expired token: renew it and call
prepareagain. - Location access denied, and location access allowed again in Settings.
- Your pending state for
outcomeUnknown, and how your team finds the payment byorderId.
Example app
The package repository has an example app: Example/TapToPayExample.xcodeproj. It is a SwiftUI app with a token field, an amount, an order ID, a pay button, education and a result view.
- Open
Example/TapToPayExample.xcodeprojin Xcode. - Set your team and bundle ID. Your team must have the Tap to Pay on iPhone entitlement.
- Run the app on a supported iPhone.
- Paste a token from your server, or from a
curlcall with your test mode API key. See Request a token.
Versions and compatibility
The SDK uses semantic versioning (MAJOR.MINOR.PATCH):
- Patch: bug fixes. No change to the public API or to error semantics.
- Minor: an update inside the SDK, or new API that does not break your code.
- Major: a change in error semantics, or a change that breaks your code.
- 0.x versions: until 1.0.0, a minor version (for example 0.2.0) can change the public API. Read the release notes before you update.
- Prereleases (
-beta.N) are for testing only. Do not ship them to production.
| SDK version | iOS minimum | Built with | Notes |
|---|---|---|---|
0.2.0 | 18.5 | Xcode 26.6 (Swift 6.3.3) | PaymentResult has new fields: amount, currency, statusCode, statusMessage, authorizationCode, cardType and cardCountry. A declined result shows the reason without a call to MONEI. No change to existing fields. |
0.1.1 | 18.5 | Xcode 26.6 (Swift 6.3.3) | Installs without a GitHub token: public download URLs. Same SDK code as 0.1.0. |
0.1.0 | 18.5 | Xcode 26.6 (Swift 6.3.3) | First release. Signed binary. Same code as 0.1.0-beta.5. |
0.1.0-beta.5 | 18.5 | Xcode 26.6 (Swift 6.3.3) | Prerelease. Signed binary. |
0.1.0-beta.4 | 18.5 | Xcode 26.6 (Swift 6.3.3) | Prerelease. Signed binary. |
0.1.0-beta.3 | 18.5 | Xcode 27.0 (Swift 6.4) | Prerelease. Not signed. |
Use the same Xcode version as "Built with", or a newer one. From 0.1.0-beta.4, MONEI signs the MoneiTapToPay binary (team 72J3PXJJ4K).
For 0.x versions, use an exact version in Swift Package Manager. From 1.0.0, use from:. See Add the package.
Go-live checklist
- Apple gave your team the publishing Tap to Pay on iPhone entitlement.
- Your app uses a release version of the SDK, for example
0.2.0, and not a prerelease (-beta.N). - Your server uses your live API key, and the app gets live tokens only.
- Your server renews each token before it expires, and the app calls
preparewith the new token. - Each payment has a new
orderIdand acallbackUrl. - Your server verifies the signature of each webhook, and fulfils orders from the webhook only.
- Your app shows a pending state for
outcomeUnknownand never retries the payment. - Your UI uses the name "Tap to Pay on iPhone", and hides it when
TapToPay.isSupportedisfalse. - You declared the App Store privacy details.
Common questions
Can I test in the iOS Simulator?
No. Tap to Pay on iPhone does not run in the iOS Simulator. Test on a supported iPhone.
Can I test with a real card?
Yes. In test mode, tap any real card. MONEI replaces it with a test card, and the card is never charged. A card that asks for a PIN is approved. Test mode does not use the PIN.
Can I ship a prerelease to the App Store?
No. Prereleases (-beta.N) are for testing only. Ship a release version, for example 0.2.0.
Which Xcode version do I need?
The Xcode version in the "Built with" column for your SDK version, or a newer one. For 0.2.0, use Xcode 26.6 or newer.