Iphone 不推荐的交易收据

Iphone 不推荐的交易收据,iphone,objective-c,ios7,in-app-purchase,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

我将此代码用于应用程序内购买,这是从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说

“TransactionReceive”已弃用:在iOS 7.0中首次弃用


如何修复它?

替换为以下内容:

[NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];
NSData
转换为
NSString
,然后….

关于弃用
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
if(!receipt) {
 /* No local receipt -- handle the error. */ 
}
NSString *jsonObjectString = [receipt base64EncodedString];
由于这个问题从技术上讲是问人们应该如何着手解决不推荐使用的属性,因此可以假定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现在包含用户执行的所有事务的列表。以下内容清楚地概括了收据的外观:

这意味着,如果您真的,真的想,您可以迭代收据中包含的所有项目,以针对每个交易进行验证


有关收据验证的更多信息,请阅读

阅读:您是否可以将其用于应用程序内购买?这是不正确的,不适用于本教程所述的应用程序内购买。它实际上也包含IAP收据:这仅验证应用程序,不是任何transactionReceipt用于的应用内购买。在收据中有用户进行的所有应用内购买的数据。在这种特殊情况下,您不应使用respondsToSelector。苹果明确表示,在这种情况下它不起作用。您应该比较实际的版本号。RTFM;)@谢谢你,先生!我不知道,will Updateal那么,你能像对待旧收据一样对待新收据吗?也就是说,旧的PKCS7是加密的,ASN.1也是编码的吗?@MaciejSwic我们从未改变过处理收据的方式,所以我不这么认为,文档也没有提到任何东西:这只是部分正确,以前苹果不鼓励本地验证,格式是“关闭”的,随时可能更改。但可能一直都是一样的,只是最近才被记录下来,不知道细节只是想提出这个问题。