不推荐使用的TransactionReceipt

时间:2013-10-30 12:47:22

标签: iphone objective-c ios7 in-app-purchase

我正在使用此代码进行应用内购买,从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中弃用

如何解决?

3 个答案:

答案 0 :(得分:20)

关于弃用

由于这个问题在技术上询问如何解决已弃用的属性,因此可以假设OP仍然在低于7的iOS版本上进行部署。因此,您需要检查新API的可用性而不是盲目地称呼它:

目标C

修改 正如评论中指出的那样,你不能在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清楚地概述了收据的样子:

receipt outline

这意味着如果你真的真的想要,你可以遍历收据中包含的所有项目来验证每笔交易。

有关收据验证的详情,请阅读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];