Hello Square Developer Support,
We are investigating an intermittent Tap to Pay failure in our native iOS app. Successful $1 Tap to Pay transactions have previously completed on this test iPhone, but we can now reproduce the following:
- Authorize Square with a production seller access token and location.
- Check the merchant’s Apple link status; the account is linked. The SDK reports the iPhone Tap to Pay reader ready and contactless input available.
- Start an onlineOnly USD 100-cent payment with a new UUID paymentAttemptID, default prompt mode and AdditionalPaymentMethods([.tapToPay]).
- Square’s UI displays “Connect hardware to take card payments”. The active PaymentHandle.additionalPaymentMethods is empty.
Diagnostic values before and throughout the failing checkout:
- SDK version 2.6.0
- isDeviceCapable=true
- requested additional-method mask=2; tapToPay.rawValue=2
- availableCardInputMethods=Contactless
- reader model=3 (tapToPay), status=4 (ready), unavailable reason=nil
- active handle
additionalPaymentMethods=[]
An initial recording observed this for ten seconds without the method appearing. Successful prior attempts exposed additional method type=4 (tapToPay). We then added a safeguard to cancel an empty, cancelable checkout through PaymentHandle.cancelPayment, finishing through didCancel. The next user-initiated attempt invalidated local authorization reuse, retrieved scoped credentials, and passed through SDK deauthorization/authorization. It again showed the same mismatch. No card was presented in these failed checks.
The application has one SDK initialization in didFinishLaunching and a process-wide operation guard around authorization/setup/payment. We do not force Apple relinking or automatically start a second payment. The test device is an iPhone 15 Pro Max. Additional device/OS diagnostics can be supplied privately to Square staff if needed.
Could you identify why the reader can report ready while the payment handle exposes no Tap to Pay method, and the supported recovery or integration change? Is the additional-method configuration above correct for the default prompt in 2.6.0? Is a further readiness signal required?
Representative diagnostic excerpt (no account identifiers, tokens, or card data):
before checkout: sdk=2.6.0, capable=true, requested=2, tapConstant=2, inputs=Contactless, methods=no active handle, readers=[model=3, status=4, reason=none]
checkout +0s: sdk=2.6.0, capable=true, requested=2, tapConstant=2, inputs=Contactless, methods=[], readers=[model=3, status=4, reason=none]
checkout +3s: sdk=2.6.0, capable=true, requested=2, tapConstant=2, inputs=Contactless, methods=[], readers=[model=3, status=4, reason=none]
The same values persisted for ten seconds in an earlier attempt, and recurred after cancellation and authorization refresh.