For years I've been using Receigen for receipt verification for the Mac App Store build of my application. However, with the deprecation of exit code 173, I am moving to StoreKit-based verification and have a couple of questions.
I have followed the instructions from https://developer.apple.com/documentation/storekit/apptransaction/shared and have something like this (simplified):
Swift:
@objc class ValidateReceipt: NSObject {
@objc func validate() async -> Bool {
do {
let verificationResult = try await AppTransaction.shared
switch verificationResult {
case .verified(_ /*let appTransaction*/):
// StoreKit verified that the user purchased this app and
// the properties in the AppTransaction instance
return true;
default:
// The app transaction didn't pass StoreKit's verification
return false;
}
}
catch {
// Handle errors
return false;
}
}
}
Objective-C:
ValidateReceipt *validateReceipt = [[ValidateReceipt alloc] init];
[validateReceipt validateWithCompletionHandler:^(BOOL result) {
if (result)
{
// Successful app purchase validation
}
else
{
// App purchase validation failure
}
}];
Thing is, I always get a valid result, i.e., in ValidReceipt.validate(), the case .verified block always runs. Even when exporting a new release build of my app and running it (without any _MASReceipt).
When using exit code 173, an .app without a _MASReceipt would prompt for app store login. Nothing of the sort happens now.
Am I misunderstanding the documentation / doing something wrong / missing something obvious?
StoreKit
RSS for tagSupport in-app purchases and interactions with the App Store using StoreKit.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Product Timeout, In App purchase is approved in App Store Connect. The Product ID and Bundle ID match.
Environment
macOS App in TestFlight
Bundle ID: com.streamtime.StreamTime
App Version: 1.1 (Build 51)
StoreKit 2
Product ID: com.streamtime.premium
Status: App & Subscription Approved
Issue
StoreKit product request (Product.products(for:)) consistently times out after 60 seconds in TestFlight, despite all connectivity checks passing. The same code works perfectly in Xcode with local StoreKit configuration.
Diagnostic Results
✅ Successful checks:
App Store connectivity (HTTP 200 from buy.itunes.apple.com)
Backend API connectivity (HTTP 200)
StoreKit 2 API available
AppStore.canMakePayments: true
Valid receipt exists
Bundle ID matches
Product ID matches approved subscription
❌ Failing:
Product request times out after 60 seconds
No products returned
Code Implementation
// Direct product request (fails in TestFlight)
let products = try await Product.products(for: ["com.streamtime.premium"])
Logs
🔍 App Bundle ID: com.streamtime.StreamTime
🔍 Product ID: com.streamtime.premium
🔍 AppStore.canMakePayments: true
🔍 Apple Store connectivity: HTTP 200
🔵 Direct request for product ID: 'com.streamtime.premium'
⏱️ Direct request start time: 2025-08-30 10:21:32 +0000
❌ TIMEOUT: Product request took longer than 60 seconds
What I've Tried
Removed manual in-app-purchase entitlement (per Apple's guidance)
Using automatic signing
Verified subscription is approved in App Store Connect
Using Sandbox Apple ID in TestFlight
Verified all network connectivity
Questions
Why does StoreKit timeout only in TestFlight when all other connectivity works?
Are there additional configuration steps needed for macOS apps vs iOS?
Could this be related to the automatic in-app purchase entitlement?
Any guidance would be greatly appreciated as this is blocking our TestFlight validation.
Topic:
App & System Services
SubTopic:
StoreKit
hi, when i test an in app purchase with my sandbox acount i get:
"ask permission. a request to buy ** will be sent to your parent or gardian
(environment: sandbox)"
When i made the sandbox account, i didnt see any option to set my age. What am i missing here, I dont seem to be able to fully test in app purchases since my sandbox accounts always defualt to this family sharing thing?
Thanks
Topic:
App & System Services
SubTopic:
StoreKit
Could you tell me about the specifications of the winback offer?
If a user is eligible for the winback offer, will the winback offer sheet be displayed every time the app is launched?
Or will the OS adjust the display frequency in some way?
Topic:
App & System Services
SubTopic:
StoreKit
hello,
I have an app with In-App purchase set up, it works fine in TestFlight on an iOS device but the download from the App Store gives me a transaction failed message.
I tried to replicate in the simulator but from what I've read is that you can't do in-app purchase testing in the simulator. Perhaps I'm wrong here but I've tried multiple sandbox accounts, etc.. and still get an unusual "...password can't be reused..." error (pasted below) in the debug description.
I'm curious if anyone else has dealt with this scenario and if so how did you go about researching/identifying the issue and/or resolving it.
Partial error message:
<SKPaymentQueue: 0x60000000e370>: Payment completed with error: Error Domain=ASDErrorDomain Code=530 "(null)" UserInfo={NSUnderlyingError=0x600000c74750 {Error Domain=AMSErrorDomain Code=100 "Authentication Failed The authentication failed." UserInfo={NSMultipleUnderlyingErrorsKey=(
"Error Domain=AMSErrorDomain Code=2 "Password reuse not available for account The account state does not support password reuse." UserInfo={NSDebugDescription=Password reuse not available for account The account state does not support password reuse., AMSDescription=Password reuse not available for account, AMSFailureReason=The account state does not support password reuse.}"
Hi everyone,
After updating to Xcode 16.4, my StoreKit configuration stopped working.
Whenever I run the app with a .storekit file set as the active scheme, I immediately get this alert:
“The file has been changed. Do you want to save your changes or revert to the file on disk?”
No matter if I choose Save Anyway or Revert, StoreKit testing does not work - the purchases are not simulated, and the scheme is basically broken.
This issue didn’t exist in Xcode 15.4 - the same StoreKit configuration file works fine there.
What I tried so far:
Clearing Derived Data - no effect
Making sure no scripts/tools modify the .storekit file - still happens
Restarting Xcode and macOS - no change
Environment:
Xcode 16.4
Happens in both Simulator and on device
Reproducible 100%
Has anyone else seen this in 16.4? Any known workarounds until Apple fixes it?
Thanks!
When submitting an app for review, will any unreviewed auto-renewing subscriptions within the app be reviewed simultaneously?
I own an app that has passed review and offers an auto-renewing subscription A within the app that has also passed review.
To test a new service, I plan to create a new auto-renewing subscription B, which I do not intend to submit for review.
After creating Subscription B, I plan to submit the app for review as part of an app update.
In that case, is there a possibility that Subscription B will also be reviewed?
I have an iOS app with a main target and an app extension. I want the app extension to write data to the SwiftData in App Groups, while the main target reads the data. However, currently, the app extension only has permission to read data, not to write it.Is the issue due to my incorrect configuration or an Apple-imposed restriction?
One of our customers subscribed to a monthly plan on August 16 but the server-to-server notification seems to have been sent on August 18.
What could be the reasons for such a delay between the purchase and the server-to-server notification which are usually sent right after the purchase?
The receipt sent along with the notification seems to confirm that the receipt has only been created 2 days after the purchase. Here is an extract:
{
"environment": "Production",
"receipt": {
"receipt_type": "Production",
"bundle_id": "fr.gaumontvideo.gaumontclassique",
"application_version": "613",
"receipt_creation_date": "2025-08-18 13:00:16 Etc/GMT",
"receipt_creation_date_ms": "1755522016000",
"receipt_creation_date_pst": "2025-08-18 06:00:16 America/Los_Angeles",
"request_date": "2025-08-25 13:08:27 Etc/GMT",
"request_date_ms": "1756127307346",
"request_date_pst": "2025-08-25 06:08:27 America/Los_Angeles",
"original_purchase_date": "2022-05-11 06:14:37 Etc/GMT",
"original_purchase_date_ms": "1652249677000",
"original_purchase_date_pst": "2022-05-10 23:14:37 America/Los_Angeles",
"original_application_version": "265",
"in_app": [
{
"quantity": "1",
"product_id": "fr.gaumontvideo.gaumontclassique.subscription.monthly.apple",
"transaction_id": "270002386706194",
"original_transaction_id": "270002386706194",
"purchase_date": "2025-08-16 08:02:06 Etc/GMT",
"purchase_date_ms": "1755331326000",
"purchase_date_pst": "2025-08-16 01:02:06 America/Los_Angeles",
"original_purchase_date": "2025-08-16 08:02:08 Etc/GMT",
"original_purchase_date_ms": "1755331328000",
"original_purchase_date_pst": "2025-08-16 01:02:08 America/Los_Angeles",
"expires_date": "2025-09-16 08:02:06 Etc/GMT",
"expires_date_ms": "1758009726000",
"expires_date_pst": "2025-09-16 01:02:06 America/Los_Angeles"
}
}
Hi,
This is the first time I'm submitting an app using IAP with auto-renewing subscriptions. Everything keeps getting rejected (specifically, my subscriptions), and instead of telling me what's wrong or what I need to fix, my reviewer just keeps regurgitating generic passages from the rules.
Is there a site/tutorial/whatever that explains how to set these up and submit them? I haven't found anything that looks official/legit, so I'll settle on something recommended by someone who has been through the process.
I would appreciate any help. I have been at this for DAYS and am at my wits end.
Thanks.
Hi everyone,
After my app was initially rejected, all my IAPs now show the status “Developer Action Needed.” There’s nothing I need to change on them — they were just returned because it was the first submission and the app itself was rejected.
Do I need to do anything with the IAPs before I resubmit, or will they still be attached and reviewed automatically with the next binary? I’ve seen conflicting answers, so I’d like to confirm the correct process.
Thanks,
Cris
Hello!
We are tryign to test refund notifications and we've implemented a debug button trigger the refund of a purchase done with a sandbox account. The problem is that the refund view displays a Cannot Connect message and nothing happens. No error messages appear in the console. Anything we are doing wrong?
I am experiencing an issue with my iOS app where StoreKit 2 in-app subscriptions are not appearing when using Product.products(for:). I have done all the necessary configurations, but the products still return an empty array ([]).
Here are the details of my setup:
• App ID / Bundle ID: com.tstore.vocabely
• Product IDs:
• com.tstore.vocabely.base
• com.tstore.vocabely.pro
• com.tstore.vocabely.ultimate
• Paid Apps Agreement: Active
• IAP Status in App Store Connect: Ready to Submit / Approved
• Testing Environment:
• Device: iPhone (real device)
• iOS Version: [insert your iOS version]
• Xcode Version: [insert your Xcode version]
• Sandbox Tester Account used
• Code Snippet: Using Product.products(for: productIDs) in StoreKitManager to fetch products
I have verified:
• Product IDs match exactly with App Store Connect
• Paid Apps Agreement is Active
• Using a real device, not a simulator
• Sandbox account is properly signed in
Despite all of this, fetchProducts() still returns an empty array.
Could you please assist me in troubleshooting why my subscriptions are not appearing in the Sandbox environment?
Thank you for your support.
Topic:
App & System Services
SubTopic:
StoreKit
When I added the ExcelIO library to my app and compiled it, the following error occurred:
Framework 'SwiftSpreadsheet' not found
Linker command failed with exit code 1 (use -v to see invocation)
I added the following to my Podfile and installed it, but the error persists. (No errors occurred during pod install.)
platform :ios, '9.0'
Pods for medical_expense
target 'medical_expense' do
Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
pod 'SwiftyTesseract', '~ 2.0'
pod 'SwiftSpreadsheet'
end
Pods for Petty_staff
target 'Petty_staffTests' do
inherit! :search_paths
pod 'ReachabilitySwift'
Pods for testing
end
target 'Petty_staffUITests' do
inherit! :search_paths
Pods for testing
end
Note that "SwiftSpreadsheet" exists in
/Users/ymdakr/MyAppli/Medical_Expense/Pods/Target Support Files/Pods-medical_expense/Pods-medical_expense.debug.xcconfig
and
/Users/ymdakr/MyAppli/Medical_Expense/Pods/Target Support Files/Pods-medical_expense/Pods-medical_expense.release.xcconfig
Only in [Files/Pods-medical_expense/Pods-medical_expense.debug.xcconfig]
What should I do?
Hello, Our app supports family sharing skus, we successfully ran tests on family sharing features in sandbox, we noticed the feature does not work on live builds.
The family member (child account) do see the subscription as "Shared with you". We attempted to restore multiple time and there is nothing to restore.
Topic:
App & System Services
SubTopic:
StoreKit
We distribute apps that offer auto-renewing subscriptions.
In order to test a new service, we would like to create a new subscription group and subscription product (hereinafter referred to as “test subscription”) for this app.
If the “In-app purchase statuses” of the test subscription is “Ready to Submit” is the following behavior correct?
・General end users cannot purchase the test subscription.
・Users with SANDBOX Apple accounts can purchase the test subscription.
I’m seeing an issue with subscriptions in TestFlight builds on iOS 26. Running from Xcode works as expected, and the App Store build looks fine. But when I install the same build via TestFlight, transaction.subscriptionStatus is nil.
The identical binary behaves correctly on an iOS 18 device.
Is this expected behavior on iOS 26 TestFlight, or am I missing something?
Thanks!
I want to build an app for ios using react native. preferably expo.
The app will be for recording user experiences with technology. the SLUDGE that they face while navigating through technology.
I want to have basic login, signup.
The main feature would be to have 2 recording modes.
First is record the screen and the front camera simultaneously.
Second is to record the back camera and the front camera simultaneously.
I can then patch the two outputs later on that is the screen recording and the front camera clip in post processing.
I want to know if this is possible as I was told that react native and expo does not have the support yet. if not is there any library or another approach to make this app come alive.
We’re testing SKAN postbacks via AdAttributionKit but aren’t receiving any requests on our server even after generating development impressions and triggering a postback.
Setup:
Domain: https://linkrunner-skan.com
Configured in Info.plist as:
<key>NSAdvertisingAttributionReportEndpoint</key>
<string>https://linkrunner-skan.com</string>
<key>AttributionCopyEndpoint</key>
<string>https://linkrunner-skan.com</string>
Apple automatically appends the .well-known paths:
/.well-known/private-click-measurement/report-attribution/
/.well-known/skadnetwork/report-attribution/
ATS diagnostics for the domain: PASS for all tests (TLS 1.0–1.3, PFS disabled, arbitrary loads allowed, etc.)
Both .well-known paths are publicly accessible and return 200 OK
Testing Flow:
Enabled Developer → AdAttributionKit Developer Mode on iOS (15+)
Followed Apple’s official guide: Testing AdAttributionKit with Developer Mode
Generated test impression using:
createAdAttributionKitDevelopmentImpression implemented in SKANManager.swift
Called Postback.updateConversionValue with lockPostback: true
Created Development Postback from Developer Settings
Waited 30+ minutes while intercepting server requests (proxy + backend logs)
What We’ve Tried So Far:
Confirmed ATS compliance with nscurl --ats-diagnostics (all PASS)
Verified .well-known paths are accessible publicly without redirects
Tested endpoints manually with a POST request – server responds 200 OK
Confirmed Info.plist entries exactly match Apple’s required keys
Double-checked iOS device is running iOS 15+ with Developer Mode enabled
Repeated test flow multiple times with fresh impressions and postbacks
Waited up to 1 hour for postback (in case of delays)
Issue:
No POST requests are being received from Apple to either .well-known endpoint, even though the setup appears correct and ATS tests pass.
References Used:
Configuring an Advertised App
Generating JWS Impressions
Question:
Has anyone faced a similar issue where AdAttributionKit Development Postbacks are not firing despite correct Info.plist setup, ATS compliance, and reachable .well-known endpoints?
Any insight into possible missing configuration steps or testing nuances would be greatly appreciated.
I have using the internal testflight testers to test the app and IAP everyting is working once i created the Beta link for external testers who all are not able to get the IAP and similarly who all are I added as internal testers after beta link was created they are alos not able to purchase
It was showing in the app as "Unable to process your request" and i am getting the error as followsPurchase did not return a transaction: Error Domain=ASDErrorDomain Code=500 "(null)" UserInfo={NSUnderlyingError=0x28291ebb0 {Error Domain=AMSErrorDomain Code=305 "Purchase Failed" UserInfo={NSLocalizedDescription=Purchase Failed, AMSStatusCode=200, AMSServerPayload={
"cancel-purchase-batch" = 1;
customerMessage = "Unable to process your request.";
dialog = {
defaultButton = ok;
explanation = "Please try again later.";
initialCheckboxValue = 1;
isFree = 1;
"m-allowed" = 0;
message = "Unable to process your request.";
okButtonString = OK;
};
failureType = "";
"m-allowed" = 0;
metrics = {
actionUrl = "sandbox.itunes.apple.com/WebObjects/MZBuy.woa/wa/inAppBuy";
asnState = 0;
dialogId = "MZCommerce.SystemError";
eventType = dialog;
message = "Unable <…>
Topic:
App & System Services
SubTopic:
StoreKit