The majority of our sandbox calls to verifyReceipt end in an ETIMEDOUT error. This is making it very difficult to verify our purchase flow for our pending release. We have not yet migrated to StoreKit 2 and still rely on this API endpoint.
The Apple API status page reports no issues.
Is anyone else encountering this?
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
iOS Storekit2 Appstore production environment, some user feedback in app purchase faliure, What our log records is StoreKitError.unknown,please How to solve problem, thanks
I have an Expo React Native application and I am using react-native-iap library. I have setup the URL for sandbox and production url to receive notifications when a something happens regarding subscriptions. I am not able to receive those notifications when I simulate the purchase on the Simulator using Xcode.
I then have used the node library app-store-server-library to mock a test notification and I am receiving the test notification when I call requestTestNotification method.
below is the react-native code I am using:
import {useEffect, useState} from "react";
import {
initConnection,
Sku,
Subscription,
useIAP,
SubscriptionIOS,
requestSubscription,
PurchaseError,
clearTransactionIOS
} from "react-native-iap";
import styles from "@/screens/IAP/IAPStyles";
import CustomText from "@/components/CustomText";
import Heading from "@/components/Heading";
import subscriptionsProducts from "@/utilities/products";
function IAPScreen() {
const [isPurchasing, setIsPurchasing] = useState<boolean>(false);
const [loading, setLoading] = useState<boolean>(false);
const { subscriptions, currentPurchase, finishTransaction, getSubscriptions } = useIAP();
function RenderProduct({ item } : { item: Subscription }) {
const iosSubscription: SubscriptionIOS = item as SubscriptionIOS;
return(
<View style={styles.productCard}>
<CustomText
customStyles={styles.productTitle}
text={iosSubscription.title}
size={"medium"}
/>
<CustomText
customStyles={styles.productDescription}
text={iosSubscription.description}
size={"small"}
/>
<CustomText
customStyles={styles.productPrice}
text={iosSubscription.localizedPrice}
size={"small"}
/>
<Button
title="Purchase"
disabled={isPurchasing}
onPress={
() => HandlePurchase(iosSubscription.productId)
}
/>
</View>
);
}
async function HandlePurchase(sku: Sku) {
try {
setIsPurchasing(true);
await requestSubscription({
sku,
andDangerouslyFinishTransactionAutomaticallyIOS: false
});
}
catch (error: any) {
Alert.alert("Error", "Failed to purchase: " + error.message);
}
finally {
setIsPurchasing(false);
}
}
useEffect(() => {
setLoading(true);
console.log(`[${new Date().toISOString()}] Initializing IAP connection...`);
const setupIAP = async () => {
try {
const result = await initConnection();
console.log(`[${new Date().toISOString()}] IAP connection initialized:`, result);
await clearTransactionIOS();
await getSubscriptions({
skus: subscriptionsProducts
});
}
catch (error: any) {
Alert.alert("Error", "Failed to load products: " + error.message);
}
finally {
setLoading(false);
}
};
setupIAP()
.finally(() => setLoading(false));
}, []);
useEffect(() => {
const checkCurrentPurchase = async () => {
try {
if(currentPurchase?.productId) {
console.log("Current purchase: ", currentPurchase);
console.log("Transaction Id: ", currentPurchase.transactionId);
await finishTransaction({
purchase: currentPurchase,
isConsumable: false,
});
}
}
catch (error) {
if(error instanceof PurchaseError) {
console.log("Purchase error: ", error);
}
else {
Alert.alert("Error", "Failed to finish transaction: " + error);
}
}
}
if(currentPurchase) {
console.log("Finishing current purchase.");
checkCurrentPurchase()
.catch(error => Alert.alert("Error", "Failed to finish transaction: " + error.message));
}
}, [currentPurchase, finishTransaction]);
return(
<View style={styles.mainContainer}>
<Heading
text={"Packages & Subscriptions"}
type={"h2"}
customStyles={styles.header}
/>
{
loading ?
<ActivityIndicator size="large" /> :
subscriptions.length > 0 ?
(
<>
<FlatList
data={subscriptions}
renderItem={RenderProduct}
keyExtractor={(item) => item.productId}
/>
</>
) :
(
<CustomText
customStyles={styles.productDescription}
text={"No available products."}
size={"small"}
/>
)
}
</View>
);
}
export default IAPScreen;
I am using a store kit file where I just edited the scheme of application to use that store kit file.
I would be really thankful If you can help me in this matter.
Product.SubscriptionInfo.isEligibleForIntroOffer(for: "21340582")
In the production environment, I have already used the intro offer for this group, but this method still returns true
Hello Developer support, In one of our live application we have seen that users are purchasing weekly subscription and automatically they shifted to yearly product. Due to this we have received high revenue and also refunds afterwards. To prevent this we removed our yearly product from the sale. In App Store Connect we have seen activations for weekly product and convert to standard prices are yearly products. Also we have seen weird behavior of user getting trial for same product for three times. For developer support people I am sharing my app id - 1320373866 , and here is the video of our issue - https://drive.google.com/file/d/1DBHw8ivgql4eNoo8NC3xo5v4wgr8Oh7x/view?usp=sharing , Also attaching trial behavior screenshot.
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
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.
I am currently using StoreKit2 to set up the in-app purchase subscription flow, and I have already configured the subscription products in App Connect. I created a StoreKit Configuration file in Xcode and used it in the scheme. However, after completing the purchase, the transaction.jsonRepresentation data returns a transactionId of 0. After checking the documentation, I found that I need to disable the StoreKit Configuration and enable Sandbox Testing. But after disabling the StoreKit Configuration, I can't retrieve the real product data using Product.products(for: productIds). I can confirm that the ProductId I provided is real and matches the data configured in App Connect. Could you please help me identify the issue? Thank you
Topic:
App & System Services
SubTopic:
StoreKit
Tags:
Subscriptions
Developer Tools
StoreKit Test
StoreKit
iOS Storekit2 Appstore production environment, some user feedback in app purchase faliure, What our log records is StoreKitError.unknown,please How to solve problem, thanks
Product.SubscriptionInfo.isEligibleForIntroOffer(for: "21340582")
In the production environment, I have already used the intro offer for this group, but this method still returns true.
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.
Some of my users reported they can not completed the purchase .
According to the logs and screen captures . Their purchase progress's last status are "purchasing"
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
....
....
case .purchasing:
// 处理正在购买的情况
//print("购买中");
AppDelegate.log.debug("paymentQueue purchasing");
LoadingAlert.shared.setText(text: "购买中".localized())
....
After this ,It neither entered any error branch nor prompted the user to confirm the purchase or enter a password, but simply stopped here. There are no other purchase-related logs, and the program is still running normally.
At the same time, other users are able to complete their purchases without any issues. However, there have been 4-5 users recently who reported problems with purchasing. What could be the possible reasons?
In my local environment, I repeated the test many times, including using sandbox users from different regions and real Apple IDs, and everything worked fine.
//
// Payment.swift
// RadialMenu
//
// Created by pat on 2023/6/26.
//
import Foundation
import StoreKit
class Payment:NSObject,SKProductsRequestDelegate,SKPaymentTransactionObserver{
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
AppDelegate.log.debug("paymentQueue transaction product = \(transaction.payment.productIdentifier) state = \(transaction.transactionState)");
//let productID = transaction.payment.productIdentifier
switch transaction.transactionState {
case .purchased,.restored:
if(transaction.transactionState == .purchased){
AppDelegate.log.debug("paymentQueue purchased");
LoadingAlert.shared.setText(text: "已购买".localized())
}
if(transaction.transactionState == .restored){
LoadingAlert.shared.setText(text: "已恢复".localized())
AppDelegate.log.debug("paymentQueue restored");
}
//}
break;
case .failed:
AppDelegate.log.debug("paymentQueue failed ");
if let error = transaction.error as? NSError {
// 获取错误代码和描述
let errorCode = error.code
let errorDescription = error.localizedDescription
AppDelegate.log.debug("paymentQueue Transaction failed with error code: \(errorCode), description: \(errorDescription)")
}
queue.finishTransaction(transaction)
LoadingAlert.shared.hideModal();
// 处理购买失败的情况
// 提供错误信息给用户
//print("购买失败");
alertRetry();
break;
case .deferred:
AppDelegate.log.debug("paymentQueue deferred");
LoadingAlert.shared.setText(text: "购买延迟".localized())
// 处理交易延迟的情况(仅限家庭共享)
break;
case .purchasing:
// 处理正在购买的情况
//print("购买中");
AppDelegate.log.debug("paymentQueue purchasing");
LoadingAlert.shared.setText(text: "购买中".localized())
break;
@unknown default:
AppDelegate.log.debug("paymentQueue nknown default\(transaction.transactionState)");
break
}
}
}
I set both production and sandbox App Store Notification server.
In sandbox, my server can receive all kinds of app store notification, including subscription and non-consumable in-app-purchase.
But in production, my server only receive subscription notification.
I can see some non-consumable in-app-purchase done in log, but the server didn't receive expected notification.
Anyone know why?
I really need the notification cause I need to know who made refund.
We’ve recently observed an escalating number of complaints from AlipayHK users regarding duplicate charges when completing transactions via Apple Pay. While no similar issues have been reported by users of other credit card providers integrated with Apple Pay, the problem appears isolated to AlipayHK transactions.
Key Details:
Multiple users confirm being charged twice for single transactions.
Complaints are increasing in frequency, indicating a potential systemic issue.
No overlapping reports from non-AlipayHK payment methods at this time.
To safeguard customer trust and ensure seamless payment experiences, we kindly request Apple’s support in:
Investigating whether the root cause stems from Apple Pay’s transaction handling.
Collaborating with AlipayHK (if necessary) to resolve the issue promptly.
Providing guidance on interim measures to prevent further duplicate charges.
Could Apple confirm if this is a known issue and share a timeline for resolution? We’re eager to assist in any way possible to mitigate impact on users.
Thank you for your urgent attention to this matter.
Topic:
App & System Services
SubTopic:
StoreKit
Sorry but I'm not good at English.
Is the originalTransactionId received for the same subscription by the same user the same in Store Kit v1 and Store Kit 2?
Also, will the originalTransactionId be the same even if the subscription price is changed?
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?
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!
For Apple subscription payments, my server does not receive notifications for production environment payments, but it can receive notifications for sandbox payments at the same notification address.
Hi,
I'm new to AppStore Connect, and I'm learning how subscriptions work.
I'm finalizing my first app, but on my TF, I'm having some issues with the price: it's always displayed in US dollars on my paywall. When I tap "subscribe," the Apple sheet correctly offers the price in euros.
I'm using Product.displayPrice to display the price in my paywall. The documentation did mention it is
The localized string representation of the product price, suitable for display.
So, is it normal in my case for the price in dollars to be displayed and not the price in euros like the Apple sheet?
Thank you in advance for your help.
We are considering a price change for the auto-renewing subscriptions we currently offer in a Production environment and have made system modifications to our servers.
We would like to implement a price change for purchases made through our SANDBOX Apple account in order to test if our system is capable of handling the price change.