StoreKit

RSS for tag

Support in-app purchases and interactions with the App Store using StoreKit.

StoreKit Documentation

Post

Replies

Boosts

Views

Activity

In-App-Payment required for Business Listing App?
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.
0
0
280
Jul ’24
Redeeming code stucks very often after pressing "Redeem offer code"
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
31
17
9k
Jun ’22
Can you preserve "early adopter pricing"?
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!
2
0
1.1k
Dec ’22
Test Flight build does not show Purchase Confirmation popup for IAP.
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
0
0
297
Jul ’24
StoreKit 2 - AppTransaction.originalAppVersion confusion
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?
2
4
971
Nov ’23
Clarification on Offering Non-Consumable In-App Purchases for Subscribers Only
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!
0
0
231
Jul ’24
Can an App detect a subscription's cancellation in itself?
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?
3
0
1.6k
Mar ’22
Identifying users using app in different platforms (iOS and macOS) and different bundle ids
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?
1
0
418
Jun ’24
Subscription Update not working
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.
1
1
411
Jun ’24
Server Side validation for In-App Purchase
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.
1
0
594
Jul ’24
storekit configuration file Only for testing ?
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 ?
1
0
379
Jun ’24
Unfinished transactions not being emitted on start of app
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?
14
2
4.4k
Dec ’22
App Store Server API: > 4 second latency
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.
3
0
411
Jun ’24
No way to close the page for subscription Offer Code processing invoked by "SKPaymentQueue.default().presentCodeRedemptionSheet()".
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.
4
0
577
Apr ’23