Regarding Deprecation
Since this question is technically asking how one should go about addressing the deprecated attribute its fair to assume that the OP is still deploying on an iOS version less than 7. Therefore you need to check for the availability of the newer API rather than calling it blindly:
Objective-C
Edit
As pointed out in the comments you can't use the respondsToSelector on NSBundle since that API was private in previous iOS versions
NSData *receiptData;
if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0) {
receiptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];
} else {
receiptData = transaction.transactionReceipt;
}
//now you can convert receiptData into string using whichever encoding:)
Swift
Since Swift can only be deployed on iOS 7 and above we can use the appStoreReceiptURL
safely
if let receiptData = NSData(contentsOfURL: NSBundle.mainBundle().appStoreReceiptURL!) {
//we have a receipt
}
Regarding Receipt Validation
The newer API the receipt now contains the list of all transactions performed by the user. The documentation clearly outlines what a receipt looks like:
Meaning that if you really, really wanted to, you can iterate through all the items contained in the receipt to validate against each transaction.
For more on receipt validation you can read obc.io
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…