IAP purchase failed on device, but success on simulator - ios

On iPhone simulator, I could go through and successfully finished IAP.
However, on my device, It would return at switch-case "SKPaymentTransactionStateFailed" and failed to purchase. Even I deleted the app and tried again, it still does not work. The error msg(transaction.error.localizedDescription) is: "Cannot connect to iTunes Store"
How to fix this issue?

Probably you are logged in to a production App Store account, and that prevents your app from completing an IAP from the sandbox environment.
You have to logout of your account. Go to your device Settings -> iTunes & App Stores, tap your ID and logout. Then launch your App through Xcode. When you perform an IAP, the sandbox App Store login window should come up. You can login there with any Test User previously created on iTunes Connect.

It is a temporary problem with Apple servers. Recently there were various problems with Game Center (often returning error 404) and In-App Purchases returning "Cannot connect to iTunes Store" and sometimes even proceeding with the transaction afterwards. Try it multiple times, it will work (if you have your code right of course).

Related

How do I test In-App Purchase in iOS 12 using sandbox account?

I am no longer able to test In-App Purchases with Simulator for iOS 12. I didn't have this problem before.
The instructions say for me to log out of iTunes and App Store in Settings, and when I test the In-App Purchase, iOS would ask me for an Apple ID. I have done that, but iOS never asks for an Apple ID. Instead I get an error object in my code that says "Cannot connect to iTunes Store". (It doesn't terminate the app. I was able to successfully print the description of the error object in the debug window.)
When I try to put my sandbox account in the iTunes and App Store account setting, I get a message that says, "There was a problem connecting to the server."
You can display IAP products on both the iOS simulator as well as physical iOS devices, but to test buying or restoring purchases you've always needed a physical device.
On iOS 12, you can set a default sandbox user in Settings -> Your Account -> iTunes & App Store -> Sandbox Account. This can help out with the sign in prompts and save your phone from having to change accounts repeatedly.

iOS IAP Cannot connect to iTunes Store

I am testing my app in Xcode . witch means it is not officially up loaded to the appstore. so I can't test the real IAP right? I can only test the sandbox IAP before it officially online in APP store,right?
because when I use the real app id to test the IAP. it always give me error like:
_error NSError * domain: #"SKErrorDomain" - code:
#"Cannot connect to iTunes Store"
I have checked every thing, all fine. and the sandbox test was also worked fine. so the only reason of the error is the app are not officially online in apptore , am I right?
IAP can be tested only in sandbox mode with sandbox(test) user account in device.
If you are testing IAP in a sandbox mode with real iTunes apple account in the device, then the error Cannot Connect to iTunes Store is shown.

Unexpected login prompt for test user in iOS sandbox

I am testing in-app purchase and restoration. Testing was going fine until I tried to switch test users.
I mistakenly tried to sign in via Settings ("iTunes & App Store"), where I signed out as Test User 1 and started to sign in as Test User 2. When the App Store gave me "This Apple ID has not yet been used in the iTunes Store, etc." and prompted for my credit card information, I realized my mistake and cancelled the sign-in.
But now every time I run my app via XCode, it prompts me to "Sign In to iTunes Store" as Test User 1. I cancel it and then everything proceeds normally. But I would like to get rid of this weird behavior.
I have tried signing in. That doesn't stop it. Then I tried going into Settings ("iTunes & App Store") and signing out. That also doesn't stop it. Also tried rebooting phone and then a hard reset.
This problem went away overnight. It may have beeen a caching issue with the sandbox and/or App Store.

Testing In-App Purchase on iPhone

I have setup my app to use In-App Purchases. All the necessary steps have been done and everything works except for one thing, the final step for completing the purchase transaction i.e. SKPaymentTransactionState always completes with Failed every time.
So I did some research and found another post that said not to test this in the simulator and do it on a physical device as it seems there is a limitation placed on making purchases in the simulator by Apple on purpose.
So I went back to try to run this on my physical iPhone instead. The problem I'm having now is that my physical iPhone is linked to my active iTunes account. When I try to make a purchase on it, the User ID is already defaulting to my active ID and it only asks for my password.
So my question is (1) How do I force the phone to ask for me to enter a new User ID and Password so that I can use the Sandbox User I created in iTunes Connect? (2) I am a little nervous about even entering a secondary iTunes credentials, can anyone validate what the behavior is like? I do not want my active iTunes account to have any issues, it is possible to run both my active iTunes account and the sandbox user on my physical device with no issues?
Log out of iTunes on the phone via Settings, but wait for the app to prompt you to log in before entering your sandbox account credentials. NOTE that I'm referring to iTunes, not iCloud. It gets more interesting if you need to do that.
When you're done testing, log out again via Settings but differently than before, go ahead and re-log in via Settings to your "regular" Apple ID to return to production use.
You can't run them "simultaneously" as such but you can use your regular device to sandbox test without problems.

"Cannot connect to iTunes Store" in-app purchases

I am having problems testing my in-app purchases. I get back valid product identifiers, but upon purchase I receive the dreaded "Cannot connect to iTunes Store". Interesting thing is that restore purchases seems to work - iTunes login pops up.
I have:
- Checked that my in-app purchases are cleared for sale
- Checked, rechecked my source code to be in sync with Apple's documentation
- Added appropiate test users
- app id does not contain wildcard
- in-app purchases are linked to the app (app itself is in developer rejected state, purchases are in ready to submit)
- waited
- reinstalled app, cleaned solution, all the voodoo stuff
Make sure you have signed out of any production iTunes accounts on the device.
I was getting this error on my test phone which was logged in with my actual iTunes account. You cannot test apps using your production iTunes account, hence the error. I just wish Apple provided a better error so as to avoid this guesswork...
see In-App Purchase FAQ: Cannot connect to iTunes Store
Your app is running in the Simulator, which does not support In-App Purchase
For testing in app purchases always use real devices.
For newcomers, make sure your in-app purchasing product's status is Ready to Submit, with no "missing metadata". In my case, what was missing was the localization of the subscription's group.
I've been having this problem and I'm convinced its a bug. I've filed a bug report with Bug Id 10108270
The problem seems to be that the test user is getting 'locked' and may have something to do with attempting to purchase an in app purchase in an already released app with that account.
My workaround was to create a new test user but until Apple get back to me, I can't provide any better solutions. I'll update this answer when I get replies.
This problem remains persistent in 2016. Incredible. Here was my solution:
Add a build number. Target > General > Identities > Build.
This is an old thread that is related to problem I was facing today.
In my case, I was able to test in-app purchases on my device till yesterday but it stopped working today. It turned out that Apple had pushed an 'Amendment for Paid Applications' for me to review and agree to. Once I agreed to the amendment (without reading it, of course), everything started working again. Did not have to create a new test user or any other workaround.
There may be many reasons for in-app purchases to not work but make sure you are correctly set up on itunesconnect or you won't be able to test in-app purchases.
I'm hitting the same issue. For me it happens after this secuence:
Install app on a device logged into a UK account on iTunes
Launch the app and use a test user set in USA
Message is shown saying account is only valid in USA. Closes the app and auto launches iTunes
Open your app again and retry purchase. Receive products but no other callback or error.
I don't know whether this is an issue on the IAP platform but I would like to get an error/callback to handle it in some way in my code.
To carry on testing your IAPs try any of these:
Remove Provisioning Profile in Settings area, remove App and log out from Store in Settings. Then go to XCode and change the signing identities to "Do Not Sign" to then put them back (I know how it sounds :) but try) OR
Hard reset all Settings on your device (Settings -> General...). Obviously you will loose any settings on that device...
Kill iTunes app on the device (multitask menu) and log out from the Store on the Settings
If none of the above work, it might be an issue on IAP platform, see my comments below.
Make sure the system status is ready https://www.apple.com/support/systemstatus/
I have an Iphone, Restart it worked for me
Here the exhaustive checklist if you got this error "cannot connect to iTunes Store" :
Make sure you have a sandbox user created in App Store Connect
Simulator DOES NOT support In-app purchase : test on real-device
The sandbox may be unreachable. Check the Apple System Status
Check that your app does have a bundle version (CFBundleVersion)
Check that the product is available for sale. Did you create it in App Store Connect?
If previous iOS 12, signed out of any production iTunes accounts on the device. Otherwise, you can just sign in within the dev app with your sandbox account.
You may also be getting this error when reusing an old sandbox account you tested a previous IAP on another app with (My scenario). Apple really needs to update the way we test IAPs, I'm running out of emails :0
I was able to purchase in-app on iPhone but not on iPad(11.0.2). I tried with all mentioned solution but none helps. After trying all other possibilities, finally I was able to make it work.
When you create a test account in iTunes connect, don't verify the email id. If it is verified, iap returns "Cannot connect to iTunes" error. It looks strange but it is how worked for me. In iPhone, irrespective of email verification, I am able to purchase using test account.
This error also had occurred when to SKProductsRequest passed wrong NSSet:
Wrong:
let products = NSSet(objects: ["id1", "id2"])
Correct:
let products = NSSet(objects: "id1", "id2")
In my case, I just forgot to handle .failed in transactionState. In particular, SKPaymentQueueue.default().finishTransaction(transaction).
The same issue got for me, and I had checked on the issue including Apple form, I couldn't find a solution.
Today when I checking the device I found that the following
In Device Settings -> iTunes & App Store found another Apple Id logged In.
So I tried signOut that and checked again the InApp purchase, it worked perfectly. So please check the issue is linked to the same or not.
Thanks & Regards,
Unnikrishnan.P
In addition to all the other methods outlined here, if you are working with subscriptions it seems you need to make sure you've generated a shared secret:
"To test or offer auto-renewable subscriptions, you must have a master shared secret or use an app-specific shared secret for each app."
A master shared secret is generated from the 'Shared Secret' tab of the 'Users and Access' section of App Store Connect.
An app-specific shared secret is generated where you manage the in-app purchases of the app itself.
I fixed mine! If you are getting Error Domain=SKErrorDomain Code=2 "Cannot connect to iTunes Store" error, make sure you insert SKPaymentQueue.default().finishTransaction(transaction). It worked for me after I added SKPaymentQueue.default().finishTransaction(trans) in the following:
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for trans in transactions{
if trans.transactionState == .purchased {
print("Successful.")
SKPaymentQueue.default().finishTransaction(trans)
} else if trans.transactionState == .failed {
print("failed!")
print(trans.error)
SKPaymentQueue.default().finishTransaction(trans)
}
}
Found in Apple developer website, here
I had to go to Settings > iTunes & App Stores, then scroll to the bottom to the "Sandbox Account" field and Sign out from there. Now it is working!!!

Resources