我正在使用此代码进行应用内购买,从RaywernderLich的教程中获取。
// Encode the receiptData for the itms receipt verification POST request.
NSString *jsonObjectString = [self encodeBase64:(uint8_t *)transaction.transactionReceipt.bytes
length:transaction.transactionReceipt.length];
现在Xcode正在说
'transactionReceipt'已弃用:首先在iOS 7.0中弃用
如何解决?
答案 0 :(得分:20)
由于这个问题在技术上询问如何解决已弃用的属性,因此可以假设OP仍然在低于7的iOS版本上进行部署。因此,您需要检查新API的可用性而不是盲目地称呼它:
修改强> 正如评论中指出的那样,你不能在NSBundle上使用respondsToSelector,因为该API在以前的iOS版本中是私有的
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只能部署在iOS 7及更高版本上,我们可以安全地使用appStoreReceiptURL
if let receiptData = NSData(contentsOfURL: NSBundle.mainBundle().appStoreReceiptURL!) {
//we have a receipt
}
新的API现在收据包含用户执行的所有交易的列表。 documentation清楚地概述了收据的样子:
这意味着如果你真的真的想要,你可以遍历收据中包含的所有项目来验证每笔交易。
有关收据验证的详情,请阅读obc.io
答案 1 :(得分:16)
替换为:
[NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];
之后将NSData
转换为NSString
.....
答案 2 :(得分:10)
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
if(!receipt) {
/* No local receipt -- handle the error. */
}
NSString *jsonObjectString = [receipt base64EncodedString];