Question: The [Apple docs](https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateLocally.html) on receipt validation say to perform receipt validation immediately after launch. This amounts to checking for data at the path returned by `[[NSBundle mainBundle] appStoreRecieptURL]`, refreshing via `SKReceiptRefreshRequest` if it's not there, and validating it. The aforelinked docs reference both iOS and macOS.

Is it actually *necessary* on iOS? If so, why? Is it to prevent users from using my app on a jailbroken device, or without having bought it from the app store (in which case I probably don't care if my app is free)? Or does it have implications for other operations like restoring or validating in-app purchases? For example, does the receipt data have to be there already in order to validate a transaction for an in-app purchase?

Note: I am not using in-app subscriptions. I have in-app purchases, but I don't use the receipts from them after verifying them and recording the purchase server-side.

Answer: 
The simple answer to your question is **NO, It is not necessary**.

Here is the **detailed explanation** for you.

1. According to Apple Documentation [here](https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Introduction.html), apple has given two methods of validating the receipts, they are given it as guidance only to prevent unauthorized copies of your application from running. For more guidance apple has pointed towards the apple review guidelines.
2. In the review guidelines [here](https://developer.apple.com/app-store/review/guidelines/#intellectual-property), Apple does not mention anything related to the verification of receipts as mandatory.

If at all the receipt validation is mandatory, Apple would have provided a simple API to validate it.

Titbit: You can see a lot of rejections when it comes to app store receipt validations. But all those issues are because the receipt validation is not done properly.

But my personal recommendations will differ from the above answer. First thing for you to consider is "Never underestimate hackers". Validate the receipts several times apart from the start of the app. Read [this](https://www.objc.io/issues/17-security/receipt-validation/) article for more information.
It's not necessary, but beneficial for the following reasons:

1. You'll always get the definite set of purchased products and not require the user to manually restore the products.
2. You have (limited) fraud protection, especially if you combine local and remote validation.
3. It's way more simple to compute the expiration date for automatically renewing subscriptions using the recipe.