Related
On a fresh app install, when I try to re-purchase an item to re-download it my app sends a purchase request to Store Kit.
Then I get SKPaymentTransactionStatePurchasing, and Store Kit prompts the user to confirm the purchase.
Then Store Kit responds with this message on iOS 7: "You've already purchased this in-App Purchase but it hasn't been downloaded.".
Then, Store Kit fails with SKPaymentTransactionStateFailed and error is
Previously StoreKit would just let the user re-download the content instead. But now it fails with error code 2 "Cannot connect to iTunes Store". If I do a complete restore then Store Kit allows to download content, but this particular item still fails. Also note the test device has WiFi and stable internet connection and StoreKit was able to resolve that the item is purchased. So this error is bogus.
Is this a new change in iOS 7? How can I let the user re-download a single item without forcing to re-download all?
According to this Technical Note, the problem occurs if there is a purchase transaction that was not finished. I tripple-checked that I call finish transaction and it happens after I get the error. So the transaction does get closed.
You have some unfinished transactions in the payment queue. To finish them check the paymentQueue.transactions array right after adding your observer with addTransactionObserver: method. If it contains some transactions handle them the way you do in your paymentQueue:updatedTransactions: method.
If you don't, paymentQueue:updatedTransactions: is not called for them because they were already in the queue when you have registered the observer.
By the way, make sure you call finishTransaction: for all of your transactions even if they have failed. Otherwise they will stay in the payment queue and cause this issue.
Same problem here.. we launched a new update for our app after iOS 7 release. We have many users now complaining that they are either unable to restore previous purchases. Other users are complaining that their purchase is successful, however the IAP package does not unlock with no error message.. we are a bit baffled here.
I had same problem ! After checking for hours! I just restarted the I pad (iOS7), and now again its working.
I fixed this by signing out the test account from the App Store via Settings app -> App Store -> Sign Out. Then I removed the test account from iTunes Connect, then I rebooted the device.
I was in a similar situation; resolved by restarting my iPhone. Specifically, I had non-consumable purchase hosted on Apple's Server. Installed app to iphone5, made purchase. Deleted App, reinstalled in another build, and upon restore, ITunesStore server didn't respond with my hosted-contact productIdentifier. Purchasing the item again produces "already purchased" error, without an option to download. I found this site, http://support.nimblebit.com/customer/portal/articles/672080-problem-making-in-app-purchase-ios-os-x; restarted my device, and restore now recognizes the previous purchase.
I am new in ios developement .I added an in-app purchase to my app, and I get the products data from the appstore successfully. the iap is a consumable.When I call the "addPayment:" method, I get the "Confirm your in-app purchase... [Environment: Sandbox]" question. I click Yes, and then I get a message which says:
"You've already purchased this but it hasn't been downloaded. Tap OK to download it now. [Environment: Sandbox]".would be very grateful if anyone had any ideas whats wrong?
This happens when the user is making a purchase on something they have already bought. Given that you are working with a consumable, you need to make sure you send a consumption/provisioning request to the Apple purchase servers when you give the user what they bought.
I was in a similar situation; resolved by restarting my iPhone (holding home/power buttons until the white-apple-logo-on-black-background appears).
Specifically, I had non-consumable purchase hosted on Apple's Server. Installed app to iphone5, made purchase. Deleted App, reinstalled in another build, and upon restorePreviouslyPurchasedTransactions, ITunesStore server didn't respond with my hosted-contact productIdentifier. (Although it did respond and restore some other test purchases that were non-hosted). Purchasing the hosted-content item again produced the error "You've already purchased this In-App Purchase but it hasn't been downloaded."; the alert was without an option to download. I found this site, http://support.nimblebit.com/customer/portal/articles/672080-problem-making-in-app-purchase-ios-os-x; restarted my device, and restore now recognizes the previous purchase.
I don't know exactly what triggered this problem, but note that I had been performing extensive testing on the downloading of this hosted-content item, debugging and ending the program before downloads were complete. I had code in place, upon startup, to spot unfinished transactions and finish them. So FinishTransaction was eventually called. At the time of this error, there were no outstanding transactions in the paymentQueue. My only guess is that abruptly killing an app at some point in the download process leaves a flag intact on the device that the item is being downloaded and so is not available to restore, which if this is the case, fortunately gets reset upon restarting the device.
Have you uploaded content?
This In-App Purchase is not currently available for testing in the sandbox environment because you have chosen to host your content with Apple, but have not delivered your content. Upload your content to test this In-App Purchase in sandbox.
Does anyone have any ideas on how to reset and/or clear the iOS in-app purchase sandbox?
I have an app that I'm testing with the sandbox, and I'd like to test new purchases without having to create a new test user every time I purchase something.
If I don't do this, then I (of course) always get a message that the in-app purchase item has already been purchased when I click on my app's buy button.
IMO there are 3 things you can do to make testing non-consumables bearable:
You can have many test accounts associated to one email. Gmail for example lets you add a "plus" string to the email to create aliases for an address: so tester+01#gmail.com and tester+02#gmail.com both really just go to tester#gmail.com. Probably other email hosts do the same. When you create a test account you need to introduce: first name, last name, email address, password, secret question, secret answer, date of birth, and iTunes store country. You can put exactly the same data (including password) for tester+01#gmail.com and tester+02#gmail.com and you will have two test accounts. Finally, in your tester#gmail.com inbox you will receive two verification emails from Apple to confirm both test accounts.
Say that you have a non-consumable with product ID #"Extra_Levels". Instead of writing #"Extra_Levels" in all methods (requestProduct, purchaseProduct, ...), just write PRODUCT_ID1 and at some header file put #define PRODUCT_ID1 #"Extra_Levels" (with no semicolon!), then the preprocessor will search PRODUCT_ID1 and substitute it for #"Extra_Levels". Then creating a new non-consumable called #"Extra_Levels_01" and changing the #define will be as good as resetting the purchases for all your test users.
As appsmatics pointed out, you can test the correct behavior of your code when you buy a non-consumable IAP by first using a consumable IAP (so that test user can make as many purchases as needed) to get rid of some bugs. Of course, you should also test the code with the real non-consumable IAP after that.
You can't do this, as far as I know. The sandbox backend works like a real account-- once it's purchased, it's purchased (and thus you can test restore). You should do most of your development with the store stuff shimmed out, and then when you get to testing it for real, just expect to create several test accounts.
You can clear the purchase history for a tester so that you can continue to use the same sandbox Apple ID for ongoing testing. Clearing purchase history will delete all past auto-renewable subscriptions and non-consumables purchased by the selected testers in the sandbox environment. In-app purchases made by customers on the App Store are not affected.
To clear tester purchase history:
From Users and Access, under Sandbox, click Testers.
Click Edit.
Select the checkbox for each tester you want to modify and click Clear Purchase History.
Click Clear Purchase History in the dialog that appears.
Sandbox Apple IDs with a high number of purchases may take longer to clear. This action cannot be reversed.
I have 2 in app purchase items.
1 for production.
and the other for testing. when I need to "clear" I delete the in app item and create new one (15 seconds in itunes connect and 1 second to change the product id in code)
if i dont need to test "new user", i use the production in app item.
Deleting your app and reinstalling works also for sandbox testing. Depends on the app obviously, but I'm testing a subscription based app that only purchases during sign up at the moment so it's been the easiest solution.
Well, technically you don't need that.
If you get SKPaymentTransactionStateRestored, it is 100% equivalent to the app store verifying the user and granting him the purchase. I have a switch like:
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
for( SKPaymentTransaction *purch in transactions )
{
switch( purch.transactionState )
{
case SKPaymentTransactionStateRestored:
info( "PURCHASE RESTORE" ) ;
// fall thru
case SKPaymentTransactionStatePurchased:
[[SKPaymentQueue defaultQueue] finishTransaction:purch];
// Do regular changes to app state for this purchase,
// register in keychain, etc.
break ;
//.. other cases
}
}
}
The question of having your app logic / take back the purchase is simple: if you're caching purchases in keychain, delete your keychain. If you're doing it some other how, just change your local app state to pretend like the user never purchased it before. The request to purchase dialog is still exactly the same, the only difference is when you punch YES, it gives you SKPaymentTransactionStateRestored instead of SKPaymentTransactionStatePurchased.
You can clear the purchase history for a sandbox Apple ID in App Store Connect.
To clear tester purchase history:
From Users and Access, under Sandbox, click Testers.
Click Edit.
Select the checkbox for each tester you want to modify and click Clear Purchase History.
Click Clear Purchase History in the dialog that appears.
see Documentation https://help.apple.com/app-store-connect/#/dev7e89e149d
Check out SimStoreKit. It's a "simulated version of the iPhone's StoreKit, for testing store UIs on the iPhone Simulator, or even on device without having to set up IAP in Connect."
SimStoreKit stores purchases in the user defaults under the key ILSimSKTransactions. So to clear all purchases you can do:
[[NSUserDefaults standardUserDefaults] removeObjectForKey:#"ILSimSKTransactions"]
On the simulator, you can simply remove your app and install it again.
I've successfully used SimStoreKit to debug my app's store front before testing with the sandbox. The beauty of this library is that it can be set-up to use the same class names as the real StoreKit framework (by doing #define ILSimReplaceRealStoreKit 1 before doing #include <ILSimStoreKit.h>).
In source files where I need to access StoreKit, I include this header file:
#import <TargetConditionals.h>
#if TARGET_IPHONE_SIMULATOR
#define kILSimAllowSimulatedStoreKit 1
#define ILSimReplaceRealStoreKit 1
#import <ILSimStoreKit.h>
#else
#import <StoreKit/StoreKit.h>
#endif
This has the effect of using SimStoreKit when I run on the simulator and the real StoreKit when I run on the device.
This is now possible for subscriptions purchases through Reset Eligibility
On the test iOS device, open Settings > Apple ID > Media & Purchases (or iTunes &/or App Store for iOS 13 and earlier). Under the Sandbox Account section, tap your highlighted Sandbox Apple ID then tap Manage to open the sandbox Subscription Management page.
If the subscription has expired, tap one of the options to resubscribe.
Once you resubscribe or when you have a subscription going on, you can use the Reset Eligibility button to reset and redeem another introductory offer (trial or discounted price).
Just keep using the same test account, restoring purchases as opposed to completing new ones. After all, whether you start a new purchase or restore an old one, YOUR APP will do the same thing (at least initially, maybe the user interface will update differently upon completion). Apple are the folks handling things differently in those different situations - don't worry about it.
Place your delivery logic in the SKPaymentTransactionStateRestored case within this method's implementation for testing:
- (void)paymentQueue:(SKPaymentQueue *)queue
updatedTransactions:(NSArray *)transactions;
Then be sure to put that delivery logic into the SKPaymentTransactionStatePurchased case.
At the end, because most of us are obsessive-compulsive to varying degrees, do a final test with a fresh account (not a big deal to make a second one for absolute certainty).
The final thing to note: consider apple's position. If there was a problem with developers having to waste time creating tens or hundreds of accounts to test IAP thoroughly, they would have solved the problem. There is no problem.
alternatively to create multiple test user solution you can create multiple test in app purchases in iTunes connect then you don't need to change a user account.
Bug reported as fixed by Apple, see accepted answer below ...
UPDATE MON AUG 23rd 10:00 GMT
Although the bug report with apple hasn't been closed yet, it now seems to be working (at least for a couple of us) OK. It could be they have nailed it, or the fix is in testing, and I'll report back when (if) I hear anything more from Apple.
UPDATE FRI AUG 20th
Just to say I've had an email back from Apple Engineering (21:20 GMT) and they have said:
"Thank you for reporting this. We're aware of this issue and are currently working on a fix."
So hopefully there will soon be a resolution!
[ update to question below. There definitely seems to be a storekit sandbox issue at present. I've seen 4 or 5 other people report the same fault, but would appreciate a larger sample size! If you have a storekit implementation that you can test in the sandbox if you could report whether or not it works for you that would be much appreciated. I've logged a bug with apple as bug id#8329461 but am not sure how else to expedite this or if it is really a widespread issue. ]
I have a working iPhone storekit implementation in development. All the items for purchase are consumable, we have multiple test accounts established.
All of a sudden today, my sequence goes;
1) Request product list from Apple ... works fine (so can connect to store OK)
2) Purchase item - get "Confirm your In App Purchase" alert as normal
3) (click buy)
4a) My code gets a failed transaction with error code 2 and description "cannot connect to itunes store" via the - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions method.
[[SKPaymentQueue defaultQueue] finishTransaction: transaction] is being called in this situation.
4b) The user gets an alert "You've already purchased this but it hasn't been downloaded" (it has never been purchased on this device with this user account).
This is happening on different devices and with test accounts that have never been used before. I'm not aware of any changes to our code. Can anyone else confirm that the storekit test framework is working correctly for them? Is anyone else having issues today?
Any ideas as to what causes this strangeness? The message "cannot connect to itunes store" seems odd given it clearly can for retrieving product ids and watching the transaction.
NB. I also note that setting up test user accounts in the store has changed - there are now stricter password requirements etc and so I'm wondering if Apple have changed something that might be causing the issue.
TIA
Roger
PS. On a first attempt on a new device, I get the alert "unable to connect to itunes store try again later" but then what happens is that the device thinks it has already been purchased so gives the message about downloading again.
Just had a final update from Apple closing the bug.
This is a courtesy email regarding Bug ID# 8329461.
Engineering has provided the following feedback regarding this issue:
We believe this issue is now resolved. Please let us know if you have any problems.
I've also been plagued by this problem. I had a fully functional In App Purchase working fine. I later uploaded a new binary and approved it. I made some other changes to the app, and also used a foreign "IN APP" purchase User, attempted to sign-in in Settings. Later when I tested it again, itt was no longer working. The error I got was "Unable to connect to iTunes", "Error Domain=NSURLErrorDomain Code=-1009". Pulled lots of hair out. I was able to fix it by signing out of iTunes account on the iPhone, "cleaning all targets", AND also signing out of iTunes on my MAC, (I closed iTunes), creating a new "local" In-App" user (necessary?). Attempted to sign into that account on my iPhone. Then it started working! Some of the above may be voodoo, but it worked. Hope this helps a few people.
I am also having the same issue. As of a couple days ago it seems. I am on iPad. Exactly the same description as Roger wrote.
Tried the Erase All Content and Settings on the iPad. Didn't work. Tried on several networks. Seemed like at first I was having a real slow connection. Took a long time to get a response from the store with the product info. As of today, I am connecting very quickly to the store but still having the same error after being notified that I have already purchased the product. Created new users, everything. No go. I've gone through all the code and it looks fine. Definitly seems to be a problem with the Sandbox side. Hope to see an update on this thread soon.
Edit
For now I am just skipping the purchase request and calling my provideContent: method when when choosing to make a purchase. Since the store is still providing me with the products, I can keep testing and working on the content providing aspect but it sure would be nice to get this working.
After announced "fix" by apple still have this trouble. It's feels like purchase transaction just falls off while test user input his credentials. But when test user is already logged in, everything is OK.
Either [SKPayment paymentWithProduct:product] nor [SKPayment paymentWithProductIdentifier:product.productIdentifier] works with logged out user in spite of products request was successful.
Does anyone have any workaround?
I've been going nuts over the same issue all morning in Lion and MacOS (not iPhone). The sandbox is not working.
I just got "An unknown error has occurred" when trying to make the purchase and a console error like this one
8/23/11 1:12:26.090 PM storeagent: promptResponse: <CKSignInPromptResponse:0x7fe1c14fb2a0 returnCode:-1>
If there is another poor soul like me out there that has been burning their brains out for hours to make this work I just found the answer: the in-app purchase sandbox is ONLY working for US test users. Other stores are not working (my test user was set to Argentina...). Create a new Test user, set it to the US store, and it will work...
I hope this helps.
For anyone having an issue similar to: "Cannot connect to iTunes Store" make sure to log out of your Apple ID in the iTunes & App Stores in settings and to try using a test account attached to your iTunes Connect account with access to your app and in app purchase
I am working on adding In-App purchases to my app.
I am able to receive the productsRequest:didReceiveResponse method, and receive the array of products.
My problem arises when I add a SKPayment to the SKPaymentQueue. After I add the product to the queue, in the paymentQueue:updatedTransactions method the transactions always have the state SKPaymentTransactionStateFailed.
I NSLog the "transaction.error" and this is what it returns: Error
Domain=SKErrorDomain Code=0 UserInfo=0x165000 "Cannot connect to
iTunes Store"
I have logged out of the Store in the Settings app, but after trying to purchase a product in my app it never asks me to log in with my test account. It just fails with the above error.
I was getting SKPaymentTransactionStateFailed error code 0 "Cannot connect to iTunes Store" and thanks to thomax for this answer my problem is solved. Turns out you MUST enter a build number under Targets->Summary.
I spent the last 24 hours resetting my phone, screwing with iTunes connect, and doing just about everything i could think of before i stumbled upon this solution.
I assume you've done the standard sanity checks: double-checking your code, confirming your product IDs, comparing your code to the In-App Purchase Programming Guide, etc.
This may be ridiculous, but -- if you're certain your code is correct -- do a hard reset (full wipe) of your iPod (Settings => General => Reset => Erase All Content and Settings). I puzzled over this exact problem for hours -- it turned out my code was correct and the hard reset was the solution.
I had been getting the same error but I had been prompted for my test user account. And also a popup saying "An unknown error has occurred". It turns out that when I created my test user account and signed out of the settings -> store I had decided to sign in with my test user account which had prompted me for a bunch of information including billing, which had broken my test user account. When I created a new test user account and only signed in when prompted to during the in app purchase testing, everything worked smoothly.
This error (i.e. "Error! Cannot connect to iTunes Store") can occur if you do a sandboxed In App purchase but are signed in using your normal Apple account.
I find it helps avoid any confusion if I sign out of my Apple account before doing any In App purchases. Then in the "Sign In" dialog choose the "Use Existing Apple ID" option and enter your Test User details.
Just remember this will be set in your Settings so you will need to sign out after you've finished In App purchases.
Also, using a different Apple ID resets various iTunes-related settings such as iTunes Match.
You can check if the following link is working or timing out:
https://sandbox.itunes.apple.com/verifyReceipt
Alternatively, an unscientific but quite reliable way to check if the sandbox is working is to ask at:
https://devforums.apple.com/community/ios/connected/purchase
If the sandbox is down, there will probably be people already talking about it, like now (18 Jan 2012, 6:40pm UTC time).
I also was facing with the same error.
I figured out, that the Error only comes on the Simulator, when I switched to the device debugging, the error didn't appear.
Simply log off from your AppStore account on settings...
Solved the problem for me because my device was logged using my regular Apple ID and because the purchases on the sandbox are always done with the test user ID, the device was trying to send my regular Apple Store ID to the "test" App Store resulting on this "Cannot Connect to iTunes Store" error.
This is the most common cause I have seen on my device.
Hit with the same problem, i reset my device, cross verified the identifiers, re-installed the app. Also thought the problem was, because I had changed the reference and the description of the products. In reality, I feel it is because my test user had got locked as multiple people where using the same account, and it is a possibility that the password validation failed multiple times.
So I re-created another test user and in-app purchasing is back to working.
Hope this helps. I was totally stumped with this error.
Make sure your BundleIDs match. That was my problem.
Even a full restore did not resolve this problem for me.
After calling addPayment for an auto-renewing product identifier, about one second passed before I received the "SKErrorDomain Code=0" error from StoreKit. At no point was I prompted (as Apple's documentation suggests one should be) for an iTunes Store username and password; the transaction simply failed.
To resolve this, I had to add a fake "consumable" product to iTunes Connect and call addPayment using the fake consumable's product identifier. This caused the iTunes Store dialog to come up. I then logged in with a test account I had created in iTunes Connect. This succeeded: my application was notified that the consumable had been purchased.
After having done this, I was able to call addPayment with my auto-renewing product identifier and purchase the subscription normally.
make sure you're testing with sandbox user accounts created from itunesconnect and not your actual apple id for your personal account when testing this stuff.
I thought it worth mentioning that DonnaLea's solution of only logging in when prompted for payment also worked for the same issue with Unity and Prime31's StoreKit plugin.
Attempting to log in via the same settings menu you use to log out will prompt for all manner of billing\address details which seems to permanently "break" that test account.
I found myself in this situation when I was working on adding in-app purchases and didn't do it exactly right the first time. In my case I had an error in server-side PHP and as a result I think I wasn't getting all the way through to "finishTransaction:". Even after I fixed the problems (I put the program on a separate device and purchased successfully), I kept getting "You've already purchased this, click to download" followed by "Cannot connect to iTunes Store".
I finally got it to stop doing that by launching the game from Springboard (not XCode). It immediately processed the transaction successfully and stopped prompting me to redownload.
This is similar to the accepted answer above. I started getting the "cannot connect to iTunes store" error when trying to log in to my iTunes account on my phone after logging in with an IAP sandbox account.
To solve the problem, I was able to just do a Reset All Settings instead of Erase All Content and Settings (Settings => General => Reset => Reset All Settings). Definitely better than having to lose and reinstall everything on your device.
I had had the same problem, first of all I haven't created test account so I created via getting help from this link
https://developer.apple.com/library/ios/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide/Chapters/SettingUpUserAccounts.html#//apple_ref/doc/uid/TP40011225-CH25-SW10
Then You need to sign out from your current account on your device. and buy purchasing it will ask for user account, then enter the test account.
I had this same issue. I had previously created a test user account, and signed out of the itunes store expecting to be prompted with a sign in for my test user account when I made the in app purchase. instead I got the cannot connect to itunes store message. when I signed in with my real itunes username/password and tried my test app it worked perfectly. I then logged out of itunes store again and my app worked great, prompting me for my id/pw
I had the same error, but the problem was not exactly the same. Maybe usefull for someone:
I inserted an external file in the structure of my app. The reason why I did this is because in production, I insert this file dinamicaly from a server, but in development I thought it was faster to use an app called iExplorer to paste this file. I have done this is the past and I didn't have this problem. But in the last few days, if I paste this file directly using iExplorer, my app returns the error: "Cannot connect to iTunes Store". (in spanish: "No puede conectarse a iTunes Store").
I think that it is because this time I inserted the file inside the .app folder. So this makes me think that if you modify your .app folder in any way, the Codesignature breaks and the link with the iTunes Store stops working directly.
For me, the problem was fixed by uploading a binary. Since that answer was not given in this page, which seems to be among the top hits in Google, I thought I'd add it.
Figured I should share my recent experience with the same issue:
I experienced the same problem a few days ago, where it stopped working from one day to the other. I got the following error after having authenticated with my test user(s): Error Domain=SKErrorDomain Code=0 UserInfo=0x165000 "Cannot connect to iTunes Store"
I hadn't done any changes to the code and we couldn't think of any other changes to our iTunes account or IAP products that might've triggered the problems. The only thing that may have been related was the adding of more iTunes Test Users (although I've added ~15 accounts before without problems). I tested it on different devices and the simulator.
I went through all the available checklists and all possible solutions (everything mentioned above as well) without any success. Finally I figured I might as well take a break from it all over the weekend, since I was drawing blanks. And oddly (and for the first time ever), doing nothing actually worked!
I didn't change any code, nor did anything change on our iTunes account or the app.
The only reasons I can think of are:
Something was wrong on Apple's end.
Some other time-based factor with the app, a certificate or something caused the problems.
A leprechaun snuck into my office and fixed the issue.
Check if you are signed into your personal itunes account in the appstore. If you are you will receive this message. Even if you are signed into your sandbox account in the app. So, to resolve this issue sign out of your personal account in the app store and then try to purchase your in-app item and then use your sandbox account. This resolved my issue.
Well, as usual I "tried all solutions available and it didn't help" :)
So, here is my input to this unlimited collection of stumble stones:
If application is not currently on sale (at any reason), this error occurs.
I got the same error,
When I called SKProductsRequest's start method in my test env,
It ran in
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error
When I called in my production env,
It's correct and ran in
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
Close charles or any http proxy software asap!
Close charles or any http proxy software asap!
Close charles or any http proxy software asap!
You know it~
I had had the same problem, but I solved by the following mode:
- I was using iPhone 5S emulator with iOS 8.4 (This is the most important. Apple Store connection is not working on iOS 11 emulator)
- on emulator I turned on the following setting: Settings/Developer/Allow HTTP services (This is for internet connection)
- temporarily I turned off Avast antivirus Web Shield (This is for internet connection too)
The In-App Purchase FAQ has this information:
Cannot connect to iTunes Store
The "Cannot connect to iTunes Store" issue may be due to one or more of the following reasons:
The sandbox may be unreachable.
Your app does not have a bundle version (CFBundleVersion). See Setting the Version Number and Build String for more information.
Your app is running in the Simulator, which does not support in-app purchase.
You are attempting to purchase a product that is unavailable for sale. See Query the App Store for product information before presenting your app’s store UI for more information.
In my case, the error occurred because I was using the simulator.
Even in the In-App Purchase Programming Guide says to use the development iOS device has a suggested testing step.
As Apple's Documentation:
Cannot connect to iTunes Store
The "Cannot connect to iTunes Store" issue may be due to one or more of the following reasons:
The sandbox may be unreachable.
Your app does not have a bundle version (CFBundleVersion). See Setting the Version Number and Build String for more information.
Your app is running in the Simulator, which does not support in-app purchase.
You are attempting to purchase a product that is unavailable for sale. See Query the App Store for product information before presenting your app’s store UI for more information.
https://developer.apple.com/library/content/technotes/tn2413/_index.html
I have tried all what I can to deal with this issue.
Real device not Simulator.
New registered Sandbox test account (not fill the extra info to make it a formal Apple ID)
Logout whatever accounts related.(iCould, App Store, maybe other app's sandbox testing account)
Fill all the tax and Agreements in itunesconnect website
Even restore to factory settings LOL
...
always return SKErrorDomain Code=0
“Cannot connect to iTunes Store”
...
My case's solution is finally come tome after 3 days' struggle:
And finally I find the key. Try with another device to test the iAP if your device's iOS is iOS13.4.x!!!And I upgrade this ”broken“ device's OS version to iOS14.0.1, iAP works like a charm.