If you’re trying to test iOS App Store receipt validation, and you perform a receipt refresh using SKReceiptRefreshRequest, you are almost certainly going to come across the mysterious and enigmatic
SSErrorDomain Error 100. There’s not a lot of information on the googles, so here’s what I know/suspect.
As far as I can tell, code 100 is the App Store’s way of telling you “Sorry, I have no receipt for that bundle ID for that user”. That’s unlikely to happen in production unless shenanigans are underway (a receipt is generated even for a free app ‘Get’), but it can happen often in development. The sandbox App Store appears to have the ability to generate fake receipts when requested, but all ducks need to be in a row for this to happen.
In the sandbox (Development/Ad Hoc builds):
- If you don’t have an app record set up in iTunes Connect, you’ll get a Code 100
- If you’re signed in with your regular Apple ID instead of a sandbox account: Code 100
- If you’re signed in with a sandbox account associated with a different iTunes Connect account: Code 100
The story is a bit different for Apple Testflight builds – these are production builds with special handling for in-app purchases, and the App Store (currently) does NOT generate a fake original purchase receipt. I haven’t tested this myself, but from a developer report on the dev forums (login required):
- If you have a virgin install from TestFlight, you’ll get a Code 100
- If you’ve previously installed the App Store version of the app, you’ll get a receipt
- If you have a virgin install from TestFlight but have made an in-app purchase, you’ll get a receipt
Hopefully this saves others some frustration.