iphone - 弃用的 TransactionReceipt

标签 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' is deprecated: first deprecated in iOS 7.0

如何解决?

最佳答案

关于弃用

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

Objective-C

编辑 正如评论中所指出的,您不能在 NSBundle 上使用 respondsToSelector,因为该 API 在以前的 iOS 版本中是私有(private)的

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

由于 Swift 只能部署在 iOS 7 及更高版本上,我们可以安全地使用 appStoreReceiptURL

if let receiptData = NSData(contentsOfURL: NSBundle.mainBundle().appStoreReceiptURL!) {
    //we have a receipt
}

关于收据验证

较新的 API 收据现在包含用户执行的所有交易的列表。 documentation清楚地勾勒出收据的样子:

receipt outline

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

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

关于iphone - 弃用的 TransactionReceipt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19682663/

相关文章:

ios - View 在 iOS 中显示不正确

ios - UITextView 未检测到链接

Objective-C 选项卡设置和空格样式

ios - 在 iOS 7 中显示图像,但在 iOS 6.1 中不显示

ios - calendarsForEntityType :EKEntityTypeReminder is empty first time, 随后工作

iphone - 模拟键盘敲击

iphone - 如何在 NSString 中使用 % 作为字符?

iphone - Safari 开发者工具打开时总是崩溃

ios - 在 objective-c 项目中导入 TZStackView

ios - 导航栏和导航工具栏不是来自 App Delegate