Hello guys! I would appreciate your help. I am developing an app (next to my webapp). In this app users can register as either owners of moving company or as the customers. Moving company owners can list their company like a directory/business listing. The app is free to use for customers and also for company owners except if you want to list your moving company to be able to get clients and sell your physical service.
Now i have a subscription plan in mind so the moving company can list itself, which will also be listen on my webapp as the databank is shared. According to someone this doesnt require IAP, because at the end the company is paying for the listing, to help him sell his physical service.
next to it, i also want to get provision for each time the moving company gets a client through our app and pays through our app.
thirdly, i was planning to offer sponsored Listing, which will aswell work for my webapp. Meaning if someone pays for sponsored listing on my app he gets sponsored on my webapp aswell and vice versa.
And lastly, the subscription plan has an upgrade package where moving companies can get leads aswell. Like the first thing someone told me that it shouldnt require IAP as the end service us physical and thats where i am helping out.
Now i wanted to be safe than sorry and wanted to know what you guys say. Is is allowed without IAP? Where do i need IAP and where can i for example use Stripe? Are there any ways to go around IAP? I have already read the guidelines but it seems my app functions fall between them (probably) as the sponsored Listings are also on webapp if bought in mobile app aswell as the physical services that are promoted and sold through our subscription, where we dont really offer a digital service.
I would really appreciate your help very much, and i thank you for reading all this.
StoreKit
RSS for tagSupport in-app purchases and interactions with the App Store using StoreKit.
Post
Replies
Boosts
Views
Activity
Hello,
I am configuring different consumable products for iap. However I have noticed that the prices between different levels sometimes stays the same in different currencies.
For example the RON amount for $ 1.99 and $ 1.79 are the same whereas they should change.
Is this by apple design or is it a bug?
Hello,
we are facing an issue, that the Code Redemption Sheet is not continuing correctly.
Sometimes its just disabling the "Redeem" button and nothing happens for a while.
After a while the button gets enabled again and you can press the button again. Sometimes its working then, sometimes not.
Furthermore after the button action works and the payment method was chosen, the same issue can happen again. Its doing nothing for a while and you have to start again.
The app has the target SDK iOS 14 and uses SwiftUI.
We just display the Code Redemption Sheet by using this snippet:
SKPaymentQueue.default().presentCodeRedemptionSheet()
The screenshot show the "stuck" behavior. The button is disabled and nothing is happening for a while.
The code itself is fine and it is working.
Best regards,
Sebastian
Hi there,
This may be a dumb question but I'm trying to confirm this before we go down this road. Essentially, we are looking to have one premium subscription available to users within our app. A yearly subscription and that's it.
Since our app is brand new, we are looking to offer some "early adopter pricing" where early users can sign up for premium and lock in their yearly subscription at a fraction of what we will eventually charge. Will we be able to preserve pricing for select users while also making sure that new users aren't able to access that price?
I was reading some articles and saw mention of "unpreserving users subscription pricing" so I figured there must be the functionality to preserve then?
Thanks for the help!
Im using Revenuecat to manage subscriptions. In real device everything works fine but in emulator there is an error fetching offerings. It says that there is an issue with the configuration but i'm not able to debug. None of the products registered in the revenuecat dashboard could be fetched from App Store Connect.
Hi,
We are seeing a small issue on our app with a subscription in app purchase and wondering whether this should be a cause for concern.
We have 2 subscription based IAPs and 1 consumable within the app. I recently noticed that after buying one of the subscriptions and cancelling it if I try to buy the product again, it skips the purchase flow on our Test Flight builds.
I added some logs, and it appears that Product.purchase() returns right away and the resulting transaction also comes back as verified, but the new purchase is not added to current entitlements.
I managed to get the flow working after I logged out from my Sandbox account from settings, but after I did another subscription cancellation, I could not purchase the product anymore. This only happens on our Test Flight builds. If I launch the app through Xcode and use a store kit configuration file at launch, I get the purchase popup every time I try to buy the product.
It also appears to me that this only happens on a product that I have purchased previously. For the other subscription that I have not purchased before the popup shows up every time.
Is this something that we should be concerned about and is there a way to make sure the purchase popup shows up every time?
Thank you.
Kind regards,
Fardin
Is it possible to find all transaction IDs in the App Store Connect?
Does SKAN support view-through attribution for web-to-app transitions?
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?
Hello everyone,
I have an iOS application that includes subscription-based content. I would like to offer two non-consumable in-app purchases that unlock additional features, but only for users who have an active subscription.
Here’s a detailed description of my plan:
Subscription Requirement: Users need to have an active subscription to be able to purchase these non-consumable items.
Feature Unlocks: These non-consumable purchases will unlock specific features usable forever as long as the user has an active subscription (even if he unsubscribes and re-subscribes, he will not have to reacquire these features).
My questions are:
Is it compliant with Apple’s App Store guidelines to offer non-consumable in-app purchases that are available only to subscribers?
Are there specific considerations or best practices I should follow to ensure a smooth review process with Apple?
I want to make sure that I implement this correctly and transparently for my users while staying compliant with Apple’s policies. Any guidance or shared experiences would be greatly appreciated.
Thank you!
When an auto renewing subscription is "Developer removed from sale", any auto renewal should fail.
Will this make the subscription enter billing "Grace Period"?
Our expectation is that the rewal would fail without entering a "Grace Period".
Can anyone help with this, it going on for at least 10 hours.
StoreKit2 provide great API AppStore.showManageSubscription(in:) to downgrade, upgrade or cancel the user's subscription, however, can the App detect the cancellation in App? (without server to server notification)
I understand the upgrade and downgrade can be detected in Transaction.updates, but I'm not sure about the cancellation.
I want to update my label's text from Next billing date: \(date) to Expires \(date) if the user cancels the subscription in showManageSubscription(in:) sheet.
Can I implement that?
I am trying to grant access to users that subscribe to premium on the iOS app also to users that use the macOS version.
The iOS and macOS version are two separate apps with different BundleIDs, same Team ID.
I can't create a App bundle because they are part of different platforms.
I know that I could ask the user for a login so I could recognize the user from the authentication, but I would like to avoid this step.
Is there any ID i can use to identify users between different platforms?
I am trying to create a subscription with a specific subscriptionPeriod.
However, when I try creating a sub, it gives me a 409
"The attribute 'subscriptionPeriod' can not be included in a 'CREATE' request".
I have even tried creating a subscription and then updating it
https://developer.apple.com/documentation/appstoreconnectapi/subscriptionupdaterequest. But i get the same error.
Hi,
Our application offers 3 non-renewing subscriptions. I have integrated the necessary code, and our App Store Account Paid Agreement status is Active. Transactions are successfully completed in the sandbox environment.
However, I am facing difficulties with server-side validation. The /verifyReceipt API is deprecated, and I need an alternative method for server-side validation. The Apple documentation is quite confusing, and I couldn't find any articles related to the new approach for server-side validation.
I would greatly appreciate it if you could provide a detailed guide on how to perform server-side validation with the new method.
Thank you in advance.
I was using the storekit configuration file to test subscriptio renewals so set it to renew every 30 seconds.
I have since shipped the App.
Should I have set the storekit configuration file back to real time for the renewals, or the storekit configuration file is only for non release builds so anything I have changed in their won’t effect the released build ?
I'm using the iOS simulator with a StoreKit configuration file. I can see that there have been transactions while the app has been closed, but my StoreKit 2 listener is never called with those updates to be able to finish them When I open my app from a cold start.
I've added a listener on application(_:didFinishLaunching:launchOptions:) like this:
func startObservingTransactions() {
task = Task(priority: .background) {
for await result in Transaction.updates {
if case .verified(let transaction) = result {
await transaction.finish()
}
}
}
}
But the Transaction.updates loop never gets called (have added breakpoints to check). It's only ever called when a purchase is made, or subsequent transaction renewals when the app is open. Only then it will get the previously unfinished transactions.
Steps to reproduce:
Create an app with a StoreKit config file (with sped up transactions) to purchase an item
Make a purchase then quit the app
Wait for a bit for more transactions to be made while the app is closed.
Open the app from a cold start and none of the transactions will be finished by the listener in your app. Cancel the subscription via the transaction manager.
Close and open the app from a cold start. The first transaction will be finished by the listener but none of the others will be.
In Apple's docs it says
If your app has unfinished transactions, the listener receives them immediately after the app launches
Why is this not the case?
We're currrently migrating from the deprecated /verifyReceipt endpoint to the new App Store Server API.
Context: We use Storekit 2 on the client. Even though it validates transactions client-side, our app also persists subscription data (Original Transaction ID + Product ID) to our DB, so it's necessary to validate the purchases server-side as well.
When calling the new endpoints (for example, Get All Subscription Statuses or Get Transaction History ), I'm currently seeing 4+ second latency.
This is the case when passing in only a Transaction ID and hitting the Production endpoint, even for Transaction IDs that don't exist in Production (eg, Sandbox transactions).
Are there any plans to improve the performance of this API? As it currently stands, we're holding off on the migration -- 4 seconds is far too impactful on both our user experience and our backend system versus the existing 300-400ms latency of /verifyReceipt.
Problem was observed on the published App because the IAP offer code processing is only done on the published App.
I implemented the ".presentCodeRedemptionSheet()" command by tapping Offer Code button.
Then the typed in offer code was processed by this page and the offer was successfully purchased from AppStore.
After detecting the purchased status, executed "SKPaymentQueue.default().finishTransaction(transaction)".
I thought that finishTransaction() would close the offer code processing page that is not written in document. However the page for offer code processing page was still displayed and was never closed.
The only way to close the input page for offer code is to manually tapping "Cancel" button.
Since there is no way to close the offer code processing page, I added ".popToRootViewController(animated: true)" in order to close all pages and views after detection of purchased status but failed to close the offer code processing page managed by Apple.
I need to know how to programmatically close the offer code processing page invoked by ".presentCodeRedemptionSheet()".
I got no response from FeedBackAssistant and Apple Developer Technical Support.
Thank you.