Post not yet marked as solved
As far as I know, an app should use an In-app purchase to unlock premium content, features, or levels, etc. Apple won't allow making payments via third-party payment gateways or even providing a link to do payment other than in-app purchase is against the guidelines.
Today I found an app in AppStore where they use a third-party payment gateway to unlock their premium content.
Attaching the screenshot
Here they are asking for credit card details and entering the card details completes their payments process (Worth mentioning they have cool UX for this!).
I am wondering how did they manage to get into the store? or did apple update the policies? or is it a new feature?
I am clueless. Any help is greatly appreciated.
The Manage in-app purchases on your server of WWDC 2021 shows the following flow:
The third arrow in the screenshot dictates the decoded transaction is sent from the customer's iPhone to our server.
Because our subscription management service and app backend are different services, we think the app shouldn't add another server to connect.
I wonder, after receiving INITIAL_BUY, if we can get the transaction/receipt using App Store Server API, i.e. we want the following flow:
Is this possible for now? Or is it essential to use customers' devices to decode transactions and receipts?
Post not yet marked as solved
We are adding an feature in the app and we want to sell a special subscription for the app which lets users use the feature.
We might want to stop supporting this feature and remove it from the app in the future. Not just stop selling the subscription, but completely get rid of the feature in future version of the app.
Once the feature is removed, the users who bought the special subscription, will not be able to access the feature and they will receive the same experience as users who bough a normal subscript we are currently offering.
What is the best approach to deal with this situation?
Is it possible to force cancelation of this product or changing auto renew to off for all users who are subscribed to it?
Is it possible to force downgrade/upgrade of that product for all users who are subscribed to it?
Are we stuck with supporting this feature forever, or is there a best practice which will allow us to phase it out?
This is a followup question to this document:
https://developer.apple.com/help/app-store-connect/manage-in-app-purchases/schedule-price-changes
If we schedule a price change for a subscription product, will it affect existing subscribers in their next billing period? How will they be notified that this change happened?
Post marked as Apple Recommended
Hi, I can't get into "manage" sandbox account. I either get to a screen to put my password in. Here there is no way to click "next" or "login". (I have tried pressing "enter" on my keyboard to no effect). Or I get directly into "Cannot Connect" page. I have tried this two days in a row. I have tried turning it off and on again. I have tried logging out and in.
Device: iPhone 13 pro max, iOS: 16.0.3 (also tried the version before this)
Post not yet marked as solved
Hello,
Having two app versions: basic and premium. Both are with equal content but with different allowances. Basic version can do less than the premium version. When upgrading from basic to premium is the basic version on the mac deleted or is it still there but only disabled by the App Store? In the last case there are two subscriptions on the mac: one enabled the other disabled. If only subscription duration or price is upgraded or downgraded there is no problem involved because both have the same allowances.
Thanks for any help or advice
Post not yet marked as solved
Hi,
I am using StoreKit2 for managing subscriptions and while testing it works fine until the point when the subscription needs to auto-renew.
When using StoreKit Testing Configuration and running the app through Xcode the auto-renew process works fine.
On the other hand, when I disable StoreKit Testing Configuration and I use Sandbox environment (again through Xcode) then after my first period expires (1 month aka. 5 minutes) I keep getting
Product.SubscriptionInfo.RenewalInfo.ExpirationReason.autoRenewDisabled
This is a code block I use for loading latest subscription data
// Product is StoreKit.Product
for product in products {
do {
let statuses = try await product.subscription?.status
guard let statuses = statuses else { continue }
for status in statuses {
let statusRenewalInfo = try checkVerified(status.renewalInfo)
let statusTransaction = try checkVerified(status.transaction)
guard let expirationDate = statusTransaction.expirationDate else {
continue
}
// Here I am getting "autoRenewDisabled" status.
if expirationDate < Date() {
print("*** expiration reason: \(statusRenewalInfo.expirationReason?.description)")
}
}
}
}
StoreKit2 (aka. Transaction API) is fantastic because of it's async-await syntax but I experienced a lot of problems with it such as this one and the one where it doesn't refresh subscriptions history properly so any advice would be helpful.
Post not yet marked as solved
Hi,
I saw that AppleTV started a season pass for MLS and I'm wondering if it's possible to add a similar season pass to my own app. As far as I remember season passes subscriptions were not available/supported. I tried to look for it in docs but I cannot find anything. I might be blind. If you know something please let me know in a comment.
Edit:
To be more precise I'm talking about 3PP
Post not yet marked as solved
Hi,
We have a web application with freemium business model, this is an outdoor x-country skiing application. We are now planning to expand that to offer a native mobile application with the same business model. The user will use to mobile app to access their premium content that is already paid for, using our web version of the service. We want to let the users use the same content that they have access to on the Web using the same third party log in mechanism. We will not offer any form of payment or ability to sign up for a subscription in the mobile app , all this will still be on the web application.
Is this compliant with the terms for distributing the iOS app on App store ?
Post not yet marked as solved
Hi --
We have auto-renewable subscriptions available in-app. About a year and a half ago, we introduced a price change to these products, and we opted to keep the original prices for existing subscriptions.
Today, while testing the subscription in the sandbox, we noticed that while the products are returned with the updated price (this correct price is displayed in the app), the App Store purchase flow shows the old price.
I am using a brand new sandbox test user. When I open the Settings -> App Store -> Sandbox User -> Manage page, it lists our subscriptions with the old price.
We are trying to understand where the discrepancy comes from. Is the sandbox subscription data cached somewhere? Can we clear this data? Can we force it to be refreshed from the production subscription prices?
Is this an issue on sandbox only, or will it affect our production app?
I am running iOS 14.4.2 on an iPhone 8 Plus.
Post not yet marked as solved
The sample code provided in https://developer.apple.com/wwdc21/10114 doesn't appear to call finish() on unverified transactions, and I haven't been able to find any documentation regarding what to do with unfinished transactions. However, Apple has always emphasized the importance of finishing transactions, and since a transaction object is provided even with the unverified state, I'd love some guidance!
Post not yet marked as solved
Alongside our most recent release we are planning on updating the subscription prices of all our old products to reflect the new pricing model. This most certainly results in price increases of over 50% for the majority of our old subscription products. As such, those customers of ours that are still subscribed to these old products would need to give their consent for the new price moving forward. Our app uses Unity IAP and StoreKit 1. StoreKit offers a function called showPriceConsentIfNeeded, which seems to be exactly what's required. Sadly, Unity IAP does not offer a way to ask for user consent in cases such as these. Also due to Unity IAP, we also have no easy way to call showPriceConsentIfNeeded manually. How would StoreKit 1 handle the price increase in this case? Would the subscription automatically end at the end of the current billing period, or would the user be informed of the new price via some other way - such as an e-mail or a push notification?
Post not yet marked as solved
I am currently testing purchases with Sandbox account.
Purchase auto-renewable subcription
Purchase the subscription again during the period of validity。
Popup saying that "You are currently subscribed to this" is showing with buttons "Manage" and "OK".
when pressing "OK" the payment queue was returning a new receipt (with state SKPaymentTransactionStatePurchased)。
Is that normal?
Is this behavior expected/is a "normal transaction" meant to be "Purchased" or does production use a different state in this scenario? In the event of this is there any way for the App to detect that this purchase was already subscribed and react to it differently say to avoid associating a purchase twice? Some forums indicate that this occurrence should return a state of "Failed" but i have not seen this.
Post not yet marked as solved
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
Post not yet marked as solved
I'm working on implementing the new StoreKit 2 api in my iOS app. I offer auto-renewing subscriptions to my users. I have lots of different product levels each that come with yearly or monthly charging options.
Let's say a user has a yearly auto-renewing subscription that is paid through April 2024. In Sept 2023, they decide to downgrade to a monthly product. Their yearly product stays in place until it expires and then when the subscription auto-renews in April 2024, it will renew as monthly instead.
How do I look up what product id they downgraded to? When I look in the renewalInfo struct, it will give me info on if they will renew, when they will renew, and it'll give me their currentProductId... but I need the next product id. The one that they downgraded to, the monthly one. When their subscription to the yearly product expires, they'll renew as a different (monthly) product.
if let status = try? await self.subscriptionProducts.first?.subscription?.status.first {
if let renewalInfo = try? self.checkVerified(status.renewalInfo) {
// ...
}
}
I can't figure out how to access that info so that I can properly present the info in their Account screen. If my users were on a yearly product and last week they chose to downgrade to a monthly product, I need to show them that they are finishing their yearly sub and will auto-renew as monthly. I can't just show them that they are on the yearly sub, because they'll get confused because they know they downgraded to monthly.
Post not yet marked as solved
Why is this rejection coming? I don't understand.I can't see anything in my mailbox.
Post not yet marked as solved
Hi, thanks for reading my question. I need help with some odd behaviour with product.purchase() not triggering a confirmation dialog after a subscription has expired and trying to purchase it again. Seeing this in iOS 16.2 and 15.7.2 (haven't tried any other versions) on actual devices, not in simulator.
I'm using a sandbox user on the sandbox environment (not using the local store kit config file testing option).
Using a newly created sandbox user, first subscription purchase goes through just fine, dialog box pops up, login with sandbox user, get confirmation of purchase and then Transaction.currentEntitlements has one item as expected. It auto renews for 12 times (each time Transaction.currentEntitlements contains the correct results) and then expires, as expected for sandbox. Transaction.currentEntitlements is then also empty, as expected. All good so far.
Now I want to test purchasing it again...Call product.purchase() again to renew/start a new subscription and nothing happens, no confirm purchase dialog box pops up at all. The purchase function simply exits BUT returns success (as in the following gets called) but in self.updatePurchasedProducts(), Transaction.currentEntitlements is empty.
case let .success(.verified(transaction)):
// Successful purchase
await transaction.finish()
await self.updatePurchasedProducts()
if I instead go to Settings->App Store->Sandbox User-> Manage Subscriptions and renew the subscription there, instead of in my app, then Transaction.currentEntitlements has a new entry and all is good again.
Alternatively, if I create yet another new sandbox user and logout of the old one I was using, I am once again able to purchase from within the app, so .purchase() once again works as normal.
Is there something I am missing about expired subscriptions and trying to purchase them again in the app? Is this a sandbox issue and in production I'll have no problem?
The sandbox user has purchasing enabled in Settings->App Store.
I've also tried calling AppStore.sync() (which is in my "Restore Purchase" button) before calling product.purchase() after the subscription stops renewing, expires and this issue comes up, doesn't resolve it.
Also have a less important question, the initial call to product.purchase(), the one that works as expected, has a bit of a delay before the confirmation dialog pops up, a few seconds, which will probably result in the user clicking the buy button again thinking it didn't work. Is a bit of a delay normal for sandbox? Will it be ok in production? When it fails, and I have to renew in Settings->AppStore->Sandbox user, there's also a bit of a delay after I return to my app, 5-15 or so seconds, before the transaction observer fires and currentEntitlements is checked again, is there a way to reduce this delay?
Thank you!
Colin
@MainActor
class IAPManager: NSObject, ObservableObject {
// removed other functions.....
func purchase(_ product: Product) async throws {
let result = try await product.purchase()
switch result {
case let .success(.verified(transaction)):
// Successful purchase
await transaction.finish()
await self.updatePurchasedProducts()
case let .success(.unverified(_, error)):
break
case .pending:
break
case .userCancelled:
break
@unknown default:
break
}
}
func updatePurchasedProducts() async {
for await result in Transaction.currentEntitlements {
guard case .verified(let transaction) = result else {
continue
}
if transaction.revocationDate == nil {
self.purchasedProductIDs.insert(transaction.productID)
} else {
self.purchasedProductIDs.remove(transaction.productID)
}
}
}
}
Post not yet marked as solved
Hello,
The docs at App Store Connect are full of advices for auto-renewable subscriptions. I want to set up an app as a non-consumable one with a free trial period (i.e. 1 month). I cannot find how to do this. I would be grateful for any hint or help.
Post not yet marked as solved
I would love some advice on what must be a simple question for an experienced developer if anyone has time.
My new App operates by charging business users a monthly recurring subscription. I want to charge the business user one subscription amount each month for every venue they have.
Example business has one venue then the owner subscribes to 1x $14.99/month.
Business owner has seven venues then as they add each new venue we charge them an additional $14.99/month for each venue so they are paying 7 x $14.99/month etc...
Q1. Is it possible for the App Store to allow an App to charge these concurrent monthly subscriptions for one user in one App?
Q2. If so are there any restrictions when these monthly subscriptions may be charged? I had read somewhere a while ago this was possible but they must all be charged on the same billing date as the first subscription no matter what date the subsequent subscriptions were subscribed to. (not a problem although the business will have some part of the first month free for all subsequent subscriptions depending on how far into the billing month they add the new charges).
Basically I want my App to allow the business users to add and delete venues as and when they need, each venue being treated as an individual subscription that ideally starts and ends as independent entities.
Cheers,
J
Post not yet marked as solved
Is it possible to make separate auto-renewable subscriptions for each platform in Universal Purchase? How does "restore purchase" work in that case?