29

我正在使用此代码进行应用内购买,取自 RaywenderLich 的教程。

// 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 中弃用

如何解决?

4

3 回答 3

23

关于弃用

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

Objective-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 收据现在包含用户执行的所有交易的列表。该文档清楚地概述了收据的外观:

收据大纲

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

有关收据验证的更多信息,您可以阅读obc.io

于 2014-12-19T08:46:12.470 回答
17

替换为:

[NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];

转换NSDataNSString之后......

于 2013-10-30T13:17:51.897 回答
10
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
if(!receipt) {
 /* No local receipt -- handle the error. */ 
}
NSString *jsonObjectString = [receipt base64EncodedString];
于 2014-02-24T03:08:39.683 回答