Looks like I'm getting the error "There's no information available for in app purchases. Try again later. 21102" The purchase starts, gets to in progress but never completes so I cannot grant the user any item in app.
App info:
I made a small test application with a simple purchase button and restore purchase button, the middle button as shown in the video that's clicked is the purchase button to kick off the transaction.
If the service isn't working through the manage>test purchase in appstore>sandbox(not in-app), it is likely not a code issue from my end, it is either internally from your Apple side or a config issue on the apple account application end on my side. Ive tried deleting sandbox testers, new builds, as well as doing it on test flight. Just feel like if its not workig through manage>test purchase in appstore>sandbox then its def not a my problem
Logs:
<SKPaymentQueue: 0x281f4eb40>: Payment completed with error: Error Domain=ASDServerErrorDomain Code=3539 "There’s no information available for In‑App Purchases. Try again later." UserInfo={NSLocalizedFailureReason=There’s no information available for In‑App Purchases. Try again later., AMSServerErrorCode=3539, client-environment-type=Sandbox, storefront-country-code=USA}
Any help would be great, this has been happening for a week now , and apple has been 0 help. Thank you so much for anything here.
StoreKit
RSS for tagSupport in-app purchases and interactions with the App Store using StoreKit.
Posts under StoreKit tag
200 Posts
Sort by:
Post
Replies
Boosts
Views
Activity
Hi,
I'm working on In App Purchase feature for my app. I run my app with XCode and try to buy a consumable product, and then I got a error with the message "There's no information available for In-App Purchases issue. Try again later 21102"
Has anyone else come across this? If so, what was the fix?
Hello,
We are planning to launch in-app purchases to our app with millions of MAUs.
The plan is to sell more than 10,000 products in the future, and we saw that there's a limit to non-consumable products of 10K so we didn't want that to limit us.
Proposed Solution
As a result, we have decided to launch consumable products instead, and manage unlocking the content on the server side once a user has successfully purchased an item. The client will also manage payments that couldn't be confirmed server side by temporary storing information about the product which has been purchased (but not unlocked) so that we can recover gracefully.
The plan is to create numerous consumable products, where each product has a specific price. Thus when a user wants to purchase product A, we will trigger the IAP flow with the consumable apple product which matches the price of product A.
If we offer products from 15 pounds to 100 pounds, we'll be creating non-consumable products:
Product 1: 15.99
Product 2: 16.99
Product 3: 17.99
... etc
So you can think of it as tiering apple products together based on the price. The product in our catalog will not have a one to one mapping with the apple product.
So I have two questions:
Is this okay with Apple's guidelines? Should we expect Apple to block the release?
Is there a limit on the pricing of a consumable product? Can we go above 100 dollars?
I need to implement in-app purchases for my iOS application. For which I need to accept the Paid Applications Agreements but on the App Store Connect "Agreements, Tax and banking" page under agreements tab. I see no agreements. I have already accepted "Apple Developer Program License Agreement"and "Apple Developer Agreement". I have attached the screenshot of my agreements page.
Most of the solutions I have seen online have a table at this page like so. but I see "There are no Agreements."
I should see a table like this one
Here's my apple developer homepage which says that I have accepted two agreements
I am signed-in as the account holder and admin of this account.
Do I need to create a certificate or something?
Hi,
I currently have an introductory offer set up in App Store Connect, which is in the 'Ready to Submit' state. When testing with the StoreKit configuration testing for Xcode, the introductory offer appears correctly, and I can successfully make and cancel purchases. However, when testing on a device without the StoreKit configuration, using a new sandbox account, the introductory offer does not appear, though the introductory price is visible for subscription. Could you advise on how to ensure the introductory offer is displayed in this scenario?
Using Storekit 2
I intend to group together several free-to-play games in a bundle. While these games will be accessible without charge, users will have the option to subscribe (for example, to a VIP club) and make additional purchases for consumable or non-consumable items.
Although I've reviewed Apple's guidelines, I haven't found any information indicating whether it's permissible to offer consumable and non-consumable purchases after users have paid a subscription fee to access all the games in the bundle.
I would appreciate your assistance in clarifying this matter.
If 'requestReview' is unavailable in watchOS, how would you ask for a star review in an Apple Watch only app?
Within Apple's documentation for ratings and reviews, it was stated that the SKStoreReviewController API allows users to "submit a rating through the standardized prompt, and can write and submit a review without leaving the app" however I am unable to see how user is able to leave a review in-app as the prompt appears to request for a rating only.
Would clicking on the 'Submit' button display the option to leave a review in-app without being redirected to the App Store product page?
Please kindly advise, thank you!
I've watched some of the WWDC session videos about this topic and read the documentation and header files, but it is still confusing...
Because I change the pricing model of my iOS App (it was a paid App and now it will be a free App with an In-App purchase), I want to check if a user of my App purchased the App in the past. So user who have already paid in the past will get the full access without the need to pay the IAP, while new users would have to do this.
In one of the WWDC videos exactly this topic was covered and the solution would be to check out AppTransaction.originalAppVersion. This would be a simple and easy solution...
...Unless I read the information from the header file and documentation for this API. Here it says:
The string value contains the original value of the CFBundleShortVersionString for apps running in macOS, and the original value of the CFBundleVersion for apps running on all other platforms.
The problem here is that when I check the Info.plist of iOS Apps, the CFBundleShortVersionString is used for the main App version and CFBundleVersion is used for the "build" number. According to the cited documentation from above, AppTransaction.originalAppVersion would be totally uselesss on the iOS platform, because it would only return the build number and not the version number.
So I'm confused. Can I use AppTransaction.originalAppVersion to get the original version that was purchased for iOS Apps? If yes, the documentation must be wrong and misleading. If no, how can I do this?
I'm currently in testing and I only get "1.0" as originalAppVersion within the beta release. This could be either because I really only get the useless build number, or I get the "real" version because the App is on the device since version "1.0" on my device, or it is just a limitation of XCode while testing that it is returning version "1.0" but would return the correct version when the App was installed from the AppStore....
Can someone bring some light into this topic? Am I missing something or did I understand something wrong?
App Purchase Validation and In-App Purchase Persistence with the older StoreKit APIs is complicated. I’m curious to learn whether the new StoreKit SwiftUI views and .subscriptionStatusTask modifier simplify the process — or ideally eliminates the need to implement complex Validation and persistence logic using AppStorage, Keychain or App Receipts. Any thoughts on this?
Hey, I'm adding in-app purchases to an app. I'm using consumable products and tiering all my products into specific tiers (products A, B, C will be part of tier 1 with a specific price, products D, E, F will be part of tier 2 with another price, etc).
The process of unlocking a given product is handled on the backend. Once a purchase is done via IAP on the app, I'm sending the StoreKit 2 JWS representation of the transaction along with the product so that my server unlocks this product to this user.
Do I need to call Get Transaction History at this point for extra verification?
Also, how do I prevent my app's beta users (who install the app via test flight) from purchasing the products for free (since test flight in app purchases are for free, as they're done via a Sandbox user)?
Calling StoreKit.Transaction.currentEntitlements today just doesn't return. It just sits there.
for await result in StoreKit.Transaction.currentEntitlements {
switch result {
case .verified(let transaction):
currentTransaction = transaction
case .unverified(let transaction, let error):
currentTransaction = transaction
}
}
The for loop never starts.
This is using a Sandboxed user that made a renewal subscription purchase. Everything was working fine yesterday. Nothing on my end has changed since then.
Is something wrong with StoreKit?
Hi,
My iOS app allows a user to perform a rather expensive cloud operation (costs me 10 cents per time) and I want to ensure they can only do it once a day across all of their iOS devices. The marketing will make it clear this is how it will work so users won't be surprised. While most will only have one iPhone in practice, with my subscription pricing I'd lose money the second someone started doing it on a second device.
I could solve this using Sign in with Apple to ensure there is a 1:1 correlation between Apple ID with paid subscription and a user account in my system that I could track usage against but I'd like to avoid users having to sign in at all since it would serve no purpose from a user perspective.
identifierForVendor won't work since it's different across every device the same user has
Is there something in StoreKit v2 receipts or transaction data that would be stable longterm and have the same result across all devices using the same Apple ID? I don't actually want any info about the user, just a stable anonymized identifier to see they are the same user on different devices.
I could also go with a consumable in-app purchase but I don't think users would like this pricing model for this app.
Thanks!
Colin
Trying to debug StoreKit on device using a sandboxed user. When I want to show manageSubscriptionsSheet, the screen flashes but nothing shows.
This is visible in the console:
SKEngagementRemoteViewTask: Presenting system engagement request. Request: {length = 5347, bytes = 0x62706c69 73743030 d4010203 04050607 ... 00000000 000012d7 }
Present engagement request: {length = 5347, bytes = 0x62706c69 73743030 d4010203 04050607 ... 00000000 000012d7 }, clientBundleID: com.acme.myapp
Finished presenting engagement request with view service
There isn't much information in the documentation so I'm not sure if it's me not doing things correctly or a bug in iOS 17.2?
My app contains 2 auto-renew subscriptions, one for monthly and another one for yearly duration.
Is there any way to hide or prevent user to subscribe for period without affecting existing subscribers?
Example case: Temporary prevent user to subscribe Monthly subscription for 2 weeks due to technical problem about premium feature. Existing monthly subscribers renewal is still running normally.
Appreciate for any help! Thank you. 🙏
I am testing an in-app purchase in my app. The app has a multiplatform target with Mac (native, not Catalyst) and iPad destinations. I created a local StoreKit configuration file in Xcode and added an IAP to it. I edited the Xcode scheme to use my local config file. I have the following code to fetch the IAP:
@Published private(set) var products: [Product]
@MainActor
func fetchProducts() async {
let productIdentifiers = ["com.pro_version"]
do {
products = try await Product.products(for: productIdentifiers)
} catch {
print("Failed product request from the App Store server: \(error)")
}
}
When I call this function, the products array is always empty on Mac but is not empty on iOS.
I checked that the product ID for the product in the config file matches the value of the productIdentifiers constant in the code.
What am I missing that is preventing me from fetching the products from my local StoreKit config file on Mac?
Hi IAP Developer:
We have noticed a significant increase in the SKError.Code.missingOfferParams error, which started on October 24, 2023, and has reached up to 2000 occurrences daily.
Moreover, there seems to be a continuous rise compared to the previous day.
This error does not exhibit any distinctive OS version or app version characteristics.
Our server logs confirm that all SKPaymentDiscount-related parameters are intact and have not undergone recent changes.
We would like to inquire whether Apple has made any modifications to the related services or if there is any insight into the potential causes of this issue. We eagerly await your response.
Hi guys,
I want to build a referral program wherein current users are rewarded for inviting friends to join my app/website.
I also wanted to keep the accounts linked so that recruiting users can get rewarded every time a new user they recruited purchases something.
I want to just give the users points, I'm not offering cash or subscription discounts. similar to how game invites work.
through my research into the topic I have found dynamic links with flutter and firebase. deep deferred links, QR code deferred links, and some work around that included taking the user to a website copying the code to their clipboard, then pasting it into a hidden textfield to verify and track the code
can anyone help me get started?
We use store kit original API for in-app purchase,I set a UUID to the SKMutablePayment object applicationUsername property, when finish the payment, In the App Store Server API, the JWSTransactionDecodedPayload object returns no appAccountToken field.This probability is extremely small, about 17 in 100,000.Does anyone have the same situation?
Hi everyone,
I got problem about fetch data IAP Subscription product on sandbox environment.
My project make on Unity and use IAP Unity.
About 2 day ago it still work, but after Apple down some service yesterday then until now I can't fetch my product from Sandbox anymore.
I also check my older version on testflight and still not work, but the production still work fine.
I also check log on Sandox and saw this: "IAPStoreManager failed to initialize. Reason: NoProductsAvailable."
Code I checked from IOS Native and saw the product count return "Received 0 products":
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
UnityPurchasingLog(@"Received %lu products", (unsigned long)[response.products count]);
// Add the retrieved products to our set of valid products.
NSDictionary* fetchedProducts = [NSDictionary dictionaryWithObjects: response.products forKeys: [response.products valueForKey: @"productIdentifier"]];
[validProducts addEntriesFromDictionary: fetchedProducts];
NSString* productJSON = [UnityPurchasing serializeProductMetadata: response.products];
// Send the app receipt as a separate parameter to avoid JSON parsing a large string.
[self UnitySendMessage: @"OnProductsRetrieved" payload: productJSON];
}
I have no idea about this issue so anyone know the Sandbox still work or had other any problem ? Please give me advise.
Thanks everyone.