【问题标题】:Deprecated TransactionReceipt已弃用的交易收据
【发布时间】:2013-11-10 01:13:09
【问题描述】:

我将此代码用于应用内购买,取自 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 中弃用

如何解决?

【问题讨论】:

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


    【解决方案1】:

    关于弃用

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

    目标-C

    编辑 正如 cmets 中指出的那样,您不能在 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

    【讨论】:

    • 在这种特殊情况下,您不应该使用 respondsToSelector。苹果明确表示在这种情况下它不起作用。您应该比较实际的版本号。 RTFM ;) developer.apple.com/library/mac/documentation/Cocoa/Reference/…
    • @MaciejSwic 谢谢先生!不知道,会更新
    • 另外,新收据可以和旧收据一样处理吗? IE。旧的 PKCS7 加密和 ASN.1 编码吗?
    • @MaciejSwic 我们从未改变处理收据的方式,所以我不这么认为,文档也没有提及任何内容:developer.apple.com/library/ios/releasenotes/General/…
    • 这只是部分正确,以前 Apple 不鼓励本地验证,并且格式是“关闭的”并且随时可能更改。但也许它一直都是一样的,只是最近才被记录下来,不知道细节只是想提出这个问题。
    【解决方案2】:

    替换为:

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

    之后将NSData 转换为NSString.....

    【讨论】:

    【解决方案3】:
    NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
    NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
    if(!receipt) {
     /* No local receipt -- handle the error. */ 
    }
    NSString *jsonObjectString = [receipt base64EncodedString];
    

    【讨论】:

    • 这仅验证应用程序,而不是 transactionReceipt 用于的任何应用程序内购买。
    • 收据内有用户进行的所有应用内购买的数据
    猜你喜欢
    • 2018-05-11
    • 2020-04-21
    • 2018-06-14
    • 1970-01-01
    • 2017-12-19
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多