I’m testing the first in-app purchase for an iOS app. It is a non-renewing subscription that grants 12 months of access. On November 9, a physical iPhone running our TestFlight build reproduced the same issue twice in the China mainland Sandbox storefront.
Setup checked at the time
- The annual product was Ready to Submit in App Store Connect, with China mainland availability, a CNY 98 price, and a Simplified Chinese localization.
- The annual product identifier matched the identifier requested by the app. The explicit Bundle ID matched App Store Connect and had In-App Purchase enabled.
- The Paid Apps Agreement was active, and banking and tax records were in place.
- We used a mainland-China Sandbox tester and called the native StoreKit 2
Product.products(for:)API. The request included the configured annual product and an old monthly identifier that has no corresponding product in App Store Connect.
Steps and results
- Install the app from TestFlight on a physical iPhone and open the purchase screen in Sandbox.
- Refresh the available products. We expect the annual product and its localized price to appear.
Product.products(for:)completes with an empty array. Device logs show an HTTP 200 response from the China mainland Sandbox catalog followed byIgnoring empty product response.- After the 600-second cache lifetime, the query received a different server correlation key and still returned no products. This occurs during product lookup, before any purchase call.
TN3186 says that Sandbox testing can take place before submission for review. Has anyone reproduced this specifically with a non-renewing subscription? Is there another way to verify Sandbox catalog visibility for the configured annual product or diagnose why it is omitted? An annual-only StoreKit query would be a useful follow-up test. We can share the exact app and product identifiers, request correlation keys, and device diagnostics with Apple through Feedback Assistant.