iosin-app-purchasetvosreceipt-validation

Apple In-App Purchase and Receipt Refresh


I have a side project and I recently worked on my receipt manager to make it stronger and to relies more on the receipt of the app rather than persistently storing a value after a transaction.

However, there are 2 main points which although I read Apple docs and other answers on the web, I'm still confused about:

1. When a user restore their purchase, does the receipt get refreshed?

I made several tests in sandbox, and I have seen that when restoring, the receipt gets refreshed, and when I verify the receipt through the iTunes server verification, it returns a JSON including the latest transactions. This is very helpful because even if I close/open the app, the app receipt is updated and I can always verify it without refreshing it. However, in production, this didn't work. The app receipt wasn't refreshed after restoring purchases and my users got asked to restore purchases continuously. Can anyone answer on this point?

2. Does the refresh receipt request triggers an alert asking for the Apple ID's password in production?

From the previous point, I thought ok, I will force receipt refresh after a user restores their purchases. However, in development / sandbox, I get asked to insert my sandbox user's pass every time I try to refresh the receipt (although I could restore purchases without a password request before asking for the refresh). I read a lot about this and someone says that might not happen in production. Does any of you have a clarification on this?

Note: I know that when restoring / purchasing I get back a transaction with the receipt, however, I need to use the App Receipt to verify transactions (and this is also what Apple says to do).

Thank you in advance.


Solution

  • After many tests and after I sent my app in production, I'm now able to answer my questions properly:

    1. When a user restores their purchase, does the receipt get refreshed?

    YES, this is immediate as for Sandbox, BUT the problem is that the receipt DOESN'T include non-consumable purchases. This means in other words that the receipt will include the purchased subscriptions, but you won't find purchases of non-consumable products. However, when the user restores or purchases, you get the transactions in return, and you can extract the non-consumable products, and store this info somewhere like UserDefaults or Keychain, so you can use them when the user opens your app. For the rest, the best approach is to always validate and check the receipt when the app is opened.

    2. Does the refresh receipt request trigger an alert asking for the Apple ID's password in production?

    YES. For sure it does the first time.

    Thank you to Daniel and enc for their answers that can still be useful.