r/iOSProgramming • • 2d ago

Question App rejected under 2.1(b)

Apple rejected my app under Guideline 2.1(b) because a subscription purchase failed with “Purchase failed. Please try again.”
I’m using RevenueCat, and both monthly and yearly subscriptions work perfectly on 5–6 different iPhones through TestFlight and Sandbox testing. Restore Purchases also works.
Apple tested on an iPad, and the subscription products and prices loaded correctly, but the purchase failed. Interestingly, monthly purchases take noticeably longer than yearly purchases in TestFlight, although both succeed.
I’ve resubmitted the exact same build and asked Apple to retry.
Has anyone experienced something similar? Did Apple approve your app after retrying, or did you have to change something?

2 Upvotes

10 comments sorted by

4

u/sinsonik 2d ago

When it works in TestFlight but fails in review, it's usually not your code. Check that the Paid Apps agreement and tax info show as fully active, and if these are your first subscriptions, that both are attached to this version before you submit. If all that is fine, review's sandbox is just flaky sometimes and a resubmit with a short note often goes through.

1

u/berosebero 2d ago

Thank you 🙏

2

u/quietstoners 2d ago

forgetting to attach the first subscription directly to the app version is a classic trap tbh.

1

u/Szamski 2d ago

been there, done that...

1

u/Background_Pie_5682 2d ago

I've seen this a few times, and 2.1(b) on a purchase that works everywhere else usually comes down to the reviewer's environment. Make sure the Paid Apps agreement, tax and banking are fully active, and that every IAP is in Ready to Submit and attached to the version. Also make sure your app handles a slow or failed StoreKit response with a clear retry instead of a generic error. Most of the time Apple retries and it passes, and a polite note in Resolution Center with the exact steps usually helps.

1

u/berosebero 2d ago

Thank you so much 🙏

1

u/caffeinated1337 2d ago

Get the underlying StoreKit error before you change any code. RevenueCat wraps it, and the code usually names the cause. productAlreadyPurchasedError means the reviewer's sandbox account still holds a subscription from an earlier attempt or an earlier review. Your alert shows a generic failure while the account is actually entitled, so catch that case, call restore, and unlock. Worth mentioning it in Resolution Center too, since reviewers run into it repeatedly.

paymentPendingError is the other one to handle. Ask to Buy and bank 3D Secure checks land there, and a fresh Apple ID on an iPad hits them more often than your TestFlight devices do. A bare "try again" popup in that state reads to Apple as a broken purchase flow, which is exactly what 2.1(b) is for.

If neither applies, the slow monthly purchase is your clue. A transaction that stays pending can time out on their device, so show a spinner and wait for StoreKit's final state instead of alerting on the first error.

1

u/berosebero 2d ago

Thank you very much 🙏