I’m updating an old app which uses StoreKit and hosted in-app purchases (multimedia add-ons).
The original .pkgs are missing and the only known place they exist intact is on Apple’s servers.
The app is able to download and install the IAPs. Is there anyway to save them to the local device?
In-App Purchase
RSS for tagOffer extra content, digital goods, and features directly within your app using in-app purchases.
Posts under In-App Purchase tag
200 Posts
Sort by:
Post
Replies
Boosts
Views
Activity
I am the Lead iOS Developer for The Incc, an upcoming social networking application. The platform offers subscriptions that grant users access to premium content, primarily digital magazines showcasing diverse cultures, alongside standard social media features and additional unique functionalities.
I am exploring two specific use cases for our subscription model.
Promo Codes with Split Payments:
We plan to collaborate with the our influencers (referred to as Mover Shakers) by providing them with promo codes for users to purchase subscriptions. For such purchases, we aim to implement a revenue split model, allocating 10% to the influencer and the remainder to us after Apple’s fees.
Gifting Subscriptions:
We also wish to enable users to gift subscriptions to others within the app.
I understand that the Apple Subscription Service does not natively support these features.
What other options do we have to achieve this that are also not against the Apple's guidelines.
Hello, Apple App Store Server API Team!
I have one questions about the identifiers provided by Apple App Store Server API. Could you please answer?
We are running an iOS App. In our app, the transactionId we get from Apple App Store Server API is called T1. (Example)
Q1. Is it correct that other iOS apps cannot get T1 for transactionId from Apple App Store Server API? (I'm wondering if the transactionId is globally unique across apps.)
Thank you!
I'm using Transaction.environment to determine server behavior.
https://developer.apple.com/documentation/storekit/apptransaction/environment
https://developer.apple.com/documentation/storekit/appstore/environment
I gather this information on the app using StoreKit and then send it to the server:
originalTransactionId = transaction.originalID
originalTransactionEnvironment = transaction.environment
When testing within Xcode, on a simulator, the value sent to the server for originalTransactionEnvironment is Xcode - as expected.
When testing on a device using a TestFlight build, the value sent to the server for originalTransactionEnvironment is undefined/nil. I expected it to be Sandbox - and later in production it should be Production.
Most importantly, the value sent to the server for originalTransactionId in the TestFlight version is not undefined/nil - it is the value I expected it would be. The transaction was originally for a subscription purchase, if that makes a difference.
So the transaction is available, and information like originalID is also available. Why is transaction.environment not available? What is the behavior in production?
I want to create offer code for my Vision app, but I didn't find that option in Apple Connect subscription price page. And when I check that from my iPhone app page, I saw the offer code description "Codes for discounted prices or free offers are unique alphanumeric codes that can be easily distributed using physical or digital channels for your iOS app and macOS app. Your customers can redeem them on devices running iOS 14, iPadOS 14, macOS 15 or later through the App Store redemption flow or within the app if you've implemented the presentCodeRedemptionSheet StoreKit API. You can create codes for up to 10 active offers at a time."
It doesn't mentioned VisionOS, so can I set offer code for my Vision app?
So, we've implemented IAP with StoreKit2 e2e for both the client and backend and it's working mostly perfectly, however we have an issue which we can't seem to understand Apple's behavior.
So, imagine a purchase that occurred on the 10th of December in the sandbox environment through an install from TestFlight, and this same purchase keeps getting queued in the Transaction.unfinished list for some reason (today, the 17th of December, a whole week after the initial purchase!).
Here's the flow:
We iterate the list on app launch
Send the unfinishedTransaction's transactionId to our servers
The server says "hey, we could verify it with Apple but it's not longer active (expired). We can't really work with it so just finish it on your side and don't send it to me again"
The client finishes!! the transaction
On the very next app launch it keeps reappearing in the Transaction.unfinished queue
Are we doing something wrong, why doesn't it get cleaned? Is this an expected behavior?
Note, this is generally the server's logic for new purchases:
If we weren't able to contact Apple - we tell the client to not finish the transaction so that we'll be able to re-iterate it on the next app launch or retry
If the transaction is not expired and valid - we update our records and tell the client to finish the transaction
If we couldn't update our records - we tell the client to not finish the transaction so that we'll be able to re-iterate it on the next app launch or retry
If the transaction is not valid for some reason - we tell the user to finish the transaction
The server might see it as a valid transaction if we'll send the originalTransactionId instead of the 'transactionId(using it to callgetTransactionInfoinAppStoreServerLibrary`), but is this something we want to do?
This will obviously not fix the problem because the server tells the client to finish the transaction anyways, but it simply doesn't work.
Please, any advice or changes to make to either Client/Server would be greatly appreciated
Best Regards, Ofek
The documentation mentions the following:
Verify your receipt first with the production URL; then verify with the sandbox URL if you receive a 21007 status code. This approach ensures you don’t have to switch between URLs while your app is in testing, in review by App Review, or live in the App Store.
This way, you can use one server environment to handle both Sandbox and Production environments. It is necessary to pass App Review.
However, I'm not manually hitting these URLs - I'm using Apple's libraries.
Specifically, the environment is used in SignedDataVerifier and AppStoreServerAPIClient.
(I can't link to these because, for some reason, the domain apple.github.io is not allowed. The documentation for these is only found there. You can find it quickly by searching these terms and the domain.)
Here is how SignedDataVerifier is being used:
const verifier = new SignedDataVerifier(
appleRootCertificates,
APPLE_ENABLE_ONLINE_CHECKS,
APPLE_ENVIRONMENT,
APPLE_BUNDLE_ID,
APPLE_APP_ID
)
const verifiedNotification: ResponseBodyV2DecodedPayload = await verifier.verifyAndDecodeNotification(signedPayload)
if (!verifiedNotification)
{
// Failure
return
}
Here is how AppStoreServerAPIClient is being used:
const appStoreServerAPIClient = new AppStoreServerAPIClient(
SIGNING_KEY,
APPLE_IAP_KEY_ID,
APPLE_IAP_ISSUER_ID,
APPLE_BUNDLE_ID,
APPLE_ENVIRONMENT
)
const statusResponse: StatusResponse = await appStoreServerAPIClient.getAllSubscriptionStatuses(originalTransactionId, [Status.ACTIVE])
In the source code for SignedDataVerifier.verifyAndDecodeNotification, I can see that it throws a VerificationException(VerificationStatus.INVALID_ENVIRONMENT) error .
So for SignedDataVerifier is it as simple as wrapping my code in a try/catch and checking that the error's status code is 21007? I'm unsure about this because if you scroll to the bottom of the linked source code file, you can see the enumeration VerificationStatus, but it's unclear if this member has a value of 21007.
The source code for AppStoreServerAPIClient only says that it throws an APIException if a response could not be processed, so I'm not too sure about how to handle this one.
I have an Apple subscription with a 2-week introductory offer and a 3-month promotional offer code. There are 2 subscription plans:
1-month subscription
12-month subscription
For the 1-month plan, my promotional offer code is "Monthly_Free," and for the 12-month plan, my promotional offer code is "Yearly_Free." However, when users try to enter the respective promo codes for the 1-month or 12-month plans, they receive the following error:
"Offer not available. Your account is not eligible for this offer. You can still subscribe at the regular plan price."
This works fine in the sandbox account, where I can use the promo codes as many times as needed, switching between the 1-month and 12-month plans easily. What could be the issue here?
So I've run a promo for my which offerred a free purchase for a while.
Some people - and it looks like mostly in Germany - ran into an issue that the purchase would fail with SKError.Code.unknown.
One user noted that if you cover FaceID and use your password when making the purchase it would succeed.
That was then my guidance and it seemed to have worked for everyone.
Is there a way from my side to prevent that error?
So I ran a promo for my app that got me 30k downloads or so. The app was free for a day and so it got lots of "purchases". There were two errors from StoreKit2 that I can't explain (I'll detail the other one in another post)
This one:
StoreKit.StoreKitError.systemError(Error Domain=NSCocoaErrorDomain Code=4097 "connection to service with pid 19497 named com.apple.storekitd" UserInfo={NSDebugDescription=connection to service with pid 19497 named com.apple.storekitd}
There are various theories online that the display name of the purchase could be an issue.
Another was that this indicates that this indicates that a helper process has crashed.
Generally my guidance was to restart the device and that seemed to resolve it for most if not everyone. But not everyone reached out and it rained bad reviews and I was accused of a bait and switch and so on.
Is there any way to mitigate this? Any way to address it? It doesn't happen for everyone but it happens very frequently still.
Guideline 3.1.1 - Business - Payments - In-App Purchase
We found in our review that your app or its metadata provides access to mechanisms other than in-app purchase for purchases or subscriptions to be used in the app, which does not comply with the App Review Guidelines. Specifically:
Your app's Thanks window includes the following call-to-action and/or URL that directs users to external mechanisms for purchases or subscriptions to be used in the app:
After generating icons, a "Buy me a coffee" button is presented that goes to a website to make a purchase.
I literally just want my app to be able to take "tips" without going through apple in app purchases, because the cut they take is INSANE
I'm trying to follow the instructions from https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/submit-for-review's "Submit an in-app purchase for the first time" section. However, I can't get the “Add In-App Purchases or Subscriptions” dialog to open - there isn't a clickable link in the In-App Purchases and Subscriptions section.
My IAPs seem to be set up properly, they're all in the "Ready to Submit" state.
Hi, I have deployed my app on Test Flight, I have two subscriptions, monthly and yearly. User can have one of them at a time and upgrade, downgrade to the other. Upgrade, downgrade, cancel from the Apple Settings worked fine in the sandbox environment when testing locally. Now when I have deployed the app on TestFlight, I was able to purchase the subscription successfully from my app. Now when I want to cancel my subscription from the Apple Settings it gives me the following error after confirming cancellation, 'Your request is temporarily unable to be processed. Please try again later.' Also the other subscription offer (yearly) is also not shown to which I could upgrade, even though in the sandbox I was able to upgrade downgrade from the settings. Another thing I have noticed is that the app Icon or name is not shown anywhere in settings with the subscription. Instead of app icon only empty square is shown. Even though app icon shows fine everywhere else.
Can someone please help me figure out this issue?
I am somewhat of a beginner in mobile app development. I have some questions about IAP and commissions. One of my clients has a website that basically acts as the middle man which connects the trainers and participants. Basically, the trainers pay my client a subscription fee and they can list the kind of trainings they have to offer (ex. cardio, weight lifting, ...etc.). These trainings can be one-to-one, one-to-many, or one-to-few depending on the trainers. When the participants see something that they like, they would make a payment directly to the trainers via the website. To save time, we will probably do some kind of webview app. Having said all these, my questions are as follows,
As far as the IAP is concerned, can the payments between the trainers and the participants use third party payment method and ONLY the subscription fee from the trainers to the client use the storeKit/Apple IAP plugin?
If the answer to the question above is Yes (i.e. using Apple IAP for subscription only but use a third party payment for the transactions between the trainers and the participants), does it mean that the commissions ONLY apply on the subscription fees and NOT the payments between the trainers and the participants?
If the answer to Question 1 is No (i.e. ALL the payments have to go through Apple IAP), the commissions would apply to both the payments between the trainers and the participants and the monthly subscription payments, right? In this case though, to my understanding, when using the Apple IAP plugin, essentially, all the payments go to Apple temporarily. After taking out the commissions, the payments would be released to the bank account on file with the App Store within 45 days of the last day of the fiscal month in which the transaction was completed. Am I correct? And if so, as far as the business model on the App is concerned, my client would collect the money released from Apple and then distribute the money to the appropriate trainers. Am I correct?
I've noticed that some new users are able to redeem promotional offers. However, Apple's documentation states: "Promotional offers can be effective in winning back lapsed subscribers or retaining current subscribers. You can provide lapsed or current subscribers a limited-time offer of a discounted or free period of service for auto-renewable subscriptions on macOS, iOS, and tvOS." (Source)
Could someone clarify whether promotional offers are intended solely for lapsed or current subscribers, or can new subscribers also redeem them under certain conditions?
In one of My Apps I want have a "tip" option for users, so they can support the developer if they like the App. As a small tank you, "tipping" will unlock a small bonus feature (nothing essential, but nevertheless nice to have). According to the Guidelines this is perfectly fine and explicitly allowed.
So a created a few IAP options with different prices as non-consumable one-time purchases and the same number of consumable one-time-purchases with the same prices (so no subscriptions at all).
The idea is: users should be able to tip multiple times if they want to (actually many users of the old App version have asked for this)
Non-consumable IAP items can only be purchased once, but these can be restored (for example when switching to a new device).
Consumable IAP items can not be restored, but these can be purchased multiple times.
The idea is to combine both, so it is possible to tip multiple times (via consumable IAPs) and to allow the restore of previous purchases (to unlock the bonus feature). To do this, the App would at first only offer the non-consumable IAP items in its "tipping" screen. Only after these were purchased, the App would then only offer the consumable IAP items. Users tipping only once would always purchase the non-consumable item that can be restored. Users who have tipped multiple times would also have purchased the non-consumable IAP once and in addition the consumable item, so they all can restore and unlock the bonus feature. And no one is confused about any internal differences (consumable vs non-consumable), because the users will always see only one tipping option.
I've created these IAP items and send them to Apple for review together with this explanation. All the non-consumable items got approved, all the consumable items got rejected with the following bizarre and unhelpful note from the review board:
3.1.1 - new IAP type
New type: Consumable
Previous type: Non-Consumable
Recommend: Download
The binary of the app is new (more than 14 days).
What exactly does this mean? I've read section 3.1.1 of the guidelines and nothing indicates anything which would allow any rejection here. And what does "the binary of the app is new" mean? Sure the App is new (currently the new version is tested via TestFlight), but what does this have to do with the IAP?
With normal "Appstore rejections" there was always a link provided which allowed to contact the review team. But there's absolutely nothing available here. Just this bizarre note which doesn't give any clue what's wrong.
Does anyone have an idea what's wrong, or what I need to do to get this approved? How can I contact the review team that is responsible for this IAP review?
BTW: I've tried to get this approved again after changing the description/names of the localization a bit (because these are the only things which are marked in red), but the same strange note came back.
And the localization title and description can not have a long text, so there're not that many possible variations available which describe the IAP correctly.
Hello Developers,
I’m encountering an issue while setting up and testing subscriptions for my iOS app. Here’s a detailed breakdown of the situation:
I have configured a 1-Year Premium Membership subscription in App Store Connect. The subscription is currently in the Waiting for Review status.
To properly test this subscription in the Sandbox environment, it seems the subscription needs to be approved first. However, to get it approved, I need to submit it with my app, creating a frustrating loop.
My app currently doesn’t feature the subscription on its UI, as I want to thoroughly test its functionality before integrating it fully.
Steps Taken:
Configured metadata for the subscription in App Store Connect (e.g., localized name, description, and price).
Submitted the subscription for review.
Verified product IDs and linked them correctly in my paywall configuration.
Key Questions:
Is it mandatory for the subscription to be integrated into the app for the initial review?
Can I successfully test a subscription in the sandbox environment while its status is still Waiting for Review?
What’s the best practice to handle this situation and break the testing-review loop?
Any insights or guidance would be greatly appreciated. Thank you for your time!
Starting a few months ago, we noticed that we are receiving sign-ups to our application using Sandbox accounts. These accounts were not created by us, and certainly do not show up under Sandbox users on App Store Connect.
When we setup In App Payment, our server side validation followed the guidance to always allow sandbox receipts (see https://developer.apple.com/documentation/appstorereceipts/verifyreceipt).
I think we assumed that only Sandbox users that we setup in App Store connect would be allowed to be used with our app. Another assumption was that Apple reviewers could create Sandbox accounts to use to test our IAP sign-up during app review.
How are other developers preventing fraudulent sign-ups from sandbox accounts? Has something changed with In App Payments this year related to sandbox accounts?
Hi,
I have 6 subscriptions in a subscription group. Each subscription has 2 active promotional offers configured. One is with a 25% offer for a month and another one is a 50% offer for a month.
My doubt is, can users access both promotional offers in a single subscription? Not at a time
First 25% offer and then 50% offer
any solution to integrate apps with revenuecat ?