In-App Purchase

RSS for tag

Offer extra content, digital goods, and features directly within your app using in-app purchases.

In-App Purchase Documentation

Posts under In-App Purchase tag

574 Posts
Sort by:
Post not yet marked as solved
17 Replies
6.1k Views
Hello,I am trying to determine if an in-app purchase will be required within the app we are developing. We provide continuing education courses in video format. Someone would watch the course, evaluate the course, and take a short exam about the course. Those who pass the exam are also entitled to a CE certificate that is automatically emailed to them and then printable for their records. Would this type of scenario require the purchase to be in-app or would I be able to implement my own payment system when somebodt wants to buy one of our courses?Thanks in advance!Ken
Posted
by
Post marked as solved
7 Replies
7.1k Views
Hi,I'm creating an app which allows users to register with my service on any number of devices (web, Android, Roku, iOS, Apple TV), and then purchase a monthly subscription to watch video content. The subscription provides access to the entire catalog. I have my own subscription management API running on a server which I'd like to leverage as the source of truth so users can purchase a subscription on their Roku device, login to the app on iPad, and continue watching where they left off.Basically, Netflix.To pull this off in Apple's ecosystem, I have two options as far as I can tell:Non-renewing subscriptions: users purchase the subscription inside the app though IAP. Once purchase is complete, the app sync’s the subscription to my back-end system. The app interfaces with my back-end any time an entitlement check is required. When a user’s subscription is about to expire, the app must present purchase workflow again.Skip IAP altogether and require users to subscribe via web.It looks like auto-renewable subscriptions were designed for selling subscriptions to my type of content (video), but I don't see how I could use them because the subscription must be created and managed inside of iTunes, and there are no APIs available for another platform to check the status of a subscription, nor are there webhooks to notify by system when actions occur (subscription, cancelation, etc).Am I missing a third option or did I outline this accurately? I'm really curious how Netflix is pulling this off.Thanks!
Posted
by
Post not yet marked as solved
2 Replies
3.6k Views
Hi there! I think my store kit code is fine it may be the connection between itunes connect. The problem is during the reuqest, the did recieve response function runs, but no products are appended. I'm 18 and very new to this so any help would be appreciated, thanks! Here is my code:import Foundationimport SpriteKitimport AVFoundationimport StoreKitclass SettingsScene : SKScene, SKProductsRequestDelegate, SKPaymentTransactionObserver { var background1 = SKSpriteNode() var AudioPlayer = AVAudioPlayer() var removeAdsButton : UIButton! var unlockLevelsButton : UIButton! var list = [SKProduct]() var p = SKProduct() var lblAd: UILabel! var lblCoinAmount: UILabel! override func didMoveToView(view: SKView) { if(SKPaymentQueue.canMakePayments()) { print("IAP is enabled, loading") let productID:NSSet = NSSet(objects: "com.seanfrost.supershooter.removeads", "com.seanfrost.supershooter.unlocklevels") let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>) request.delegate = self request.start() } else { print("please enable IAPS") } let removeAdsButtonImage = UIImage(named: "leftPurchaseButton") removeAdsButton = UIButton(frame: CGRect(x: view.frame.size.width/2 - 105, y: view.frame.size.height/2 - 110, width:212, height: 62)) removeAdsButton.setTitleShadowColor(UIColor.blackColor(), forState: UIControlState.Highlighted) removeAdsButton.setTitleShadowColor(UIColor.whiteColor(), forState: UIControlState.Normal) removeAdsButton.setBackgroundImage(removeAdsButtonImage, forState: UIControlState.Normal) removeAdsButton.setTitle("Remove Ads", forState: UIControlState.Normal) removeAdsButton.titleLabel!.font = UIFont(name: "arial", size: 30) removeAdsButton.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal) removeAdsButton.contentHorizontalAlignment = UIControlContentHorizontalAlignment.Center removeAdsButton.addTarget(self, action: Selector("btnRemoveAds"), forControlEvents: UIControlEvents.TouchUpInside) self.view?.addSubview(removeAdsButton) let unlockLevelsButtonImage = UIImage(named: "leftPurchaseButton") unlockLevelsButton = UIButton(frame: CGRect(x: view.frame.size.width/2 - 105, y: view.frame.size.height/2 + 110, width:212, height: 62)) unlockLevelsButton.setTitleShadowColor(UIColor.blackColor(), forState: UIControlState.Highlighted) unlockLevelsButton.setTitleShadowColor(UIColor.whiteColor(), forState: UIControlState.Normal) unlockLevelsButton.setBackgroundImage(unlockLevelsButtonImage, forState: UIControlState.Normal) unlockLevelsButton.setTitle("Unlock Levels", forState: UIControlState.Normal) unlockLevelsButton.titleLabel!.font = UIFont(name: "arial", size: 30) unlockLevelsButton.setTitleColor(UIColor.blackColor(), forState: UIControlState.Normal) unlockLevelsButton.contentHorizontalAlignment = UIControlContentHorizontalAlignment.Center unlockLevelsButton.addTarget(self, action: Selector("btnAddCoins"), forControlEvents: UIControlEvents.TouchUpInside) self.view?.addSubview(unlockLevelsButton) removeAdsButton.enabled = false unlockLevelsButton.enabled = false } func btnRemoveAds() { print("remove ads button pressed") for product in list { let prodID = product.productIdentifier if(prodID == "com.seanfrost.supershooter.removeads") { p = product buyProduct() break; } } } func btnAddCoins() { for product in list { let prodID = product.productIdentifier if(prodID == "com.seanfrost.supershooter.unlocklevels") { p = product buyProduct() break; } } } func removeAds() { print("ads removed") } func addCoins() { numberOfCoins = numberOfCoins + 50 print("coins added") } func RestorePurchases() { SKPaymentQueue.defaultQueue().addTransactionObserver(self) SKPaymentQueue.defaultQueue().restoreCompletedTransactions() } func buyProduct() { print("buy " + p.productIdentifier) let pay = SKPayment(product: p) SKPaymentQueue.defaultQueue().addTransactionObserver(self) SKPaymentQueue.defaultQueue().addPayment(pay as SKPayment) } func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) { print("product request") let myProduct = response.products for product in myProduct { print("product added") print(product.productIdentifier) print(product.localizedTitle) print(product.localizedDescription) print(product.price) list.append(product) } removeAdsButton.enabled = true unlockLevelsButton.enabled = true } func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) { print("transactions restored") for transaction in queue.transactions { let t: SKPaymentTransaction = transaction let prodID = t.payment.productIdentifier as String switch prodID { case "com.seanfrost.supershooter.removeads": print("remove ads") removeAds() case "com.seanfrost.supershooter.unlocklevels": print("add coins to account") addCoins() default: print("IAP not setup") } } } func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { print("add paymnet") for transaction:AnyObject in transactions { let trans = transaction as! SKPaymentTransaction print(trans.error) switch trans.transactionState { case .Purchased: print("buy, ok unlock iap here") print(p.productIdentifier) let prodID = p.productIdentifier as String switch prodID { case "com.seanfrost.supershooter.removeads": print("remove ads") removeAds() case "com.seanfrost.supershooter.unlocklevels": print("add coins to account") addCoins() default: print("IAP not setup") } queue.finishTransaction(trans) break; case .Failed: print("buy error") queue.finishTransaction(trans) break; default: print("default") break; } } } func finishTransaction(trans:SKPaymentTransaction) { print("finish trans") SKPaymentQueue.defaultQueue().finishTransaction(trans) } func paymentQueue(queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) { print("remove trans"); } }
Posted
by
Post not yet marked as solved
4 Replies
2.7k Views
Hello,We have an iOS app that uses In-App Purchase for auto-renewal subscription. We have Monthly subscriptions and annual subsciptions- all are auto-renewals. In iTunes Connect I can see the total number of subscription transactions being processed each month, but I can't see how many subscribers we're adding / retaining. there's no place where I can see what is the total number of active IAP subscribers.Ideally, we'd like to be able to see:- Total number of active subscribers - How these active subscribers are divided between the diffrent products- How many of them are during their Free Trial, and how many already made the first payment,Any ideas on how to find this info - either from iTunes Connect or a third-party solution (actually I also use App Annie).Thanks,Inon
Posted
by
Post not yet marked as solved
2 Replies
2.0k Views
How to deal with dynamic products in In-App purchase? We have an existing website having and admin panel where user adds his/her courses. There are thousands of courses and every day lots of courses created there. Its not possible to add those courses to Apple In-App Purchase portal. Is there any other solution to use dynamic products to In-App Purchase? there are discounts and promotional coupons also applied. Is there any API exists which we can configure to our admin panel and course will automatically added to In-App? Please help me and save my life...
Posted
by
Post not yet marked as solved
1 Replies
2.3k Views
My app has already passed the review process. I am now trying set up some in-app purchases through Unity IAP for iOS devices. Registering the various product IDs, the initialization process seems to have passed successfully. However, when I tried to make a purchase using an iPad connected to a Mac, I received an error message on XCode saying: UnityIAP: No App Receipt foundThe purchase failed. The reason given for the error was: Unknown.On the Unity editor, the purchase did go through without any problem.So what could be the reason? What is an App Receipt? How should I go about pinpointing the source of the problem? Must I first test the IAP in a sandbox environment?
Posted
by
Post not yet marked as solved
3 Replies
4k Views
Hi,In the documentation it says you must use a sandbox account when testing In-App purchase using the Sandbox.But I just noticed that (currently on 10.3 release) the StoreKit popup is saying "Sandbox" even when using a normal account but the app is an AdHoc build.Is this expected that a normal account also uses the "Sandbox" when running a AdHoc distribution build?Thanks in advance,Anders
Posted
by
Post not yet marked as solved
4 Replies
8.3k Views
Let's say I want to build (iOS + Mac) free app which unlocks full functionality for paid subscription via in-app purchases API. To encourage natural growth, I would like to implement a referral program, similar to what apps like Uber have: 1. User invites their friends to my app (using a unique link or promo code) 2. Then for each activated invite they both (user who invited the friend and friend who used the invite) get a free month of access to premium version of the month.Is there a way to implement such a system with App Store and Mac App Store? Is it even allowed by IAP guidlines? (I suspect not). Now, let's say that this ideal system described above is impossible to build according to guidelines or tech limitations, but an alternative is to offer a free month of access only to users who used the invite. The user who originally sent the invite could get something else outside the app, let's say a free sticker if 10 of his friends signed up. This is easier to build and I think it doesn't contradict any guidelines. What do you think?A reply from Apple representative would be extra valuable. Thank you for your help.
Posted
by
Post not yet marked as solved
8 Replies
10k Views
Currently unable to test IAP with sandbox users. I have tried using existing accounts and also setup new sandbox users from scratch but still get the following error when trying to make a purchase:iTunes account creation not allowedThe Apple ID cannot be used with the itunes store at this time. Please try again later.I can confirm that I am not signed into any accounts under Settings > iTunes. I have created new sandbox testers with unique email addresses and tried both a) verifying a new account email address/security questions and b) not verifying email addresses. Neither of which make a difference.Looking at the System Status (https://developer.apple.com/system-status/) there was an issue last night (18/07/17) with the iTunes Sandbox but is apparently resolved - please can someone confirm this is now working for other users or is it actually broken for others still?
Posted
by
Post not yet marked as solved
9 Replies
5.0k Views
- My app’s binary is Rejected.- My In-App Purchases (IAP) is Waiting for Review.- In-App Purchase (IAP) is enabled in developer’s account- Restore purchase works in the sandbox environment- Some purchases works in the sandbox environment.When I try to create SKProductsRequest for some purchases, as a result I have "Error Domain=SSErrorDomain Code=109 "Cannot connect to iTunes Store" UserInfo={NSLocalizedDescription=Cannot connect to iTunes Store, SSErrorHTTPStatusCodeKey=404}". But it works for some purchases. And also all my purchases have status "Waiting for Review". How to fix this?
Posted
by
Post not yet marked as solved
5 Replies
8.9k Views
I've always understood it to be the case that apps could permit users to log in or use a code to access paid content, as long as the app did not direct the user to an external web site to make a purchase. For example, apps like Netflix or Kindle.My app isn't even doing anything close to this. I have an app in which digital content is unlocked via in-app purchase. Occasionally I give away promo codes that allow a user to unlock one free piece of content. These codes can only be used once, and are distributed in very limited numbers on cards, in person, at events like trade shows.My app has been in the store for about four years using this method. This week I attempted to publish a small bug-fix update, and was flagged by Apple and told that my use of Promo Codes in this manner violates the rules.What happened here? Did Apple misunderstand what my app is doing? Did the rules change recently and I was unaware of the change? Has this always been against the rules, but either Apple didn't enforce it before or they never reviewed my app thorougly enough to find it?Thanks,Frank
Posted
by
Post not yet marked as solved
9 Replies
6.1k Views
Hello,We have customers who bought consumable in app purchase in our game, then lost their phone and purchased a new phone. They need our help to restore their progress on the new phone. They send us their purchase receipt email (sent by Apple), reasonably expecting that we can use it to find their old account and restore it on their new phone.However I see no way to associate any information from the apple purchase receipt (such as order id), to the purchase info received by the in app purchase validation service (which contains unique transaction IDs). The email receipt doesn't even have a timestamp. Even the date displayed on the receipt is usually a few days after the actual purchase happened.Is there any way we can help such customers? Very often, the purchase info is the only info we have to rely on to locate their old account.If there's nothing to be done for past purchases, is there anything we can do going forward? It would be great to be able to associate our own custom data (i.e. player ID) with the order ID or any other info displayed on the customer receipt email.
Posted
by
Post not yet marked as solved
12 Replies
6.9k Views
I'm testing the new Subscription Offers feature in iOS 12.2:https://developer.apple.com/app-store/subscriptions/#subscription-offersI have set up a Subscription Offer in App Store Connect, and the SKProduct property `discounts` contains this offer.I am generating a signature from the server according to:https://developer.apple.com/documentation/storekit/in-app_purchase/generating_a_signature_for_subscription_offersI have a test account which has purchased the original SKProduct, in order to be eligible for the offer.I'm also setting up a SKPayment with a SKPaymentDiscount correctly initialised with the signature return values.However, when attempting to purchase the offer the transaction fails with the following error:Error Domain=SKErrorDomain Code=12 "Cannot connect to iTunes Store" UserInfo={NSLocalizedDescription=Cannot connect to iTunes Store}Also, in the Console I can see an error for the process `itunesstored`:StoreKitClient: Buy failed with error: Error Domain=SSServerErrorDomain Code=3903 "Cannot connect to iTunes Store" UserInfo={NSLocalizedDescription=Cannot connect to iTunes Store} for payment: (entity: MicroPayment; id: 0xab06487fa50b06c0 ; data: )Does anyone know if this indicates an issue with the paramters on the client side, or is there an issue with this feature within StoreKit as this is in beta?
Posted
by
Post not yet marked as solved
4 Replies
2.8k Views
Hi, I am testing auto-renew subscriptin in the sandbox. If I purchase a subscription to Level 2, it renews every few minutes and I get notification in app. All good. But if, before it expires I do a downgrade to Level 1 using my app interface to purchase Level 1, the following happens. The Level 2 subscription continues until it expires. What I then expect to happen is that I would then get a notiification that the new subscription has been purchased. But that doesn't happen, the latest receipt is saying the original subscription has expired. It does include the new subscription in the "pending" field, but in that field the "auto_renew_status" is set to 0, which I guess is why it didn't actually happen.My question is: is this a sandbox thing? In production, will the new subscription purchase happen authomatically and I will get a receipt for the purchased downgrade subscription? If not, what is the way to handle this - a message to the user to say to go and manually renew subscription?Gary
Posted
by
Post not yet marked as solved
4 Replies
2.4k Views
"latest_receipt_info" is missing from Receipt when fetched from Apple servers using verifyReceipt endpoint.Can anyone explaimn when can this arise, and what is the reason behind this. We see significant amount of the trxn resulting in this.Here is one such receipt.{ "receipt": { "receipt_type": "Production", "adam_id": "******", "app_item_id": "******", "bundle_id": "com.****.***.****", "application_version": "2.3.1", "download_id": "******", "version_external_identifier": "*******", "receipt_creation_date": "2019-06-19 16:15:05 Etc/GMT", "receipt_creation_date_ms": "1560960905000", "receipt_creation_date_pst": "2019-06-19 09:15:05 America/Los_Angeles", "request_date": "2019-06-20 08:45:52 Etc/GMT", "request_date_ms": "1561020352231", "request_date_pst": "2019-06-20 01:45:52 America/Los_Angeles", "original_purchase_date": "2019-06-19 16:15:05 Etc/GMT", "original_purchase_date_ms": "1560960905000", "original_purchase_date_pst": "2019-06-19 09:15:05 America/Los_Angeles", "original_application_version": "2.3.1", "in_app": [] }, "status": 0, "environment": "Production"}This is for Mac App Store. So i don't think that it is a old receipt (like iOS 6). Also it came while our QE was performing the test.
Posted
by
Post not yet marked as solved
3 Replies
4.3k Views
Hi there,We recently had a new version of our app Approved, and it included a new In App Purchase as well. We released the app to the App Store yesterday, and after a few hours it became visible in App Store Search.However, the in-app-purchase is not visible on the App Store, and therefore, the App simply does not work.I have read that it can take up to 24 hours for the in app purchase to be visible in the App Store, but this is a problem as our App doesn't work without the In App Purchase.Does anyone have any experience with this?
Posted
by
Post not yet marked as solved
36 Replies
16k Views
Out of several thousand users who have made in app purchases we have one that has a pop up with "There's no information available for In-App Purchases issue. Try again later 21199" showing when they open the app.Looking at the data codes 21199 is:21100-21199Internal data access error.There is no other information shown though for this message.Has anyone else come across this? If so, what was the fix?
Posted
by
Post not yet marked as solved
3 Replies
1.3k Views
Hi,In short:1. Is the 'is_in_intro_offer_period' field in the local receipt will be 'true' if the subscription is in the trial period?2. What is the right way to define from local receipt (not using server and verifyEndpoint) if user has used trial period for a subscription group?More detailed:We use auto-renewable subscriptions in the app. It's required to define if user is eligible for a free trial or introductory price to display correct price in the app. It seems that it's possible with the help of 'is_in_intro_offer_period'field from local receipt (Receipt Fields documentation, is_in_inrto_offer_period documentation). 'Trial' is one of the Intro Offer Period types ("The offer types are “pay as you go”, “pay up front”, and “free trial”" from documentation), so it's expected that the 'is_in_intro_offer_period' field will be 'true' if subscription is in the trial period. All our tests showed that both local and remote receipts for subscriptions in the trial period always contain "false" in the "is_in_intro_offer_period" field.The first question is why the 'is_in_intro_offer_period' field is not 'true' when the subscription is in the trial period? Does it mean that 'is_in_intro_offer_period' relates just to the 'Pay As You Go' and 'Pay Up Front' offer types? If so, it should be mentioned in the documentation.We've planned to use 'is_in_intro_offer_period' from local receipt to define if user is eligible for a free trial price. But:1) the 'is_in_intro_offer_period' field is not 'true' when subscription is in the trial period (as written in the first question)2) the 'is_trial_period' field is not presented in the local receiptSo the second question is how to define if a user is eligible for a free trial using just local receipt? (I understand that it's possible to use the 'is_trial_period' field from the 'verifyEndpoint' JSON, but the question is if it's possible to do it locally)Here is an example of JSON from verifyEndpoint for real subscription that is in the trial period with "is_in_intro_offer_period": "false".{ "auto_renew_status": 1, "status": 0, "auto_renew_product_id": "com.companyName.subscription.onemonth1", "receipt": { ..... }, "latest_receipt_info": { "is_in_intro_offer_period": "false", "is_trial_period": "true", "product_id": "com.companyName.subscription.onemonth1", "subscription_group_identifier": "20483890", "quantity": "1", "web_order_line_item_id": "430000223503827", "transaction_id": "430000604899999", "purchase_date_ms": "1584597149000", "purchase_date_pst": "2020-03-18 22:52:29 America/Los_Angeles", "purchase_date": "2020-03-19 05:52:29 Etc/GMT", "expires_date": "1584856349000", "expires_date_formatted": "2020-03-22 05:52:29 Etc/GMT", "expires_date_formatted_pst": "2020-03-21 22:52:29 America/Los_Angeles", "original_transaction_id": "430000604899999", "original_purchase_date_ms": "1584597149000", "original_purchase_date_pst": "2020-03-18 22:52:29 America/Los_Angeles", "original_purchase_date": "2020-03-19 05:52:29 Etc/GMT", "unique_vendor_identifier": "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE", "unique_identifier": "aaaaaaaaaaaaaa5aaeaeeaddaafaaaaaaaaceaaa", "bvrs": "395", "bid": "com.companyName.appName", "item_id": "1439222222", "app_item_id": "123456789" }, "latest_receipt": "e.....=" }
Posted
by
Post not yet marked as solved
4 Replies
1.4k Views
Hi, Our software helps personal trainers deliver better training experience to their clients.  Personal trainers as well as their clients can use the software to log workouts, track progress, build plans, chat with each other etc. One big part of our business is to build white-label apps for fitness businesses. With this solution fitness businesses can get their own branded apps in the app stores. Apple has recently started rejecting our white label apps because it seems we are breaking “3.1.3(b) Multiplatform Services” guideline. As per the guidelines we have to provide in-app purchase options if the app allows users to consume services bought elsewhere. The service in our case is the 1-on-1 personal training. Here are few reasons we think we shouldn’t be forced to implement in-app purchase option inside the app: The app is an add-on and not a major part of the service that is delivered. Here are some of the things a personal trainer delivers after a client buys a personal training package: Take assessment in person. Design workout plans Take clients through a workout in-person or over a Skype call. Teach them correct exercise form. Design nutrition plans. In person review session All of these things are delivered outside the app.  Moreover guideline 3.1.5(a) specifically prohibits the use of in-app purchase for goods and services that are delivered outside of the app. 2. After our appeal was rejected, we have included a “free signup” option inside the app. Using that option anyone can create a free account and use the app free. All the clients features are unlocked. We thought that adding this will show that the app is free and we only charge for 1-on-1 personalized service that is delivered outside the app. But in the end we were not successful in getting the app approved. 2. Recently “Hey App” was rejected for similar reasons (3.1.3(b) Multiplatform Services) and they were finally approved after they added a temporary free email account in the app. Not sure why our app is getting rejected even after adding a free signup option. 3. All major Gyms like 24-hour fitness have their app available in the app store and their app is available only to their members. There is no way to buy the gym membership or personal training package through in-app purchases. So how is our app different? 4. How is our app different from an app built for physical therapists or doctors? Should they provide in-app purchase options? 5. All the personal training packages are custom made and vary from one user to another. Also, a trainer will have to go through an assessment before they can decide on a package that is right for a client.   Do you guys think we have valid points? If yes, then how do you suggest we move forward with Apple review. Our Appeal was rejected and there is no way to move forward. Is there a way to talk to the Apple review board over the phone and explain the situation. Is there anyone here who can help? Thanks, Manobal
Posted
by