StoreKit Test

RSS for tag

Create and automate tests in Xcode for your app's submission and in-app purchase transactions.

Posts under StoreKit Test tag

200 Posts

Post

Replies

Boosts

Views

Activity

In-App Purchase Resources
General: Forums topic: StoreKit Forums tag: In-App Purchase App Store Pathway Simple and safe In-App Purchases Auto-renewable subscriptions In-App Purchase documentation Getting started with In-App Purchase using StoreKit views documentation Supporting business model changes by using the app transaction documentation Testing at all stages of development with Xcode and the sandbox documentation App Store Server Notifications documentation App Store Server API documentation Simplifying your implementation by using the App Store Server Library documentation TN3185: Troubleshooting In-App Purchases availability in Xcode technote TN3186: Troubleshooting In-App Purchases availability in the sandbox technote TN3188: Troubleshooting In-App Purchases availability in the App Store technote Understanding StoreKit workflows sample code Implementing a store in your app using the StoreKit API sample code What’s new in StoreKit and In-App Purchase video
0
0
227
3w
StoreKit returns 0 subscriptions on TestFlight — Apple IAP payment sheet never opens (Capacitor + RevenueCat)
Hello, I'm developing a Capacitor/Next.js iOS app with RevenueCat for auto-renewable subscriptions. On a real iPhone via TestFlight, StoreKit never returns my subscription products, so the Apple payment sheet never appears. App TestFlight builds tested: 110, 111, 112 (iOS 1.1.0) In-App Purchase capability enabled on App ID Paid Applications Agreement: active Banking/tax: active Subscription product IDs (auto-renewable, same subscription group) vytalai_premium_monthly vytalai_premium_yearly vytalai_premium_yearly_intro (exit offer) What happens Install app from TestFlight on physical iPhone Navigate to paywall App calls RevenueCat → Purchases.getProducts() with the 3 product IDs above StoreKit returns 0 products (or configure/getProducts times out) UI shows: "Apple Store: 0 subscriptions on this device — Sandbox popup cannot open" Tapping subscribe does not open the Apple payment sheet Fallback prices appear (3.49 / 29.99) instead of live App Store prices (3,49 € / 29,99 €), which suggests StoreKit is not returning products. What we already verified Correct bundle ID in build metadata NEXT_PUBLIC_REVENUECAT_API_KEY_IOS (appl_*) embedded in EAS production build Provisioning profile regenerated and active Subscription metadata corrected (was Rejected, now Waiting for Review) All 3 subscriptions attached to app version submission RevenueCat offering "default" with monthly, annual, and annual_intro packages App Store Server Notifications URL configured to RevenueCat Legal pages open in-app (no external cookie banner on native) Testing on TestFlight only (not Safari/web) App Review context We received Guideline 2.1(b) rejections because: Error on purchase page Exit offer (50% OFF / €1.91 per month equivalent) referenced product vytalai_premium_yearly_intro which was not submitted for review initially — now added and submitted with the app version. Question Even with subscriptions in "Waiting for Review" state and metadata completed, should StoreKit Sandbox/TestFlight return these products on device so we can test the payment sheet before approval? If not, what exact App Store Connect state is required for StoreKit to return products on TestFlight? Any guidance on why getProducts would return 0 for valid product IDs on a TestFlight build would be greatly appreciated. Thank you.
2
0
109
4d
RevenueCat offerings returning empty (current: null, allKeys: []) despite correct setup — first-time auto-renewable subscription submission
Hi all, I'm launching my first iOS app (Capacitor/Next.js WebView wrapper) with two auto-renewable subscriptions via RevenueCat, and I'm stuck on a persistent issue across multiple App Store Review rejections. Setup: Bundle ID: no.skaren.app Two auto-renewable subscriptions: no.skaren.app.premium.monthly and no.skaren.app.premium.yearly, both in a single subscription group RevenueCat integrated via @revenuecat/purchases-capacitor App-Specific Shared Secret added to RevenueCat App Store Connect API key (with correct Key ID/Issuer ID) added to RevenueCat Paid Apps Agreement: Active Bundle ID in RevenueCat matches exactly RevenueCat API key in app code matches dashboard exactly The problem: On a physical device (TestFlight build, signed into Sandbox Apple ID), calling Purchases.getOfferings() always returns: {"current":null,"allKeys":[]} No errors are thrown — the offerings object is just empty. This happens consistently across multiple builds, after removing a conflicting limitsNavigationsToAppBoundDomains WebView restriction (which was separately causing a blank-screen bug, now fixed and confirmed working on-device). App Store Connect status: This is our first subscription submission ever. Both subscription products currently show "Developer Action Needed" status in App Store Connect (their localizations were rejected once for vague wording, fixed and resaved, but the products remain in this state). App Review's rejection message explicitly states: "Apple reviews In-App Purchase products in the sandbox and the In-App Purchase products do not need prior approval to function in review." However, our experience suggests otherwise — RevenueCat returns zero offerings, and App Review's own testers also report an "error message displayed on the subscription page" when attempting to test the IAP flow. Question: Is it actually true that subscriptions in "Developer Action Needed" / not-yet-approved status can still be fetched via StoreKit/RevenueCat during sandbox testing? Or does the first-ever subscription submission genuinely need to be approved (i.e., go through the review cycle once) before getOfferings() will return populated data? Has anyone encountered this exact "chicken-and-egg" situation, where the first IAP submission can't be tested until reviewed, but review fails because it can't be tested? Any insight into whether this is expected sandbox behavior for first-time subscription submissions, or whether there's a configuration issue I'm missing, would be hugely appreciated. Thanks!
0
0
54
1w
Transaction.currentEntitlements sometimes does not emit a result until device is reboot
I have the typical StoreKit 2 manager class, where I check currentEntitlements for subscription. I have filed a feedback (FB22349195), I hope someone can take a look at it. func updateCustomerProductStatus() async { var activeSubscription: String? = nil // BUG: In some cases the currentEntitlements does not emit a transaction until the device is reboot for await result in Transaction.currentEntitlements { print("Found transaction: \(result)") // This print does not appear until a restart! do { let transaction = try checkVerified(result) // Skip revoked transactions if transaction.revocationDate != nil { print("Skipping revoked transaction for \(transaction.productID)") continue } // Skip expired subscriptions if let expirationDate = transaction.expirationDate, expirationDate < Date() { print("Skipping expired subscription for \(transaction.productID)") continue } // Check product type switch transaction.productType { case .autoRenewable: activeSubscription = transaction.productID default: break } } catch { print("Unable to verify transaction: \(error)") } } // Update state once after processing all entitlements self.activeSubscription = activeSubscription print("updateCustomerProductStatus() activeSubscription: \(activeSubscription ?? "nil")") } There is some unexpected behavior where the currentEntitlements does not emit a result until the iPhone device is reboot. This bug appeared in iOS 26.4 (and in the betas).
2
2
441
1w
xcodebuild test (CLI) does not sync .storekit to storekitd on iOS 26.5 — SKTestSession unusable in CI
On iOS 26.5 simulator runtime, running UI tests via xcodebuild test from the command line does not push the scheme's StoreKitConfigurationFileReference to the destination simulator's storekitd AppGroup Octane container. As a consequence, SKTestSession(configurationFileNamed:) either silently falls through to the production App Store (surfacing a "Sign in to Apple Account" SpringBoard alert during paywall tests), or throws SKInternalErrorDomain Code=3 "Error saving configuration file" if you call any SKTestSession instance method. The same project, same scheme, same .storekit file works correctly when launched via Xcode IDE (Cmd+R / Cmd+U) — which uses DVTDevice.handleStoreKitConfigurationSyncForBundleID:configurationFilePath: via an internal IDELaunchSession XPC path that the public xcodebuild CLI does not invoke. This regression makes StoreKit Test unusable in CI for any project using xcodebuild test or xcodebuild test-without-building against an iOS 26.5 simulator. Environment macOS: 26.x Xcode: 26.4.1 (25E253) iOS Simulator runtime affected: 26.5 iOS Simulator runtime that does not exhibit the bug: 26.1 Test target: XCTest UI tests Test plan: *.xctestplan with "storeKitConfiguration": "MyApp.storekit" in defaultOptions Affected scheme actions: Test (CLI) Not affected: Run, Test (Xcode IDE) Steps to Reproduce Create a SwiftUI iOS app com.example.MyApp. Add a MyApp.storekit with one auto-renewable subscription. Add a UI test target. In the xctestplan: defaultOptions.storeKitConfiguration = "MyApp.storekit". In the UI test base case: private var storeKitSession: SKTestSession? override func setUpWithError() throws { storeKitSession = try SKTestSession(configurationFileNamed: "MyApp") app.launch() } Boot a fresh iOS 26.5 simulator. Run via CLI: xcodebuild test \ -project MyApp.xcodeproj \ -scheme MyApp \ -testPlan MyAppUITests \ -destination "platform=iOS Simulator,name=iPhone 17 Pro" In the test, trigger paywall and call Product.purchase(). Expected Product.purchase() presents the StoreKit Test sheet labeled "[Environment] Xcode". Same behavior as Xcode IDE Cmd+U. Actual Production App Store flow triggers. SpringBoard alert "Sign in to Apple Account" appears. Tests waiting on the "Xcode"-labeled sheet fail with Element does not exist. Evidence The simulator's ~/Library/Developer/CoreSimulator/Devices/<UDID>/data/Containers/Shared/AppGroup/<storekit-AGID>/Documents/Persistence/Octane/com.example.MyApp/Configuration.storekit: Present (≈100 KB) when launched via Xcode IDE. Missing when launched via xcodebuild test CLI on the same simulator UDID. Workarounds Attempted (all fail on iOS 26.5) No-op XCTestCase "warmup" that calls XCUIApplication.launch() + sleep — does not trigger the sync because XCUIApplication.launch() routes through XCTRunner, not IDELaunchSession. Multi-destination xcodebuild test with -parallelize-tests-among-destinations. Manually cp-ing the .storekit file into the AppGroup Octane container — storekitd only loads via the XPC channel. launchctl kickstart -k system/com.apple.storekitd — wipes in-memory state, does not pick up disk file. Only working workaround: open project in Xcode IDE, Cmd+R, wait ~20–30 sec, Cmd+., then Cmd+U. Not viable for CI. Related Open Feedback FB22237318 — SKTestSession instance methods (clearTransactions(), failTransactionsEnabled = true) throw SKInternalErrorDomain Code=3 "Error saving configuration file". Discussion thread: https://developer.apple.com/forums/thread/808030 The iOS 26.5 Release Notes (https://developer.apple.com/documentation/ios-ipados-release-notes/ios-ipados-26_5-release-notes) under StoreKit Test list this issue as resolved in 26.5: "Fixed: SKTestSession may fail to save its configuration file when invoked outside of an Xcode debug session." However, on the public iOS 26.5 simulator runtime the behavior is unchanged — SKTestSession still hits Code=3 on any mutation, and xcodebuild test from CLI still does not sync the .storekit configuration. The 26.5 fix either did not actually ship, or this report describes a distinct but related issue that the fix did not cover. Impact Any CI/CD pipeline running UI tests for apps with StoreKit subscriptions is broken when targeting an iOS 26.5 simulator. Workarounds are either: Pin CI simulator runtime to iOS 26.1. Manually run the project in Xcode IDE before each test run (impossible headless). Has anyone found a CLI-friendly workaround? Or is there an undocumented xcodebuild flag / simctl command that can trigger the same DVTDevice sync from outside the IDE?
5
2
562
1w
Is SKTestSession available for Swift Package tests?
I'm trying to test my StoreKit package using local "Consumable.storekit" configuration added to test target as a .copy() resource. I receive various errors. On purchase attempts I receive StoreKitError.unknown. In the console I see this diagnostic messages: [SKTestSession] Error saving configuration file: Error Domain=SKInternalErrorDomain Code=3 "(null)" [SKTestSession] Error setting value to 1 for identifier 2 for com.apple.dt.xctest.tool: Error Domain=SKInternalErrorDomain Code=3 "(null)" I these last two cases product loading failed. It feels like session require mutable .storekit file? Also, some people mention that Host Application must be selected, but it's related to Xcode projects. What is the correct way to test StoreKit within a Swift Package?
1
0
89
1w
Sandbox testing - Clear Purchase History
Hi, Overview I have an app for which I have created a sandbox account. When I try to clear purchase history it doesn't work, it still shows the in-app purchase items (non-consumable in-app purchases) as purchased. I have tied tried the following ways, but none of them work. Any help on this would be much appreciated! Attempt 1: Go to https://appstoreconnect.apple.com/ Users and Access > Sandbox Check sandbox account > Tap Clear Purchase History button Attempt 2: Go to the iPhone > Settings > Developer > Sandbox Apple Account Tap on account > Manage > Clear Purchase History Attempt 3: Sign out of Sandbox account and sign back in Attempt 4: Delete app and re-run app from Xcode
2
2
258
2w
IAP and Subscriptions
I would like to explain the current situation regarding our subscriptions and ask a few clarification questions to ensure that our implementation fully complies with App Store requirements. Current Status We have successfully configured our subscriptions in App Store Connect. All subscription products currently appear as “Waiting for Review.” Paid Apps Agreement has been accepted and is active. Banking and tax information are completed and active. RevenueCat integration is working correctly. In TestFlight, the app is now able to: Fetch products successfully Display localized Turkish pricing Open the native Apple purchase sheet Start sandbox purchase flow successfully We can now see Apple’s native TestFlight subscription purchase popup with the correct products and prices, which indicates that StoreKit communication is functioning correctly. However, we are still confused about the review/submission relationship between: The app version submission The first subscription review Existing “Waiting for Review” subscription states Questions Since the subscriptions already show “Waiting for Review,” does this mean they are correctly attached to the currently reviewed app version? Or do we still need to create an entirely new app version submission and manually re-add all subscriptions from the “In-App Purchases and Subscriptions” section before review can continue? The subscriptions are already accessible in TestFlight sandbox purchase flow. Does this confirm that our StoreKit configuration is now technically valid for review? If there is still a configuration issue on our side, could you please clarify exactly which step is missing: attaching subscriptions to a specific binary, submitting the first subscription with a new app version, or another App Store Connect configuration requirement? Our goal is to fully comply with App Store policies and avoid submitting another incorrect review build.
1
0
258
2w
StoreKit Product Retrieval Issue During App Review
Hello, We are experiencing the exact same behavior described in the following Apple Developer Forum thread: https://developer.apple.com/forums/thread/827016 The issue appears to be isolated to the App Review environment and matches our current rejection under Guideline 2.1 - Performance. On our side, the subscription system is functioning correctly and consistently in TestFlight using the exact same build that was reviewed. We tested on multiple physical devices using Sandbox tester accounts and confirmed that: StoreKit successfully returns all subscription products RevenueCat offerings load correctly Localized pricing is displayed properly Purchases complete successfully Restore purchases also work as expected However, during App Review, the review notes indicate that the product list is empty, which causes the paywall to fail loading. We would like to emphasize that: The In-App Purchases are attached to the submitted app version Product identifiers exactly match between App Store Connect and the application code Agreements, tax, and banking information are active The products are marked as available for sale The same binary works correctly in TestFlight Because the issue cannot be reproduced outside the review environment, we currently have no reliable way to diagnose or validate a permanent fix. At this point, we suspect there may be an intermittent StoreKit product retrieval issue affecting the App Review environment specifically. If possible, could you please: Verify whether StoreKit product retrieval is functioning correctly in the review sandbox environment Share any diagnostic logs related to the failed product request Confirm whether the review device successfully connects to App Store sandbox services Provide any additional guidance for reproducing the App Review behavior locally We are fully committed to resolving the issue and ensuring compliance with App Store requirements, but currently the behavior appears environment-specific and non-reproducible from our side. Thank you very much for your assistance and support. Best regards, Mert Akgün
0
0
100
2w
React Native IAP: getProducts returns empty array in TestFlight despite complete configuration
Hi everyone, I’m currently developing an iOS app using React Native and implementing consumable In-App Purchases (IAP). I'm facing an issue where getProducts returns an empty array without any error messages when testing on a TestFlight build. I have already completed the following setup: Agreements, Tax, and Banking: All forms are signed and the status is "Active" in App Store Connect. Product Configuration: The Consumable product is created in App Store Connect with the status "Ready to Submit". App Store Connect Integration: The product is correctly linked under the "In-App Purchases and Subscriptions" section of the App version. Xcode Capability: The "In-App Purchase" capability has been added to the project. Implementation: The Product ID in my React Native code (using react-native-iap) matches the ID in App Store Connect exactly. Despite these steps, the product list remains empty. Are there any hidden requirements or specific configurations for TestFlight that I might have missed? Any guidance would be greatly appreciated. Thanks!
1
0
371
3w
IAP rejected under 2.1(b) "failed to load" — products work in Sandbox/TestFlight but fail in App Review
I'm getting repeatedly rejected under Guideline 2.1(b) - App Completeness, with the message that the in-app purchase products "failed to load." This has happened on multiple submissions now, and I'm stuck because everything works fine on my end. My setup: 2 auto-renewable subscriptions + 1 in-app purchase, all in "Waiting for Review" status and attached to the current version (1.0.0). All three products load and purchase successfully when I test via TestFlight with a Sandbox account. No errors at all. Paid Apps Agreement, banking, and tax forms are all Active. I have another app on the same account where IAPs are live and working, so I don't think it's an account/agreement issue. Review device was iPad Air 11-inch (M3), iPadOS 26.5. One detail that might be relevant: this account was migrated from an individual to an organization account a while back, and there were some app transfers involved on the account (though not for this specific app). What I've already tried/confirmed: Product IDs in code match App Store Connect exactly. Products are attached to the build (there's no separate section to re-attach them on resubmit, which I understand means they're already linked). Resubmitted multiple times with the same result. My questions: Has anyone seen IAPs load fine in Sandbox/TestFlight but consistently fail in App Review specifically? What was the root cause? Could the individual-to-organization migration or prior app transfers cause IAPs to fail loading only in the review environment, even when agreements show Active? Is there anything region/storefront-specific that would make SKProductsRequest / Product.products(for:) return an empty list for the reviewer but not for me? Any pointers would be hugely appreciated. Thanks!
0
1
103
3w
App rejected under 3.1.1: Reviewer mistook native iOS StoreKit prompt for a custom password field
Hello everyone, I'm facing a very frustrating situation with App Review for my indie app, CoffeePomodoro, and I'm hoping someone here or an Apple engineer can help shed some light on how to escalate and resolve this. My recent update (Version 1.3.1, Submission ID: 59763b52-7c14-4b27-a2cf-2799d2bafe35) was rejected under Guideline 3.1.1 - In-App Purchase. The rejection message states: "We found that the app includes a feature to restore previously purchased In-App Purchase products by entering the user's Apple Account and password. However, In-App Purchases cannot be restored in this manner." The Reality: There is absolutely zero custom UI, form, or TextField in my app that asks for an Apple ID or password. When a user taps "Restore Purchases", the app simply calls Purchases.shared.restorePurchases() via the RevenueCat SDK, which directly wraps Apple's native SKPaymentQueue.restoreCompletedTransactions(). The credential prompt the reviewer saw is the native iOS system-level authentication dialog that appears automatically in the sandbox/TestFlight environment. This usually happens if the device or simulator being used for the review doesn't have an active Sandbox Apple ID already logged in. I have explained this in the App Store Connect Resolution Center. I provided screen recordings showing it's the system dialog, and I attached code snippets proving the app only calls native APIs. Unfortunately, my explanations seem to be ignored, and I keep facing the same roadblock. It feels like the reviewers are mistaking their own OS's native prompt for a custom credential-harvesting screen. Meanwhile, my users are waiting for this update to resolve their subscription issues, and I am stuck in a rejection loop for using Apple's own native API exactly as intended. Has anyone else experienced this specific misunderstanding by the review team? How can I escalate this so someone actually reviews the screen recording and code snippets I provided? Thank you for your time.
3
0
229
May ’26
StoreKit testing not working on iOS26.5 simulator
Hi, I'm trying to run our StoreKit unit tests with Xcode26.5 on an iOS26.5 simulator. Host computer has macOS26.5. All tests are failing and in the console I see logs such as [SKTestSession] Error saving configuration file: Error Domain=SKInternalErrorDomain Code=3 "(null)" [SKTestSession] Error deleting all transactions: Error Domain=SKInternalErrorDomain Code=3 "(null)" [SKTestSession] Error clearing overrides: Error Domain=SKInternalErrorDomain Code=3 "(null)" [SKTestSession] Error setting value to 1 for identifier 2 for jp.unext.mediaplayer: Error Domain=SKInternalErrorDomain Code=3 "(null)" And the simulator asks me to provide my AppleID. Tests have been broken since at least 26.4 The release notes claims that it has been fixed but not for me. https://developer.apple.com/documentation/ios-ipados-release-notes/ios-ipados-26_5-release-notes#StoreKit-Testing-in-Xcode Does anyone else have the same issue? Reported FB22774836 just in case.
6
9
630
May ’26
When user goes to Settings>Their name>Subscriptions and wanna cancel the app, a "Don't go" widget is shown - is this a win back offer or a promotional offer?
When i went on to try to cancel some app's subscription, I saw this. I wanna implement the same thing for my app, but there is literally zero information online or in any docs whether this is a win-back offer, a promotional offer, or something else. And if it is a win-back offer, how to test it?
1
0
196
May ’26
Promoted In-App Purchase not loading during App Review: “Donation product is not available yet”
Hello Apple Developer Community, My iOS app was rejected during App Review because the promoted In-App Purchase donation product showed this error: “Donation product is not available yet” App Review details: Device: iPad Air 11-inch (M3) OS: iPadOS 26.4.2 Internet connection: Active Last reviewed build: 1.0.0 (1) App is iPhone only In-App Purchase type: Consumable donation product The app uses StoreKit to load the donation product from App Store Connect. On my side, the product is configured in App Store Connect and works during testing, but App Review reported that the product was not available when they tested it. I would like to confirm the correct setup for a promoted In-App Purchase / donation product before resubmitting the app. Questions: My In-App Purchase product, which is added under In-App Purchase Information in App Store Connect, is currently showing the status “Waiting for Review” while my app build has been submitted for review. Could this be the reason my app is showing the following StoreKit error? “Check the local StoreKit configuration or App Store Connect setup for com.xxxxxxxxx.xxx.xxxx.” I would like to confirm whether an IAP product that is still “Waiting for Review” can be loaded by App Review during testing, or whether it must be approved together with the app before StoreKit can return the product successfully. The product ID in my app matches the product ID in App Store Connect, and the app uses StoreKit to load the product. Can App Review test a promoted In-App Purchase before the app itself is approved? Is there any delay after creating or editing an In-App Purchase before it becomes available to App Review? For an iPhone-only app reviewed on iPad, can this affect StoreKit product loading or promoted In-App Purchase availability? Any guidance on the correct App Store Connect setup would be appreciated. Thank you.
1
0
203
May ’26
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
384
Apr ’26
Xcode 26 beta 3: StoreKit Testing broken
It seems that beta 3 broke StoreKit Testing when running against an iOS 26 simulator device. Specifically, when validating product IDs, the debug console displays messages like the following: [492a4cfa_SK1] Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.price], expected: StoreKit.BackingValue) [492a4cfa_SK1] Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.price], expected: StoreKit.BackingValue) [492a4cfa_SK1] Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.price], expected: StoreKit.BackingValue) [492a4cfa_SK1] Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.price], expected: StoreKit.BackingValue) [492a4cfa_SK1] Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.price], expected: StoreKit.BackingValue) [492a4cfa_SK1] Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.price], expected: StoreKit.BackingValue) [492a4cfa_SK1] Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.price], expected: StoreKit.BackingValue) [492a4cfa_SK1] Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.price], expected: StoreKit.BackingValue) In addition, the SKProductsResponse (I am using the original StoreKit API), lists all requested product IDs in invalidProductIdentifiers. The products array is empty. StoreKit Testing behaves as expected when Xcode 26 beta 3 is run against an iOS 18.4 simulator device.
5
0
594
Apr ’26
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
175
Apr ’26
In-App Purchase Resources
General: Forums topic: StoreKit Forums tag: In-App Purchase App Store Pathway Simple and safe In-App Purchases Auto-renewable subscriptions In-App Purchase documentation Getting started with In-App Purchase using StoreKit views documentation Supporting business model changes by using the app transaction documentation Testing at all stages of development with Xcode and the sandbox documentation App Store Server Notifications documentation App Store Server API documentation Simplifying your implementation by using the App Store Server Library documentation TN3185: Troubleshooting In-App Purchases availability in Xcode technote TN3186: Troubleshooting In-App Purchases availability in the sandbox technote TN3188: Troubleshooting In-App Purchases availability in the App Store technote Understanding StoreKit workflows sample code Implementing a store in your app using the StoreKit API sample code What’s new in StoreKit and In-App Purchase video
Replies
0
Boosts
0
Views
227
Activity
3w
StoreKit returns 0 subscriptions on TestFlight — Apple IAP payment sheet never opens (Capacitor + RevenueCat)
Hello, I'm developing a Capacitor/Next.js iOS app with RevenueCat for auto-renewable subscriptions. On a real iPhone via TestFlight, StoreKit never returns my subscription products, so the Apple payment sheet never appears. App TestFlight builds tested: 110, 111, 112 (iOS 1.1.0) In-App Purchase capability enabled on App ID Paid Applications Agreement: active Banking/tax: active Subscription product IDs (auto-renewable, same subscription group) vytalai_premium_monthly vytalai_premium_yearly vytalai_premium_yearly_intro (exit offer) What happens Install app from TestFlight on physical iPhone Navigate to paywall App calls RevenueCat → Purchases.getProducts() with the 3 product IDs above StoreKit returns 0 products (or configure/getProducts times out) UI shows: "Apple Store: 0 subscriptions on this device — Sandbox popup cannot open" Tapping subscribe does not open the Apple payment sheet Fallback prices appear (3.49 / 29.99) instead of live App Store prices (3,49 € / 29,99 €), which suggests StoreKit is not returning products. What we already verified Correct bundle ID in build metadata NEXT_PUBLIC_REVENUECAT_API_KEY_IOS (appl_*) embedded in EAS production build Provisioning profile regenerated and active Subscription metadata corrected (was Rejected, now Waiting for Review) All 3 subscriptions attached to app version submission RevenueCat offering "default" with monthly, annual, and annual_intro packages App Store Server Notifications URL configured to RevenueCat Legal pages open in-app (no external cookie banner on native) Testing on TestFlight only (not Safari/web) App Review context We received Guideline 2.1(b) rejections because: Error on purchase page Exit offer (50% OFF / €1.91 per month equivalent) referenced product vytalai_premium_yearly_intro which was not submitted for review initially — now added and submitted with the app version. Question Even with subscriptions in "Waiting for Review" state and metadata completed, should StoreKit Sandbox/TestFlight return these products on device so we can test the payment sheet before approval? If not, what exact App Store Connect state is required for StoreKit to return products on TestFlight? Any guidance on why getProducts would return 0 for valid product IDs on a TestFlight build would be greatly appreciated. Thank you.
Replies
2
Boosts
0
Views
109
Activity
4d
StoreKit problem
StoreKit getProducts returns 0 subscriptions on TestFlight for product IDs vytalai_premium_monthly, vytalai_premium_yearly, vytalai_premium_yearly_intro (bundle com.ciborgu.vytalai, build 112+). All metadata submitted, Paid Apps Agreement active. Please check why Sandbox catalog is empty for this app.
Replies
0
Boosts
0
Views
50
Activity
4d
RevenueCat offerings returning empty (current: null, allKeys: []) despite correct setup — first-time auto-renewable subscription submission
Hi all, I'm launching my first iOS app (Capacitor/Next.js WebView wrapper) with two auto-renewable subscriptions via RevenueCat, and I'm stuck on a persistent issue across multiple App Store Review rejections. Setup: Bundle ID: no.skaren.app Two auto-renewable subscriptions: no.skaren.app.premium.monthly and no.skaren.app.premium.yearly, both in a single subscription group RevenueCat integrated via @revenuecat/purchases-capacitor App-Specific Shared Secret added to RevenueCat App Store Connect API key (with correct Key ID/Issuer ID) added to RevenueCat Paid Apps Agreement: Active Bundle ID in RevenueCat matches exactly RevenueCat API key in app code matches dashboard exactly The problem: On a physical device (TestFlight build, signed into Sandbox Apple ID), calling Purchases.getOfferings() always returns: {"current":null,"allKeys":[]} No errors are thrown — the offerings object is just empty. This happens consistently across multiple builds, after removing a conflicting limitsNavigationsToAppBoundDomains WebView restriction (which was separately causing a blank-screen bug, now fixed and confirmed working on-device). App Store Connect status: This is our first subscription submission ever. Both subscription products currently show "Developer Action Needed" status in App Store Connect (their localizations were rejected once for vague wording, fixed and resaved, but the products remain in this state). App Review's rejection message explicitly states: "Apple reviews In-App Purchase products in the sandbox and the In-App Purchase products do not need prior approval to function in review." However, our experience suggests otherwise — RevenueCat returns zero offerings, and App Review's own testers also report an "error message displayed on the subscription page" when attempting to test the IAP flow. Question: Is it actually true that subscriptions in "Developer Action Needed" / not-yet-approved status can still be fetched via StoreKit/RevenueCat during sandbox testing? Or does the first-ever subscription submission genuinely need to be approved (i.e., go through the review cycle once) before getOfferings() will return populated data? Has anyone encountered this exact "chicken-and-egg" situation, where the first IAP submission can't be tested until reviewed, but review fails because it can't be tested? Any insight into whether this is expected sandbox behavior for first-time subscription submissions, or whether there's a configuration issue I'm missing, would be hugely appreciated. Thanks!
Replies
0
Boosts
0
Views
54
Activity
1w
Transaction.currentEntitlements sometimes does not emit a result until device is reboot
I have the typical StoreKit 2 manager class, where I check currentEntitlements for subscription. I have filed a feedback (FB22349195), I hope someone can take a look at it. func updateCustomerProductStatus() async { var activeSubscription: String? = nil // BUG: In some cases the currentEntitlements does not emit a transaction until the device is reboot for await result in Transaction.currentEntitlements { print("Found transaction: \(result)") // This print does not appear until a restart! do { let transaction = try checkVerified(result) // Skip revoked transactions if transaction.revocationDate != nil { print("Skipping revoked transaction for \(transaction.productID)") continue } // Skip expired subscriptions if let expirationDate = transaction.expirationDate, expirationDate < Date() { print("Skipping expired subscription for \(transaction.productID)") continue } // Check product type switch transaction.productType { case .autoRenewable: activeSubscription = transaction.productID default: break } } catch { print("Unable to verify transaction: \(error)") } } // Update state once after processing all entitlements self.activeSubscription = activeSubscription print("updateCustomerProductStatus() activeSubscription: \(activeSubscription ?? "nil")") } There is some unexpected behavior where the currentEntitlements does not emit a result until the iPhone device is reboot. This bug appeared in iOS 26.4 (and in the betas).
Replies
2
Boosts
2
Views
441
Activity
1w
xcodebuild test (CLI) does not sync .storekit to storekitd on iOS 26.5 — SKTestSession unusable in CI
On iOS 26.5 simulator runtime, running UI tests via xcodebuild test from the command line does not push the scheme's StoreKitConfigurationFileReference to the destination simulator's storekitd AppGroup Octane container. As a consequence, SKTestSession(configurationFileNamed:) either silently falls through to the production App Store (surfacing a "Sign in to Apple Account" SpringBoard alert during paywall tests), or throws SKInternalErrorDomain Code=3 "Error saving configuration file" if you call any SKTestSession instance method. The same project, same scheme, same .storekit file works correctly when launched via Xcode IDE (Cmd+R / Cmd+U) — which uses DVTDevice.handleStoreKitConfigurationSyncForBundleID:configurationFilePath: via an internal IDELaunchSession XPC path that the public xcodebuild CLI does not invoke. This regression makes StoreKit Test unusable in CI for any project using xcodebuild test or xcodebuild test-without-building against an iOS 26.5 simulator. Environment macOS: 26.x Xcode: 26.4.1 (25E253) iOS Simulator runtime affected: 26.5 iOS Simulator runtime that does not exhibit the bug: 26.1 Test target: XCTest UI tests Test plan: *.xctestplan with "storeKitConfiguration": "MyApp.storekit" in defaultOptions Affected scheme actions: Test (CLI) Not affected: Run, Test (Xcode IDE) Steps to Reproduce Create a SwiftUI iOS app com.example.MyApp. Add a MyApp.storekit with one auto-renewable subscription. Add a UI test target. In the xctestplan: defaultOptions.storeKitConfiguration = "MyApp.storekit". In the UI test base case: private var storeKitSession: SKTestSession? override func setUpWithError() throws { storeKitSession = try SKTestSession(configurationFileNamed: "MyApp") app.launch() } Boot a fresh iOS 26.5 simulator. Run via CLI: xcodebuild test \ -project MyApp.xcodeproj \ -scheme MyApp \ -testPlan MyAppUITests \ -destination "platform=iOS Simulator,name=iPhone 17 Pro" In the test, trigger paywall and call Product.purchase(). Expected Product.purchase() presents the StoreKit Test sheet labeled "[Environment] Xcode". Same behavior as Xcode IDE Cmd+U. Actual Production App Store flow triggers. SpringBoard alert "Sign in to Apple Account" appears. Tests waiting on the "Xcode"-labeled sheet fail with Element does not exist. Evidence The simulator's ~/Library/Developer/CoreSimulator/Devices/<UDID>/data/Containers/Shared/AppGroup/<storekit-AGID>/Documents/Persistence/Octane/com.example.MyApp/Configuration.storekit: Present (≈100 KB) when launched via Xcode IDE. Missing when launched via xcodebuild test CLI on the same simulator UDID. Workarounds Attempted (all fail on iOS 26.5) No-op XCTestCase "warmup" that calls XCUIApplication.launch() + sleep — does not trigger the sync because XCUIApplication.launch() routes through XCTRunner, not IDELaunchSession. Multi-destination xcodebuild test with -parallelize-tests-among-destinations. Manually cp-ing the .storekit file into the AppGroup Octane container — storekitd only loads via the XPC channel. launchctl kickstart -k system/com.apple.storekitd — wipes in-memory state, does not pick up disk file. Only working workaround: open project in Xcode IDE, Cmd+R, wait ~20–30 sec, Cmd+., then Cmd+U. Not viable for CI. Related Open Feedback FB22237318 — SKTestSession instance methods (clearTransactions(), failTransactionsEnabled = true) throw SKInternalErrorDomain Code=3 "Error saving configuration file". Discussion thread: https://developer.apple.com/forums/thread/808030 The iOS 26.5 Release Notes (https://developer.apple.com/documentation/ios-ipados-release-notes/ios-ipados-26_5-release-notes) under StoreKit Test list this issue as resolved in 26.5: "Fixed: SKTestSession may fail to save its configuration file when invoked outside of an Xcode debug session." However, on the public iOS 26.5 simulator runtime the behavior is unchanged — SKTestSession still hits Code=3 on any mutation, and xcodebuild test from CLI still does not sync the .storekit configuration. The 26.5 fix either did not actually ship, or this report describes a distinct but related issue that the fix did not cover. Impact Any CI/CD pipeline running UI tests for apps with StoreKit subscriptions is broken when targeting an iOS 26.5 simulator. Workarounds are either: Pin CI simulator runtime to iOS 26.1. Manually run the project in Xcode IDE before each test run (impossible headless). Has anyone found a CLI-friendly workaround? Or is there an undocumented xcodebuild flag / simctl command that can trigger the same DVTDevice sync from outside the IDE?
Replies
5
Boosts
2
Views
562
Activity
1w
Is SKTestSession available for Swift Package tests?
I'm trying to test my StoreKit package using local "Consumable.storekit" configuration added to test target as a .copy() resource. I receive various errors. On purchase attempts I receive StoreKitError.unknown. In the console I see this diagnostic messages: [SKTestSession] Error saving configuration file: Error Domain=SKInternalErrorDomain Code=3 "(null)" [SKTestSession] Error setting value to 1 for identifier 2 for com.apple.dt.xctest.tool: Error Domain=SKInternalErrorDomain Code=3 "(null)" I these last two cases product loading failed. It feels like session require mutable .storekit file? Also, some people mention that Host Application must be selected, but it's related to Xcode projects. What is the correct way to test StoreKit within a Swift Package?
Replies
1
Boosts
0
Views
89
Activity
1w
Sandbox testing - Clear Purchase History
Hi, Overview I have an app for which I have created a sandbox account. When I try to clear purchase history it doesn't work, it still shows the in-app purchase items (non-consumable in-app purchases) as purchased. I have tied tried the following ways, but none of them work. Any help on this would be much appreciated! Attempt 1: Go to https://appstoreconnect.apple.com/ Users and Access > Sandbox Check sandbox account > Tap Clear Purchase History button Attempt 2: Go to the iPhone > Settings > Developer > Sandbox Apple Account Tap on account > Manage > Clear Purchase History Attempt 3: Sign out of Sandbox account and sign back in Attempt 4: Delete app and re-run app from Xcode
Replies
2
Boosts
2
Views
258
Activity
2w
IAP and Subscriptions
I would like to explain the current situation regarding our subscriptions and ask a few clarification questions to ensure that our implementation fully complies with App Store requirements. Current Status We have successfully configured our subscriptions in App Store Connect. All subscription products currently appear as “Waiting for Review.” Paid Apps Agreement has been accepted and is active. Banking and tax information are completed and active. RevenueCat integration is working correctly. In TestFlight, the app is now able to: Fetch products successfully Display localized Turkish pricing Open the native Apple purchase sheet Start sandbox purchase flow successfully We can now see Apple’s native TestFlight subscription purchase popup with the correct products and prices, which indicates that StoreKit communication is functioning correctly. However, we are still confused about the review/submission relationship between: The app version submission The first subscription review Existing “Waiting for Review” subscription states Questions Since the subscriptions already show “Waiting for Review,” does this mean they are correctly attached to the currently reviewed app version? Or do we still need to create an entirely new app version submission and manually re-add all subscriptions from the “In-App Purchases and Subscriptions” section before review can continue? The subscriptions are already accessible in TestFlight sandbox purchase flow. Does this confirm that our StoreKit configuration is now technically valid for review? If there is still a configuration issue on our side, could you please clarify exactly which step is missing: attaching subscriptions to a specific binary, submitting the first subscription with a new app version, or another App Store Connect configuration requirement? Our goal is to fully comply with App Store policies and avoid submitting another incorrect review build.
Replies
1
Boosts
0
Views
258
Activity
2w
StoreKit Product Retrieval Issue During App Review
Hello, We are experiencing the exact same behavior described in the following Apple Developer Forum thread: https://developer.apple.com/forums/thread/827016 The issue appears to be isolated to the App Review environment and matches our current rejection under Guideline 2.1 - Performance. On our side, the subscription system is functioning correctly and consistently in TestFlight using the exact same build that was reviewed. We tested on multiple physical devices using Sandbox tester accounts and confirmed that: StoreKit successfully returns all subscription products RevenueCat offerings load correctly Localized pricing is displayed properly Purchases complete successfully Restore purchases also work as expected However, during App Review, the review notes indicate that the product list is empty, which causes the paywall to fail loading. We would like to emphasize that: The In-App Purchases are attached to the submitted app version Product identifiers exactly match between App Store Connect and the application code Agreements, tax, and banking information are active The products are marked as available for sale The same binary works correctly in TestFlight Because the issue cannot be reproduced outside the review environment, we currently have no reliable way to diagnose or validate a permanent fix. At this point, we suspect there may be an intermittent StoreKit product retrieval issue affecting the App Review environment specifically. If possible, could you please: Verify whether StoreKit product retrieval is functioning correctly in the review sandbox environment Share any diagnostic logs related to the failed product request Confirm whether the review device successfully connects to App Store sandbox services Provide any additional guidance for reproducing the App Review behavior locally We are fully committed to resolving the issue and ensuring compliance with App Store requirements, but currently the behavior appears environment-specific and non-reproducible from our side. Thank you very much for your assistance and support. Best regards, Mert Akgün
Replies
0
Boosts
0
Views
100
Activity
2w
React Native IAP: getProducts returns empty array in TestFlight despite complete configuration
Hi everyone, I’m currently developing an iOS app using React Native and implementing consumable In-App Purchases (IAP). I'm facing an issue where getProducts returns an empty array without any error messages when testing on a TestFlight build. I have already completed the following setup: Agreements, Tax, and Banking: All forms are signed and the status is "Active" in App Store Connect. Product Configuration: The Consumable product is created in App Store Connect with the status "Ready to Submit". App Store Connect Integration: The product is correctly linked under the "In-App Purchases and Subscriptions" section of the App version. Xcode Capability: The "In-App Purchase" capability has been added to the project. Implementation: The Product ID in my React Native code (using react-native-iap) matches the ID in App Store Connect exactly. Despite these steps, the product list remains empty. Are there any hidden requirements or specific configurations for TestFlight that I might have missed? Any guidance would be greatly appreciated. Thanks!
Replies
1
Boosts
0
Views
371
Activity
3w
IAP rejected under 2.1(b) "failed to load" — products work in Sandbox/TestFlight but fail in App Review
I'm getting repeatedly rejected under Guideline 2.1(b) - App Completeness, with the message that the in-app purchase products "failed to load." This has happened on multiple submissions now, and I'm stuck because everything works fine on my end. My setup: 2 auto-renewable subscriptions + 1 in-app purchase, all in "Waiting for Review" status and attached to the current version (1.0.0). All three products load and purchase successfully when I test via TestFlight with a Sandbox account. No errors at all. Paid Apps Agreement, banking, and tax forms are all Active. I have another app on the same account where IAPs are live and working, so I don't think it's an account/agreement issue. Review device was iPad Air 11-inch (M3), iPadOS 26.5. One detail that might be relevant: this account was migrated from an individual to an organization account a while back, and there were some app transfers involved on the account (though not for this specific app). What I've already tried/confirmed: Product IDs in code match App Store Connect exactly. Products are attached to the build (there's no separate section to re-attach them on resubmit, which I understand means they're already linked). Resubmitted multiple times with the same result. My questions: Has anyone seen IAPs load fine in Sandbox/TestFlight but consistently fail in App Review specifically? What was the root cause? Could the individual-to-organization migration or prior app transfers cause IAPs to fail loading only in the review environment, even when agreements show Active? Is there anything region/storefront-specific that would make SKProductsRequest / Product.products(for:) return an empty list for the reviewer but not for me? Any pointers would be hugely appreciated. Thanks!
Replies
0
Boosts
1
Views
103
Activity
3w
App rejected under 3.1.1: Reviewer mistook native iOS StoreKit prompt for a custom password field
Hello everyone, I'm facing a very frustrating situation with App Review for my indie app, CoffeePomodoro, and I'm hoping someone here or an Apple engineer can help shed some light on how to escalate and resolve this. My recent update (Version 1.3.1, Submission ID: 59763b52-7c14-4b27-a2cf-2799d2bafe35) was rejected under Guideline 3.1.1 - In-App Purchase. The rejection message states: "We found that the app includes a feature to restore previously purchased In-App Purchase products by entering the user's Apple Account and password. However, In-App Purchases cannot be restored in this manner." The Reality: There is absolutely zero custom UI, form, or TextField in my app that asks for an Apple ID or password. When a user taps "Restore Purchases", the app simply calls Purchases.shared.restorePurchases() via the RevenueCat SDK, which directly wraps Apple's native SKPaymentQueue.restoreCompletedTransactions(). The credential prompt the reviewer saw is the native iOS system-level authentication dialog that appears automatically in the sandbox/TestFlight environment. This usually happens if the device or simulator being used for the review doesn't have an active Sandbox Apple ID already logged in. I have explained this in the App Store Connect Resolution Center. I provided screen recordings showing it's the system dialog, and I attached code snippets proving the app only calls native APIs. Unfortunately, my explanations seem to be ignored, and I keep facing the same roadblock. It feels like the reviewers are mistaking their own OS's native prompt for a custom credential-harvesting screen. Meanwhile, my users are waiting for this update to resolve their subscription issues, and I am stuck in a rejection loop for using Apple's own native API exactly as intended. Has anyone else experienced this specific misunderstanding by the review team? How can I escalate this so someone actually reviews the screen recording and code snippets I provided? Thank you for your time.
Replies
3
Boosts
0
Views
229
Activity
May ’26
StoreKit testing not working on iOS26.5 simulator
Hi, I'm trying to run our StoreKit unit tests with Xcode26.5 on an iOS26.5 simulator. Host computer has macOS26.5. All tests are failing and in the console I see logs such as [SKTestSession] Error saving configuration file: Error Domain=SKInternalErrorDomain Code=3 "(null)" [SKTestSession] Error deleting all transactions: Error Domain=SKInternalErrorDomain Code=3 "(null)" [SKTestSession] Error clearing overrides: Error Domain=SKInternalErrorDomain Code=3 "(null)" [SKTestSession] Error setting value to 1 for identifier 2 for jp.unext.mediaplayer: Error Domain=SKInternalErrorDomain Code=3 "(null)" And the simulator asks me to provide my AppleID. Tests have been broken since at least 26.4 The release notes claims that it has been fixed but not for me. https://developer.apple.com/documentation/ios-ipados-release-notes/ios-ipados-26_5-release-notes#StoreKit-Testing-in-Xcode Does anyone else have the same issue? Reported FB22774836 just in case.
Replies
6
Boosts
9
Views
630
Activity
May ’26
When user goes to Settings>Their name>Subscriptions and wanna cancel the app, a "Don't go" widget is shown - is this a win back offer or a promotional offer?
When i went on to try to cancel some app's subscription, I saw this. I wanna implement the same thing for my app, but there is literally zero information online or in any docs whether this is a win-back offer, a promotional offer, or something else. And if it is a win-back offer, how to test it?
Replies
1
Boosts
0
Views
196
Activity
May ’26
StoreKit 2 returns empty products array on device (iPhone) even though IAP is Ready to Submit
Hi, I’m experiencing an issue with StoreKit 2 in my iOS app where Product.products(for:) always returns an empty array on a real iPhone device. iOS: 26 Device: iPhone 16 pro Max Xcode: 26.5 StoreKit: StoreKit 2
Replies
0
Boosts
0
Views
201
Activity
May ’26
Promoted In-App Purchase not loading during App Review: “Donation product is not available yet”
Hello Apple Developer Community, My iOS app was rejected during App Review because the promoted In-App Purchase donation product showed this error: “Donation product is not available yet” App Review details: Device: iPad Air 11-inch (M3) OS: iPadOS 26.4.2 Internet connection: Active Last reviewed build: 1.0.0 (1) App is iPhone only In-App Purchase type: Consumable donation product The app uses StoreKit to load the donation product from App Store Connect. On my side, the product is configured in App Store Connect and works during testing, but App Review reported that the product was not available when they tested it. I would like to confirm the correct setup for a promoted In-App Purchase / donation product before resubmitting the app. Questions: My In-App Purchase product, which is added under In-App Purchase Information in App Store Connect, is currently showing the status “Waiting for Review” while my app build has been submitted for review. Could this be the reason my app is showing the following StoreKit error? “Check the local StoreKit configuration or App Store Connect setup for com.xxxxxxxxx.xxx.xxxx.” I would like to confirm whether an IAP product that is still “Waiting for Review” can be loaded by App Review during testing, or whether it must be approved together with the app before StoreKit can return the product successfully. The product ID in my app matches the product ID in App Store Connect, and the app uses StoreKit to load the product. Can App Review test a promoted In-App Purchase before the app itself is approved? Is there any delay after creating or editing an In-App Purchase before it becomes available to App Review? For an iPhone-only app reviewed on iPad, can this affect StoreKit product loading or promoted In-App Purchase availability? Any guidance on the correct App Store Connect setup would be appreciated. Thank you.
Replies
1
Boosts
0
Views
203
Activity
May ’26
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
384
Activity
Apr ’26
Xcode 26 beta 3: StoreKit Testing broken
It seems that beta 3 broke StoreKit Testing when running against an iOS 26 simulator device. Specifically, when validating product IDs, the debug console displays messages like the following: [492a4cfa_SK1] Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.price], expected: StoreKit.BackingValue) [492a4cfa_SK1] Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.price], expected: StoreKit.BackingValue) [492a4cfa_SK1] Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.price], expected: StoreKit.BackingValue) [492a4cfa_SK1] Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.price], expected: StoreKit.BackingValue) [492a4cfa_SK1] Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.price], expected: StoreKit.BackingValue) [492a4cfa_SK1] Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.price], expected: StoreKit.BackingValue) [492a4cfa_SK1] Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.price], expected: StoreKit.BackingValue) [492a4cfa_SK1] Could not parse product: missingValue(for: [StoreKit.ProductResponse.Key.price], expected: StoreKit.BackingValue) In addition, the SKProductsResponse (I am using the original StoreKit API), lists all requested product IDs in invalidProductIdentifiers. The products array is empty. StoreKit Testing behaves as expected when Xcode 26 beta 3 is run against an iOS 18.4 simulator device.
Replies
5
Boosts
0
Views
594
Activity
Apr ’26
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
175
Activity
Apr ’26