StoreKit

RSS for tag

Support in-app purchases and interactions with the App Store using StoreKit.

Posts under StoreKit tag

200 Posts

Post

Replies

Boosts

Views

Activity

Can't enter sandbox environment for IAP testing on any of my apps - always getting -100 error with no [Environment: Sandbox] indicator
Body: I'm experiencing a persistent issue that has affected multiple apps I've developed, and I'm hoping to get some guidance from the community or Apple engineers. The Problem: When testing In-App Purchases, my app never enters the sandbox environment. The payment prompt does NOT show the "[Environment: Sandbox]" indicator, and I always receive error code -100 (Invalid Product Identifier). This issue has occurred across multiple apps I've built, including a previous app that I ultimately had to release as a paid download (rather than freemium with IAP) because I couldn't resolve this same problem. Now I'm facing the identical issue with my new app, "AI Job Assistant". What I've Checked (all correct): ✅ Paid App Agreement status is "Active" in App Store Connect ✅ Bundle ID matches exactly between Xcode/HBuilderX and App Store Connect ✅ Product IDs in code match those created in App Store Connect (case-sensitive, no spaces) ✅ All IAP products have complete metadata (name, description, pricing, 640x920 screenshot) ✅ Product status is "Ready to Submit" (not "Waiting for Review") ✅ I have both iOS Development certificate and iOS Distribution certificate — I am using the Development certificate for testing ✅ My provisioning profile is explicitly for Development (named "aijobDevprofile", shows "iOS Development" type) ✅ The Development profile contains my test device UDID ✅ I have fully signed out of my real Apple ID in Settings → Media & Purchases ✅ I only log into my Sandbox Tester account through the purchase prompt (not in Settings) ✅ I test on a real device (not simulator) ✅ I have tried creating multiple new Sandbox Tester accounts ✅ I have tried toggling "Cleared for Sale" off and on for all products ✅ I have waited over 24 hours after making configuration changes What I See: When I initiate a purchase, the payment prompt comes up but there is NO "[Environment: Sandbox]" text anywhere After entering my Sandbox Tester credentials, the request fails with error code -100 (Invalid Product Identifier) My Setup: Development framework: uni-app / HBuilderX (custom debug base with Development certificate and Development provisioning profile) Backend: Cloudflare Workers (handles receipt verification) Testing device: iPhone (latest iOS version) The same issue occurred with my previous app, which I never resolved and eventually gave up on IAP entirely Question: Why does my app never enter the sandbox environment despite using the correct Development certificate and Development provisioning profile? Is it possible there is an issue at the Apple developer account level that is preventing sandbox environment activation? How can I force my debug builds to connect to sandbox instead of production? I am willing to provide any additional logs or information needed. Please help. Thank you.
0
0
174
3w
AppTransaction.originalAppVersion returns "1.0" in App Review environment — not the actual build number
Hi, I'm using AppTransaction.originalAppVersion to detect whether a user originally purchased the app under the old paid model, so I can automatically unlock the app for them as a courtesy when migrating to freemium. Background On iOS, originalAppVersion returns CFBundleVersion (the build number). When I transitioned the app from paid (v1.x) to freemium (v2.0), I defined a numeric threshold for CFBundleVersion to distinguish legacy purchasers from new users: Build number below the threshold → v1.x purchase → auto-unlock Build number at or above the threshold → v2.0+ install → requires IAP In Production, originalAppVersion correctly returns the actual build number, and the comparison works as intended. Detection logic (simplified) // Determine environment via receipt URL func detectStoreEnvironment() -> String { if let url = Bundle.main.appStoreReceiptURL, url.lastPathComponent == "sandboxReceipt" { return "Sandbox" } return "Production" } // Legacy check using numeric comparison static func isLegacyPaidUser(version: String, threshold: String) -> Bool { guard !version.isEmpty else { return false } return version.compare(threshold, options: .numeric) == .orderedAscending } // In checkLegacyPurchase(): let version = appTransaction.originalAppVersion let isLegacy = isLegacyPaidUser(version: version, threshold: legacyBuildNumberThreshold) let env = detectStoreEnvironment() let shouldAutoUnlock = isLegacy && env != "Sandbox" The problem I know that in the Sandbox environment, originalAppVersion always returns "1.0" — this is mentioned in the AppTransaction documentation. My code already suppresses the auto-unlock for Sandbox (env != "Sandbox"). However, it appears that the App Review environment also returns "1.0" for originalAppVersion. Because the receipt URL path component is "receipt" (not "sandboxReceipt"), my environment detection classifies it as "Production" — so the Sandbox suppression doesn't apply. The reviewer is incorrectly identified as a legacy paid user and the app is unlocked without a purchase. This caused our v2.0 submission to be rejected under Guideline 2.1a. Questions Is it documented that the App Review environment returns "1.0" for AppTransaction.originalAppVersion, similar to Sandbox? Is there a reliable way to detect the App Review environment specifically — separate from both Sandbox and Production? For example, does the receipt URL differ, or is there another API? Is using originalAppVersion for legacy paid-user detection a supported pattern? If so, what is the recommended approach to handle the App Review case? Any guidance would be greatly appreciated. Thank you.
0
0
96
3w
Transaction.currentEntitlements returns empty for offer code subscriptions redeemed via Safari
Users who redeemed offer codes via the Safari URL template (apps.apple.com/redeem?ctx=offercodes&id=...) have active subscriptions confirmed in iPhone Settings → Subscriptions (expiring April 2027). However, Transaction.currentEntitlements returns zero results in the app. AppStore.sync() has been called. Transaction.all also returns no Production transactions. The offer “Radius Inner Circle” is configured as: Free for the first year, does not auto-renew, and is tied to a yearly auto-renewable subscription product. Approximately 20 production users are affected. The subscription exists on Apple’s servers but never appears in the StoreKit 2 local transaction database. Is there a known issue with offer codes redeemed via Safari not populating Transaction.currentEntitlements? Is there an alternative API to query subscription status server-side? App ID: 6760574186 Bundle ID: com.michaelhills.Radius
1
0
105
1w
Korea subscription consent: Timing mismatch between push notifications and Settings consent option
Hi all, I've been observing what appears to be a timing mismatch in how Apple handles Korea trial-to-paid consent, and I wanted to see if other developers are seeing the same thing. Per Korean regulations effective Feb 14, 2025, Apple must obtain explicit user consent before converting a free trial to a paid subscription. Apple handles this via email, push notifications, and an in-app consent option accessible from Settings > Subscriptions. For a 7-day trial in the Republic of Korea storefront, I'm observing: Consent push notifications (Agree to continue your subscription without interruption) start arriving ~1 day after trial redemption, at roughly hourly frequency. However, when the user taps the push and navigates to Settings > Subscriptions, there is no consent option available. The only visible action is "Cancel Free Trial". The consent option only becomes available around day 4 of the trial (i.e., 3 days before renewal, matching Apple's documented messaging cadence [1]). For the first ~3 days, users receive hourly push notifications they cannot act on. The only way to stop them is to cancel the subscription entirely. This is happening across multiple apps in the Korean App Store, so it appears to be a platform-level behavior rather than an app-specific issue. Is anyone else observing this behavior? Any insight from Apple engineers or other developers would be greatly appreciated. [1] https://developer.apple.com/help/app-store-connect/reference/in-app-purchases-and-subscriptions/consent-for-subscription-offer-conversions
1
0
226
1w
Subscriptions Stuck in review
Hello! My subscriptions have been stuck in review for a while. I have been chasing my tail trying to get the sandbox purchases to work but the subscriptions are not returning after "sale". Is this because the subscriptions are still in review? Will the purchase ever return a product in the sandbox environment if the products are still in review? How do we get the subscriptions approved? I have submitted them with the app multiple times. The app is rejected because I can't complete it without the subscriptions but the subscriptions are never reviewed. Help!
0
0
86
3w
StoreKit 2: Transaction.all and Transaction.currentEntitlements return empty for valid non-consumable purchases in production
FB: https://feedbackassistant.apple.com/feedback/22556883 We're seeing a small number of production users where both Transaction.currentEntitlements and Transaction.all return zero transactions for a valid, active, non-refunded non-consumable IAP. This makes it impossible to restore the purchase via any StoreKit 2 API. Environment: Xcode 26.4 (Build 17E192) iOS 26.4.1 Direct call to SK2 Transactions.all & Flutter in_app_purchase package v3.2.3 (uses SK2 on iOS 15+) Non-consumable IAP (one-time purchase) What we observe: AppStore.sync() triggers but the purchase stream returns 0 transactions Transaction.all returns empty Transaction.currentEntitlements also returns empty User is confirmed on the correct Apple ID Issue reproduces on both iPhone and Mac for the same Apple ID Issue appears to have started recently for users who previously had no problems Debug log from affected production user: [2026-04-20T08:50:10.744115Z] init: iapAvailable=true [2026-04-20T08:50:10.744566Z] init: isPremium=false [2026-04-20T08:50:10.744567Z] init: triggering silent restorePurchases [2026-04-20T08:50:45.974566Z] restore: started [2026-04-20T08:50:45.986848Z] restore: sk2Transactions count=0 [2026-04-20T08:50:45.993004Z] restore: sk2Direct isVerified=false active=null [2026-04-20T08:50:45.993011Z] restore: sk2Direct inconclusive — falling back to standard restore [2026-04-20T08:51:16.000851Z] restore: timed out after 30s — fallback isPremium=false [2026-04-20T08:51:16.000910Z] restore: completed — succeeded=false foundPurchase=false Unable to reproduce in sandbox — Transaction.all works correctly there. Appears specific to production for a small subset of users. Has anyone else seen this?
19
3
1.1k
4d
Free trial for one-time purchase: Is the $0 IAP workaround still recommended in 2026?
[Repost: Somehow my original thread from Jan was deleted. I called dev support and they said to post again, if there's a better channel to get answer for this, please let me know.] I’m an indie dev with a paid, one-time-purchase app (Dash Calc, $4 USD), and sales have been rough. In a crowded category, an upfront-paid app feels like a tough sell without a way to try it first. I’d like to offer a simple 7-day free trial followed by a single lifetime purchase, but App Store Connect still doesn’t officially support trials for paid apps. In Jan 2023, an App Store Commerce Engineer recommended the $0 non-consumable IAP + paid non-consumable IAP workaround: https://developer.apple.com/forums/thread/722874 I haven’t implemented it yet, but the subsequent discussion suggests the approach is overly complex. Handling refunds, reinstalls, activation timing, and purchase history requires non-obvious logic, and some developers report customer confusion and drop-off when presented with a $0 trial IAP. Has anything improved since 2023? Any new StoreKit APIs or App Store Connect changes that make this simpler or less error-prone? Is the $0 non-consumable IAP still the recommended approach in 2026? Any updated policy guidance for time-limited access on one-time purchases? I’m happy to use the workaround if it’s still the official path—I just want to confirm there isn’t a better option now.
6
0
281
1w
Store Kit 2 iOS system purchase confirmation dialog not consistent.
I'm running into an issue where it appears the product transaction is being cached and not showing a new iOS system popup dialog to confirm the purchase. This is affecting testing, and I need a solution to have iOS issue a new purchase transaction every time. Here's what happens, I call the following which always succeeds. try await product.purchase(options: [.appAccountToken(appToken)]) I'm signed into a developer sandbox account with a resubscribe every 5 minutes. After cancelling a subscription, I attempt to resubscribe using the same code as above. Frequently, the code executes without iOS showing the popup system dialog to confirm the purchaser. After waiting a period of time, iOS then resets itself and allows me to purchase again. What I want is an option the forces the iOS system confirm purchase dialog to show up every time the code executes. How do I fix this? iOs 26.4.1, iPhone 17 Pro.
2
0
159
2d
StoreKit / IAP: Product WAITING_FOR_REVIEW — works locally with production RevenueCat key + Apple Sandbox, fails during App Review
Hello, I need guidance on App Store Connect product state vs StoreKit behavior during App Review. Stack: iOS app (Expo / React Native), subscriptions via RevenueCat + StoreKit. Bundle ID matches App Store Connect. RevenueCat API keys — what I’ve verified locally: With the production RevenueCat API key (iOS appl_..., same as the submitted build), everything works on local device but not when I download it from TestFlight. I have also tested with RevenueCat’s sandbox / test API key (the separate key intended for sandbox/testing). That setup works as well — I can load offerings and complete test purchases the same way What RevenueCat (SDK / dashboard health) reports: Product monthly is configured in RevenueCat. Warnings that products aren’t approved in App Store Connect yet and that the default offering has configuration issues. Apple’s product state: WAITING_FOR_REVIEW. The SDK still states that test purchases are possible. What App Review reports: After onboarding a new business account, “Activate subscription” leads to an error (plans don’t load / purchase path fails). Review suggested an app code issue. Why this is confusing: Locally, both RevenueCat key modes I tried (production and sandbox/test) work with Apple Sandbox on the device. The submitted build uses the production RevenueCat key. Review still sees a failure. Questions: For IAP in WAITING_FOR_REVIEW, should App Review always use an Apple Sandbox account to test subscriptions until the product is fully approved? Is it documented that StoreKit may not return products during review without Sandbox while the product remains WAITING_FOR_REVIEW? Has anyone else seen “works locally (prod + sandbox RevenueCat keys + Apple Sandbox) but Review fails” with the same WAITING_FOR_REVIEW state? Thanks for any official documentation or similar threads.
1
0
114
Apr ’26
Subscription failure in 26.4, 26.4.1
We have a user from Asia whose subscription failed to be detected by our app. On 26.4. They also tried revoking the yearly subscription and activating a monthly. Payment ok and the device reported that the subscription is active. Our code relies on Transaction.currentEntitlements in StoreKit, which seems to be broken, at least for this user. None of these worked: Installing iOS 26.4.1 Reinstalling our app Logging out and in from iCloud. Hard device reset Full iOS reinstall. User finally gave up and got a refund. I am reporting here in case other apps experienced similar problems. This discussion mentions that a regression in 26.4 might have contributed to the issue which is supposed to be fixed in 26.4.1. ( https://developer.apple.com/forums/thread/820562?answerId=883682022#883682022 ) The issue may have persisted or left the entitlements corrupt for this particular user. Hoping that the issue is resolved so we do not have more problems in the future.
2
0
137
Apr ’26
Xcode 26 Causing StoreKit Fiasco for macOS?
I submitted my last macOS application with IAP on Oct. 23rd, 2025. I was able to test-purchase a non-consumable product with the StoreKit configuration file at that time. These days, every time I test a new macOS application with the configuration file, a purchase process fails. The thing is they all now fail if I test the store with existing applications that were once working. Xcode shows the following debugging error. Purchase failed with error: systemError(Error Domain=NSCocoaErrorDomain Code=4099 "The connection to service created from an endpoint was invalidated from this process." UserInfo={AMSDescription=An unknown error occurred. Please try again., AMSURL=http://localhost:53272/WebObjects/MZBuy.woa/wa/inAppBuy, NSDebugDescription=The connection to service created from an endpoint was invalidated from this process., AMSStatusCode=200, AMSServerPayload={ All my iOS apps don't exhibit the same problem. This StoreKit fiasco only happens for macOS applications. And I'm thinking that it all started to occur after I began using Xcode 26. Not a single line of code has changed. But the applications that were once able to process IAP all now fail. And I'm suspecting that it's Xcode 26 that is responsible for this failure. My Xcode version is 26.2, by the way. Any macOS application developer experiencing the same problem?
5
1
343
3w
Custom Pricing and Features for Non-Renewing Subscriptions
I hope you are doing well. I am reaching out to inquire about a few aspects of implementing non-renewing subscriptions in our app. Firstly, we have encountered a limitation in App Store Connect where the maximum price tier available for non-renewing subscriptions in Euros is €1199. However, our product is priced at €1799. Could anyone please advise how we can handle this scenario? Is there a way to request custom pricing beyond the available tiers, or is there an alternative approach you would recommend? Additionally, we would like clarification on the following: Promo Codes: Are promo codes supported for each non-renewing subscription product? If so, how can we configure and distribute them? Installment Payments: Is it possible to enable installment-based payments for non-renewing subscriptions? If yes, could you guide us on how to set this up or if there are any prerequisites?
1
0
472
Apr ’26
AppStore.ageRatingCode always returns 0 on real device — is this expected behavior?
Hello everyone I'm implementing age verification in my app to comply with upcoming age assurance laws (Utah, etc.), and I'm using AppStore.ageRatingCode from StoreKit to retrieve my app's current age rating. According to the documentation: extension AppStore { @available(iOS 26.2, macOS 26.2, tvOS 26.2, watchOS 26.2, *) public static var ageRatingCode: Int? { get async } } "Use this property to fetch the age rating for your app and compare it with the last known age rating to check if it has changed." However, calling this always returns 0 in my environment. Environment: Device: Real physical device (not simulator) iOS version: 26.4 Sandbox Apple Account: signed in via Settings → Developer → Sandbox Apple Account App Store Connect: app is registered and age rating is configured Xcode Scheme → Run → Options → StoreKit Configuration: None Code: func getAgeRatingCode() async -> Int? { guard let ageRatingCode = await AppStore.ageRatingCode else { print("Age rating code unavailable") return nil } print("ageRatingCode: \(ageRatingCode)") // always prints 0 return ageRatingCode } Questions: What integer values does ageRatingCode map to? (e.g., does 4+ = 4, 9+ = 9, 13+ = 13, etc.? Or is it a different internal code?) This mapping is not documented anywhere I can find. Is 0 a valid return value, and if so, what does it represent? Is there a known issue with this API returning 0 even when all conditions appear to be correctly configured? Any guidance from Apple engineers or developers who have successfully used this API would be greatly appreciated.
0
0
80
Apr ’26
SKStoreReviewController requestReviewInScene: does not display review prompt in debug builds on iOS 26.5 beta (23F5043k)
[SKStoreReviewController requestReviewInScene:] no longer displays the review prompt in debug/development builds on iOS 26.5 beta (23F5043k and 23F5043g). According to Apple's documentation, the review prompt should always appear in debug builds to facilitate testing. This was working in previous iOS versions (iOS 26.4 and older). Steps to reproduce: Run app from Xcode in debug configuration on a device running iOS 26.5 beta (23F5043k or 23F5043g) Call [SKStoreReviewController requestReviewInScene:windowScene] with a valid, foreground-active UIWindowScene Observe that the method executes without error (scene is valid per NSLog) but no review prompt appears Expected: Review prompt should display in debug builds Actual: No prompt appears, despite the scene being valid and foreground-active This worked correctly on previous iOS versions (26.4) so looks like this bug was introduced in 26.5 Beta versions. I have already filed a bug report in Feedback Assistant with number: FB22445620
4
0
388
1w
Transaction.unfinished not getting unfinished transactions
I am testing auto renewing subscriptions for a macOS program in Xcode with a local Storekit file. I have renewals set to occur every minute for testing. I quit the app, and watch renewals appear in the Debug transaction manager window. Each is marked unfinished. When I start the app, I call a function that is supposed to get unfinished transactions and finish them. In one of those "I swore it worked the other day", I am now finding it isn't working. The unfinished transaction remain marked as unfinished. func getUnfinished() async { for await verificationResult in Transaction.unfinished { guard case .verified(let transaction) = verificationResult else { continue } await transaction.finish() } } If I add an AppStore.sync() right before looping on Transaction.unfinished, it works (i.e., cleans up unfinished transactions), but I get an alert I have to click through. do { try await AppStore.sync() } catch { print("DEBUG UNFINISHED: AppStore.sync() failed: \(error)") } Any idea why Transaction.unfinished isn't fetching unfinished transactions for me (without the AppStore.sync)?
2
0
224
2w
AppStore.sync Replays the Latest Subscription Renewal into Transaction.unfinished on iOS 26.4 Sandbox
StoreKit2 Repro Notes: the latest renewal appears in Transaction.unfinished after restore (2026-04-05) 1. Issue Summary In the current project, during a normal cold launch: Transaction.latest(for:) returns a value for the weekly subscription Transaction.all returns the full subscription history chain Transaction.unfinished is empty However, after tapping Restore Purchases and calling AppStore.sync(), one "latest renewal" transaction appears in Transaction.unfinished. This behavior looks more like a system-side replay triggered by AppStore.sync() than a consistently unfinished transaction during a normal launch. 2. Affected Product Product: do.i.iapc.vip.week Transaction chain characteristics: All transactions belong to the same auto-renewable subscription chain originalTransactionID = 2000001143446796 The transaction that appears in unfinished is usually the latest or last renewal in the chain 3. Current Code Path During app startup: loadProducts() Debug snapshot for Transaction.latest(for:) Debug snapshot for Transaction.all Scan Transaction.unfinished refreshEntitlements() During restore purchases: Call AppStore.sync() Scan Transaction.unfinished refreshEntitlements() 4. Preconditions A Sandbox test account is used The weekly subscription do.i.iapc.vip.week already has multiple historical renewal transactions The subscription is already expired, so entitlements = 0 during a normal launch The issue is easier to reproduce on an iOS 26.4 device The issue was not consistently reproduced on another iOS 18.2 device 5. Reproduction Steps Path A: Normal cold launch Launch the app Observe the logs: LatestTransaction snapshot AllTransaction snapshot summary unfinished processing result Observed result: latest has a value all contains the full history chain unfinishedHandledCount = 0 Path B: Tap Restore Purchases Launch the app Tap Restore Purchases Trigger AppStore.sync() Observe the logs: restore started unfinished processing started unfinished transaction received Observed result: After restore, one "latest renewal" transaction appears in unfinished That same transaction does not necessarily appear during a normal cold launch 6. Expected Result If a transaction has already been successfully finished in the past, it should not appear again as unfinished after Restore Purchases. A stricter expectation is: During a normal cold launch, unfinished = 0 After tapping Restore Purchases, unfinished should still remain 0 7. Actual Result Actual behavior: Normal cold launch: unfinished = 0 After Restore Purchases: one "latest renewal" transaction appears again in unfinished This suggests that AppStore.sync() may replay the most recent historical subscription transaction. 8. Current Assessment Based on the current logs, the issue is more likely to be: Related to AppStore.sync() / StoreKit / Sandbox replay behavior on the system side Easier to reproduce on iOS 26.4 Less likely to be caused by a persistent app-side bug where finish() is missed during a normal startup flow Reasons: During a normal launch, unfinished = 0 The behavior is inconsistent across devices and OS versions, even with the same Sandbox account latest, all, and unfinished can be clearly separated during a normal cold launch 9. Suggested Engineering Position Suggested wording for internal or external communication: In the iOS 26.4 + Sandbox environment, calling AppStore.sync() may cause StoreKit to replay the latest historical subscription transaction into Transaction.unfinished. Since the same transaction does not necessarily appear during a normal cold launch, the issue currently looks more like a system/environment-specific behavior difference than an app-side bug where finish() is consistently missed during the regular startup path. 10. Additional Evidence That Can Be Collected If this needs to be escalated to the team or to Apple, the following would strengthen the report: Full log comparison before and after tapping Restore Purchases The same transactionId compared between normal launch and post-restore behavior Cross-device comparison on different iOS versions A minimal reproducible sample project and Sandbox test record
1
0
303
2w
In-App Purchase dialog not appearing during App Review but works on physical device
Hi everyone, My app has been rejected twice under Guideline 2.1(b) - App Completeness because the reviewer says the In-App Purchase does not trigger a purchase flow when tapping the purchase button. However, I have tested it on a physical iPhone (iOS 18.6.2) and the StoreKit purchase dialog appears and completes successfully. I have confirmed: Paid Apps Agreement is active In-App Purchase product (non-consumable) is configured correctly Sandbox test account works fine Purchase flow works on physical device with screen recording as proof The reviewer tested on iPad Air 11-inch (M3) with iPadOS 26.4. My app uses Flutter with the in_app_purchase package (v3.2.0). The purchase implementation: Calls InAppPurchase.instance.isAvailable() Queries product details with queryProductDetails() Calls buyNonConsumable() when user taps purchase button I found and fixed a potential null reference issue in the purchase completer that could cause the purchase to fail silently, but I'm not sure if this was the exact cause since I cannot reproduce the issue. Has anyone experienced a similar situation where IAP works on device but fails during App Review? Any suggestions on what might be different in the review environment? Thank you.
2
0
119
Apr ’26
Settings app crashes when tapping "Manage" under Sandbox account without internet connection
Device: iPhone 13 OS Version: iOS 26.4, iOS 26.5 Summary: The Settings app crashes when accessing the Sandbox account management screen in Developer Settings while the device is offline. Steps to Reproduce: Enable Developer Mode on the device Disconnect from the internet (Wi-Fi and cellular off) Go to Settings → Developer Ensure a Sandbox account is signed in Tap on "Sandbox" Tap on "Manage" Expected Result: The system should either: Open the Sandbox management screen, or Show an error indicating no internet connection Actual Result: The Settings app crashes immediately after tapping "Manage". Reproducibility: Always (100%) when offline Additional Notes: Issue observed on iOS 26.4 and iOS 26.5 Does not occur on iOS 18 May also be present in other iOS 26.x versions Does not occur when the device has an active internet connection
1
0
107
3w
First auto-renewable subscription does not appear on app version page in App Store Connect
Hello, I am blocked on the first auto-renewable subscription submission for my iOS app and I would like to know if anyone has seen this exact App Store Connect behavior. App: SEKA Money Subscription product ID: seka_premium_yearly_ Subscription Apple ID: 6760082026 Current issue: the auto-renewable subscription exists in App Store Connect I am on the correct iOS app version page the “In-App Purchases and Subscriptions” section is visible but my auto-renewable subscription does not appear in the selector only a consumable IAP appears there Important detail: the issue happens directly inside App Store Connect on the app version page this is why I do not think the missing subscription in that selector is caused by the runtime StoreKit code in the app itself I understand app code can affect UI price display, but it should not control whether a subscription appears in the App Store Connect submission selector Other details: this is my first subscription the subscription has already gone through “Waiting for Review” and is now “Developer Action Needed” metadata, screenshot, and localizations have been filled Apple Support already confirmed that I do not need a consumable for this case sandbox / TestFlight purchase behavior has been partially reproducible, but the submission workflow remains blocked because the subscription is not selectable on the app version page My question: Has anyone seen a case where the first auto-renewable subscription exists but does not appear in the app version selector, while another IAP type does appear? If yes, what was the real cause and how did you resolve it? Thank you.
2
0
106
Apr ’26
Can't enter sandbox environment for IAP testing on any of my apps - always getting -100 error with no [Environment: Sandbox] indicator
Body: I'm experiencing a persistent issue that has affected multiple apps I've developed, and I'm hoping to get some guidance from the community or Apple engineers. The Problem: When testing In-App Purchases, my app never enters the sandbox environment. The payment prompt does NOT show the "[Environment: Sandbox]" indicator, and I always receive error code -100 (Invalid Product Identifier). This issue has occurred across multiple apps I've built, including a previous app that I ultimately had to release as a paid download (rather than freemium with IAP) because I couldn't resolve this same problem. Now I'm facing the identical issue with my new app, "AI Job Assistant". What I've Checked (all correct): ✅ Paid App Agreement status is "Active" in App Store Connect ✅ Bundle ID matches exactly between Xcode/HBuilderX and App Store Connect ✅ Product IDs in code match those created in App Store Connect (case-sensitive, no spaces) ✅ All IAP products have complete metadata (name, description, pricing, 640x920 screenshot) ✅ Product status is "Ready to Submit" (not "Waiting for Review") ✅ I have both iOS Development certificate and iOS Distribution certificate — I am using the Development certificate for testing ✅ My provisioning profile is explicitly for Development (named "aijobDevprofile", shows "iOS Development" type) ✅ The Development profile contains my test device UDID ✅ I have fully signed out of my real Apple ID in Settings → Media & Purchases ✅ I only log into my Sandbox Tester account through the purchase prompt (not in Settings) ✅ I test on a real device (not simulator) ✅ I have tried creating multiple new Sandbox Tester accounts ✅ I have tried toggling "Cleared for Sale" off and on for all products ✅ I have waited over 24 hours after making configuration changes What I See: When I initiate a purchase, the payment prompt comes up but there is NO "[Environment: Sandbox]" text anywhere After entering my Sandbox Tester credentials, the request fails with error code -100 (Invalid Product Identifier) My Setup: Development framework: uni-app / HBuilderX (custom debug base with Development certificate and Development provisioning profile) Backend: Cloudflare Workers (handles receipt verification) Testing device: iPhone (latest iOS version) The same issue occurred with my previous app, which I never resolved and eventually gave up on IAP entirely Question: Why does my app never enter the sandbox environment despite using the correct Development certificate and Development provisioning profile? Is it possible there is an issue at the Apple developer account level that is preventing sandbox environment activation? How can I force my debug builds to connect to sandbox instead of production? I am willing to provide any additional logs or information needed. Please help. Thank you.
Replies
0
Boosts
0
Views
174
Activity
3w
AppTransaction.originalAppVersion returns "1.0" in App Review environment — not the actual build number
Hi, I'm using AppTransaction.originalAppVersion to detect whether a user originally purchased the app under the old paid model, so I can automatically unlock the app for them as a courtesy when migrating to freemium. Background On iOS, originalAppVersion returns CFBundleVersion (the build number). When I transitioned the app from paid (v1.x) to freemium (v2.0), I defined a numeric threshold for CFBundleVersion to distinguish legacy purchasers from new users: Build number below the threshold → v1.x purchase → auto-unlock Build number at or above the threshold → v2.0+ install → requires IAP In Production, originalAppVersion correctly returns the actual build number, and the comparison works as intended. Detection logic (simplified) // Determine environment via receipt URL func detectStoreEnvironment() -> String { if let url = Bundle.main.appStoreReceiptURL, url.lastPathComponent == "sandboxReceipt" { return "Sandbox" } return "Production" } // Legacy check using numeric comparison static func isLegacyPaidUser(version: String, threshold: String) -> Bool { guard !version.isEmpty else { return false } return version.compare(threshold, options: .numeric) == .orderedAscending } // In checkLegacyPurchase(): let version = appTransaction.originalAppVersion let isLegacy = isLegacyPaidUser(version: version, threshold: legacyBuildNumberThreshold) let env = detectStoreEnvironment() let shouldAutoUnlock = isLegacy && env != "Sandbox" The problem I know that in the Sandbox environment, originalAppVersion always returns "1.0" — this is mentioned in the AppTransaction documentation. My code already suppresses the auto-unlock for Sandbox (env != "Sandbox"). However, it appears that the App Review environment also returns "1.0" for originalAppVersion. Because the receipt URL path component is "receipt" (not "sandboxReceipt"), my environment detection classifies it as "Production" — so the Sandbox suppression doesn't apply. The reviewer is incorrectly identified as a legacy paid user and the app is unlocked without a purchase. This caused our v2.0 submission to be rejected under Guideline 2.1a. Questions Is it documented that the App Review environment returns "1.0" for AppTransaction.originalAppVersion, similar to Sandbox? Is there a reliable way to detect the App Review environment specifically — separate from both Sandbox and Production? For example, does the receipt URL differ, or is there another API? Is using originalAppVersion for legacy paid-user detection a supported pattern? If so, what is the recommended approach to handle the App Review case? Any guidance would be greatly appreciated. Thank you.
Replies
0
Boosts
0
Views
96
Activity
3w
Transaction.currentEntitlements returns empty for offer code subscriptions redeemed via Safari
Users who redeemed offer codes via the Safari URL template (apps.apple.com/redeem?ctx=offercodes&id=...) have active subscriptions confirmed in iPhone Settings → Subscriptions (expiring April 2027). However, Transaction.currentEntitlements returns zero results in the app. AppStore.sync() has been called. Transaction.all also returns no Production transactions. The offer “Radius Inner Circle” is configured as: Free for the first year, does not auto-renew, and is tied to a yearly auto-renewable subscription product. Approximately 20 production users are affected. The subscription exists on Apple’s servers but never appears in the StoreKit 2 local transaction database. Is there a known issue with offer codes redeemed via Safari not populating Transaction.currentEntitlements? Is there an alternative API to query subscription status server-side? App ID: 6760574186 Bundle ID: com.michaelhills.Radius
Replies
1
Boosts
0
Views
105
Activity
1w
Korea subscription consent: Timing mismatch between push notifications and Settings consent option
Hi all, I've been observing what appears to be a timing mismatch in how Apple handles Korea trial-to-paid consent, and I wanted to see if other developers are seeing the same thing. Per Korean regulations effective Feb 14, 2025, Apple must obtain explicit user consent before converting a free trial to a paid subscription. Apple handles this via email, push notifications, and an in-app consent option accessible from Settings > Subscriptions. For a 7-day trial in the Republic of Korea storefront, I'm observing: Consent push notifications (Agree to continue your subscription without interruption) start arriving ~1 day after trial redemption, at roughly hourly frequency. However, when the user taps the push and navigates to Settings > Subscriptions, there is no consent option available. The only visible action is "Cancel Free Trial". The consent option only becomes available around day 4 of the trial (i.e., 3 days before renewal, matching Apple's documented messaging cadence [1]). For the first ~3 days, users receive hourly push notifications they cannot act on. The only way to stop them is to cancel the subscription entirely. This is happening across multiple apps in the Korean App Store, so it appears to be a platform-level behavior rather than an app-specific issue. Is anyone else observing this behavior? Any insight from Apple engineers or other developers would be greatly appreciated. [1] https://developer.apple.com/help/app-store-connect/reference/in-app-purchases-and-subscriptions/consent-for-subscription-offer-conversions
Replies
1
Boosts
0
Views
226
Activity
1w
Subscriptions Stuck in review
Hello! My subscriptions have been stuck in review for a while. I have been chasing my tail trying to get the sandbox purchases to work but the subscriptions are not returning after "sale". Is this because the subscriptions are still in review? Will the purchase ever return a product in the sandbox environment if the products are still in review? How do we get the subscriptions approved? I have submitted them with the app multiple times. The app is rejected because I can't complete it without the subscriptions but the subscriptions are never reviewed. Help!
Replies
0
Boosts
0
Views
86
Activity
3w
StoreKit 2: Transaction.all and Transaction.currentEntitlements return empty for valid non-consumable purchases in production
FB: https://feedbackassistant.apple.com/feedback/22556883 We're seeing a small number of production users where both Transaction.currentEntitlements and Transaction.all return zero transactions for a valid, active, non-refunded non-consumable IAP. This makes it impossible to restore the purchase via any StoreKit 2 API. Environment: Xcode 26.4 (Build 17E192) iOS 26.4.1 Direct call to SK2 Transactions.all & Flutter in_app_purchase package v3.2.3 (uses SK2 on iOS 15+) Non-consumable IAP (one-time purchase) What we observe: AppStore.sync() triggers but the purchase stream returns 0 transactions Transaction.all returns empty Transaction.currentEntitlements also returns empty User is confirmed on the correct Apple ID Issue reproduces on both iPhone and Mac for the same Apple ID Issue appears to have started recently for users who previously had no problems Debug log from affected production user: [2026-04-20T08:50:10.744115Z] init: iapAvailable=true [2026-04-20T08:50:10.744566Z] init: isPremium=false [2026-04-20T08:50:10.744567Z] init: triggering silent restorePurchases [2026-04-20T08:50:45.974566Z] restore: started [2026-04-20T08:50:45.986848Z] restore: sk2Transactions count=0 [2026-04-20T08:50:45.993004Z] restore: sk2Direct isVerified=false active=null [2026-04-20T08:50:45.993011Z] restore: sk2Direct inconclusive — falling back to standard restore [2026-04-20T08:51:16.000851Z] restore: timed out after 30s — fallback isPremium=false [2026-04-20T08:51:16.000910Z] restore: completed — succeeded=false foundPurchase=false Unable to reproduce in sandbox — Transaction.all works correctly there. Appears specific to production for a small subset of users. Has anyone else seen this?
Replies
19
Boosts
3
Views
1.1k
Activity
4d
Free trial for one-time purchase: Is the $0 IAP workaround still recommended in 2026?
[Repost: Somehow my original thread from Jan was deleted. I called dev support and they said to post again, if there's a better channel to get answer for this, please let me know.] I’m an indie dev with a paid, one-time-purchase app (Dash Calc, $4 USD), and sales have been rough. In a crowded category, an upfront-paid app feels like a tough sell without a way to try it first. I’d like to offer a simple 7-day free trial followed by a single lifetime purchase, but App Store Connect still doesn’t officially support trials for paid apps. In Jan 2023, an App Store Commerce Engineer recommended the $0 non-consumable IAP + paid non-consumable IAP workaround: https://developer.apple.com/forums/thread/722874 I haven’t implemented it yet, but the subsequent discussion suggests the approach is overly complex. Handling refunds, reinstalls, activation timing, and purchase history requires non-obvious logic, and some developers report customer confusion and drop-off when presented with a $0 trial IAP. Has anything improved since 2023? Any new StoreKit APIs or App Store Connect changes that make this simpler or less error-prone? Is the $0 non-consumable IAP still the recommended approach in 2026? Any updated policy guidance for time-limited access on one-time purchases? I’m happy to use the workaround if it’s still the official path—I just want to confirm there isn’t a better option now.
Replies
6
Boosts
0
Views
281
Activity
1w
Store Kit 2 iOS system purchase confirmation dialog not consistent.
I'm running into an issue where it appears the product transaction is being cached and not showing a new iOS system popup dialog to confirm the purchase. This is affecting testing, and I need a solution to have iOS issue a new purchase transaction every time. Here's what happens, I call the following which always succeeds. try await product.purchase(options: [.appAccountToken(appToken)]) I'm signed into a developer sandbox account with a resubscribe every 5 minutes. After cancelling a subscription, I attempt to resubscribe using the same code as above. Frequently, the code executes without iOS showing the popup system dialog to confirm the purchaser. After waiting a period of time, iOS then resets itself and allows me to purchase again. What I want is an option the forces the iOS system confirm purchase dialog to show up every time the code executes. How do I fix this? iOs 26.4.1, iPhone 17 Pro.
Replies
2
Boosts
0
Views
159
Activity
2d
StoreKit / IAP: Product WAITING_FOR_REVIEW — works locally with production RevenueCat key + Apple Sandbox, fails during App Review
Hello, I need guidance on App Store Connect product state vs StoreKit behavior during App Review. Stack: iOS app (Expo / React Native), subscriptions via RevenueCat + StoreKit. Bundle ID matches App Store Connect. RevenueCat API keys — what I’ve verified locally: With the production RevenueCat API key (iOS appl_..., same as the submitted build), everything works on local device but not when I download it from TestFlight. I have also tested with RevenueCat’s sandbox / test API key (the separate key intended for sandbox/testing). That setup works as well — I can load offerings and complete test purchases the same way What RevenueCat (SDK / dashboard health) reports: Product monthly is configured in RevenueCat. Warnings that products aren’t approved in App Store Connect yet and that the default offering has configuration issues. Apple’s product state: WAITING_FOR_REVIEW. The SDK still states that test purchases are possible. What App Review reports: After onboarding a new business account, “Activate subscription” leads to an error (plans don’t load / purchase path fails). Review suggested an app code issue. Why this is confusing: Locally, both RevenueCat key modes I tried (production and sandbox/test) work with Apple Sandbox on the device. The submitted build uses the production RevenueCat key. Review still sees a failure. Questions: For IAP in WAITING_FOR_REVIEW, should App Review always use an Apple Sandbox account to test subscriptions until the product is fully approved? Is it documented that StoreKit may not return products during review without Sandbox while the product remains WAITING_FOR_REVIEW? Has anyone else seen “works locally (prod + sandbox RevenueCat keys + Apple Sandbox) but Review fails” with the same WAITING_FOR_REVIEW state? Thanks for any official documentation or similar threads.
Replies
1
Boosts
0
Views
114
Activity
Apr ’26
Subscription failure in 26.4, 26.4.1
We have a user from Asia whose subscription failed to be detected by our app. On 26.4. They also tried revoking the yearly subscription and activating a monthly. Payment ok and the device reported that the subscription is active. Our code relies on Transaction.currentEntitlements in StoreKit, which seems to be broken, at least for this user. None of these worked: Installing iOS 26.4.1 Reinstalling our app Logging out and in from iCloud. Hard device reset Full iOS reinstall. User finally gave up and got a refund. I am reporting here in case other apps experienced similar problems. This discussion mentions that a regression in 26.4 might have contributed to the issue which is supposed to be fixed in 26.4.1. ( https://developer.apple.com/forums/thread/820562?answerId=883682022#883682022 ) The issue may have persisted or left the entitlements corrupt for this particular user. Hoping that the issue is resolved so we do not have more problems in the future.
Replies
2
Boosts
0
Views
137
Activity
Apr ’26
Xcode 26 Causing StoreKit Fiasco for macOS?
I submitted my last macOS application with IAP on Oct. 23rd, 2025. I was able to test-purchase a non-consumable product with the StoreKit configuration file at that time. These days, every time I test a new macOS application with the configuration file, a purchase process fails. The thing is they all now fail if I test the store with existing applications that were once working. Xcode shows the following debugging error. Purchase failed with error: systemError(Error Domain=NSCocoaErrorDomain Code=4099 "The connection to service created from an endpoint was invalidated from this process." UserInfo={AMSDescription=An unknown error occurred. Please try again., AMSURL=http://localhost:53272/WebObjects/MZBuy.woa/wa/inAppBuy, NSDebugDescription=The connection to service created from an endpoint was invalidated from this process., AMSStatusCode=200, AMSServerPayload={ All my iOS apps don't exhibit the same problem. This StoreKit fiasco only happens for macOS applications. And I'm thinking that it all started to occur after I began using Xcode 26. Not a single line of code has changed. But the applications that were once able to process IAP all now fail. And I'm suspecting that it's Xcode 26 that is responsible for this failure. My Xcode version is 26.2, by the way. Any macOS application developer experiencing the same problem?
Replies
5
Boosts
1
Views
343
Activity
3w
External Purchase in Japan
Environment: Xcode26.4 iOS26.4.1 Capabilities: StoreKit External Purchases or Offers Entitlements: com.apple.developer.storekit.custom-purchase-link.allowed-regions Value(Array of strings) is jp It's a Japanese Apple ID。 ExternalPurchaseCustomLink.isEligible is always returning false.
Replies
1
Boosts
0
Views
174
Activity
3w
Custom Pricing and Features for Non-Renewing Subscriptions
I hope you are doing well. I am reaching out to inquire about a few aspects of implementing non-renewing subscriptions in our app. Firstly, we have encountered a limitation in App Store Connect where the maximum price tier available for non-renewing subscriptions in Euros is €1199. However, our product is priced at €1799. Could anyone please advise how we can handle this scenario? Is there a way to request custom pricing beyond the available tiers, or is there an alternative approach you would recommend? Additionally, we would like clarification on the following: Promo Codes: Are promo codes supported for each non-renewing subscription product? If so, how can we configure and distribute them? Installment Payments: Is it possible to enable installment-based payments for non-renewing subscriptions? If yes, could you guide us on how to set this up or if there are any prerequisites?
Replies
1
Boosts
0
Views
472
Activity
Apr ’26
AppStore.ageRatingCode always returns 0 on real device — is this expected behavior?
Hello everyone I'm implementing age verification in my app to comply with upcoming age assurance laws (Utah, etc.), and I'm using AppStore.ageRatingCode from StoreKit to retrieve my app's current age rating. According to the documentation: extension AppStore { @available(iOS 26.2, macOS 26.2, tvOS 26.2, watchOS 26.2, *) public static var ageRatingCode: Int? { get async } } "Use this property to fetch the age rating for your app and compare it with the last known age rating to check if it has changed." However, calling this always returns 0 in my environment. Environment: Device: Real physical device (not simulator) iOS version: 26.4 Sandbox Apple Account: signed in via Settings → Developer → Sandbox Apple Account App Store Connect: app is registered and age rating is configured Xcode Scheme → Run → Options → StoreKit Configuration: None Code: func getAgeRatingCode() async -> Int? { guard let ageRatingCode = await AppStore.ageRatingCode else { print("Age rating code unavailable") return nil } print("ageRatingCode: \(ageRatingCode)") // always prints 0 return ageRatingCode } Questions: What integer values does ageRatingCode map to? (e.g., does 4+ = 4, 9+ = 9, 13+ = 13, etc.? Or is it a different internal code?) This mapping is not documented anywhere I can find. Is 0 a valid return value, and if so, what does it represent? Is there a known issue with this API returning 0 even when all conditions appear to be correctly configured? Any guidance from Apple engineers or developers who have successfully used this API would be greatly appreciated.
Replies
0
Boosts
0
Views
80
Activity
Apr ’26
SKStoreReviewController requestReviewInScene: does not display review prompt in debug builds on iOS 26.5 beta (23F5043k)
[SKStoreReviewController requestReviewInScene:] no longer displays the review prompt in debug/development builds on iOS 26.5 beta (23F5043k and 23F5043g). According to Apple's documentation, the review prompt should always appear in debug builds to facilitate testing. This was working in previous iOS versions (iOS 26.4 and older). Steps to reproduce: Run app from Xcode in debug configuration on a device running iOS 26.5 beta (23F5043k or 23F5043g) Call [SKStoreReviewController requestReviewInScene:windowScene] with a valid, foreground-active UIWindowScene Observe that the method executes without error (scene is valid per NSLog) but no review prompt appears Expected: Review prompt should display in debug builds Actual: No prompt appears, despite the scene being valid and foreground-active This worked correctly on previous iOS versions (26.4) so looks like this bug was introduced in 26.5 Beta versions. I have already filed a bug report in Feedback Assistant with number: FB22445620
Replies
4
Boosts
0
Views
388
Activity
1w
Transaction.unfinished not getting unfinished transactions
I am testing auto renewing subscriptions for a macOS program in Xcode with a local Storekit file. I have renewals set to occur every minute for testing. I quit the app, and watch renewals appear in the Debug transaction manager window. Each is marked unfinished. When I start the app, I call a function that is supposed to get unfinished transactions and finish them. In one of those "I swore it worked the other day", I am now finding it isn't working. The unfinished transaction remain marked as unfinished. func getUnfinished() async { for await verificationResult in Transaction.unfinished { guard case .verified(let transaction) = verificationResult else { continue } await transaction.finish() } } If I add an AppStore.sync() right before looping on Transaction.unfinished, it works (i.e., cleans up unfinished transactions), but I get an alert I have to click through. do { try await AppStore.sync() } catch { print("DEBUG UNFINISHED: AppStore.sync() failed: \(error)") } Any idea why Transaction.unfinished isn't fetching unfinished transactions for me (without the AppStore.sync)?
Replies
2
Boosts
0
Views
224
Activity
2w
AppStore.sync Replays the Latest Subscription Renewal into Transaction.unfinished on iOS 26.4 Sandbox
StoreKit2 Repro Notes: the latest renewal appears in Transaction.unfinished after restore (2026-04-05) 1. Issue Summary In the current project, during a normal cold launch: Transaction.latest(for:) returns a value for the weekly subscription Transaction.all returns the full subscription history chain Transaction.unfinished is empty However, after tapping Restore Purchases and calling AppStore.sync(), one "latest renewal" transaction appears in Transaction.unfinished. This behavior looks more like a system-side replay triggered by AppStore.sync() than a consistently unfinished transaction during a normal launch. 2. Affected Product Product: do.i.iapc.vip.week Transaction chain characteristics: All transactions belong to the same auto-renewable subscription chain originalTransactionID = 2000001143446796 The transaction that appears in unfinished is usually the latest or last renewal in the chain 3. Current Code Path During app startup: loadProducts() Debug snapshot for Transaction.latest(for:) Debug snapshot for Transaction.all Scan Transaction.unfinished refreshEntitlements() During restore purchases: Call AppStore.sync() Scan Transaction.unfinished refreshEntitlements() 4. Preconditions A Sandbox test account is used The weekly subscription do.i.iapc.vip.week already has multiple historical renewal transactions The subscription is already expired, so entitlements = 0 during a normal launch The issue is easier to reproduce on an iOS 26.4 device The issue was not consistently reproduced on another iOS 18.2 device 5. Reproduction Steps Path A: Normal cold launch Launch the app Observe the logs: LatestTransaction snapshot AllTransaction snapshot summary unfinished processing result Observed result: latest has a value all contains the full history chain unfinishedHandledCount = 0 Path B: Tap Restore Purchases Launch the app Tap Restore Purchases Trigger AppStore.sync() Observe the logs: restore started unfinished processing started unfinished transaction received Observed result: After restore, one "latest renewal" transaction appears in unfinished That same transaction does not necessarily appear during a normal cold launch 6. Expected Result If a transaction has already been successfully finished in the past, it should not appear again as unfinished after Restore Purchases. A stricter expectation is: During a normal cold launch, unfinished = 0 After tapping Restore Purchases, unfinished should still remain 0 7. Actual Result Actual behavior: Normal cold launch: unfinished = 0 After Restore Purchases: one "latest renewal" transaction appears again in unfinished This suggests that AppStore.sync() may replay the most recent historical subscription transaction. 8. Current Assessment Based on the current logs, the issue is more likely to be: Related to AppStore.sync() / StoreKit / Sandbox replay behavior on the system side Easier to reproduce on iOS 26.4 Less likely to be caused by a persistent app-side bug where finish() is missed during a normal startup flow Reasons: During a normal launch, unfinished = 0 The behavior is inconsistent across devices and OS versions, even with the same Sandbox account latest, all, and unfinished can be clearly separated during a normal cold launch 9. Suggested Engineering Position Suggested wording for internal or external communication: In the iOS 26.4 + Sandbox environment, calling AppStore.sync() may cause StoreKit to replay the latest historical subscription transaction into Transaction.unfinished. Since the same transaction does not necessarily appear during a normal cold launch, the issue currently looks more like a system/environment-specific behavior difference than an app-side bug where finish() is consistently missed during the regular startup path. 10. Additional Evidence That Can Be Collected If this needs to be escalated to the team or to Apple, the following would strengthen the report: Full log comparison before and after tapping Restore Purchases The same transactionId compared between normal launch and post-restore behavior Cross-device comparison on different iOS versions A minimal reproducible sample project and Sandbox test record
Replies
1
Boosts
0
Views
303
Activity
2w
In-App Purchase dialog not appearing during App Review but works on physical device
Hi everyone, My app has been rejected twice under Guideline 2.1(b) - App Completeness because the reviewer says the In-App Purchase does not trigger a purchase flow when tapping the purchase button. However, I have tested it on a physical iPhone (iOS 18.6.2) and the StoreKit purchase dialog appears and completes successfully. I have confirmed: Paid Apps Agreement is active In-App Purchase product (non-consumable) is configured correctly Sandbox test account works fine Purchase flow works on physical device with screen recording as proof The reviewer tested on iPad Air 11-inch (M3) with iPadOS 26.4. My app uses Flutter with the in_app_purchase package (v3.2.0). The purchase implementation: Calls InAppPurchase.instance.isAvailable() Queries product details with queryProductDetails() Calls buyNonConsumable() when user taps purchase button I found and fixed a potential null reference issue in the purchase completer that could cause the purchase to fail silently, but I'm not sure if this was the exact cause since I cannot reproduce the issue. Has anyone experienced a similar situation where IAP works on device but fails during App Review? Any suggestions on what might be different in the review environment? Thank you.
Replies
2
Boosts
0
Views
119
Activity
Apr ’26
Settings app crashes when tapping "Manage" under Sandbox account without internet connection
Device: iPhone 13 OS Version: iOS 26.4, iOS 26.5 Summary: The Settings app crashes when accessing the Sandbox account management screen in Developer Settings while the device is offline. Steps to Reproduce: Enable Developer Mode on the device Disconnect from the internet (Wi-Fi and cellular off) Go to Settings → Developer Ensure a Sandbox account is signed in Tap on "Sandbox" Tap on "Manage" Expected Result: The system should either: Open the Sandbox management screen, or Show an error indicating no internet connection Actual Result: The Settings app crashes immediately after tapping "Manage". Reproducibility: Always (100%) when offline Additional Notes: Issue observed on iOS 26.4 and iOS 26.5 Does not occur on iOS 18 May also be present in other iOS 26.x versions Does not occur when the device has an active internet connection
Replies
1
Boosts
0
Views
107
Activity
3w
First auto-renewable subscription does not appear on app version page in App Store Connect
Hello, I am blocked on the first auto-renewable subscription submission for my iOS app and I would like to know if anyone has seen this exact App Store Connect behavior. App: SEKA Money Subscription product ID: seka_premium_yearly_ Subscription Apple ID: 6760082026 Current issue: the auto-renewable subscription exists in App Store Connect I am on the correct iOS app version page the “In-App Purchases and Subscriptions” section is visible but my auto-renewable subscription does not appear in the selector only a consumable IAP appears there Important detail: the issue happens directly inside App Store Connect on the app version page this is why I do not think the missing subscription in that selector is caused by the runtime StoreKit code in the app itself I understand app code can affect UI price display, but it should not control whether a subscription appears in the App Store Connect submission selector Other details: this is my first subscription the subscription has already gone through “Waiting for Review” and is now “Developer Action Needed” metadata, screenshot, and localizations have been filled Apple Support already confirmed that I do not need a consumable for this case sandbox / TestFlight purchase behavior has been partially reproducible, but the submission workflow remains blocked because the subscription is not selectable on the app version page My question: Has anyone seen a case where the first auto-renewable subscription exists but does not appear in the app version selector, while another IAP type does appear? If yes, what was the real cause and how did you resolve it? Thank you.
Replies
2
Boosts
0
Views
106
Activity
Apr ’26