私はこのコードをアプリ内購入に使用しており、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で最初に廃止されました
それを修正するには?
次のようなものに置き換えます:
[NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];
その後、NSData
をNSString
に変換します.....
この質問は技術的に非推奨の属性に対処する方法を尋ねているので、OPがまだ7未満のiOSバージョンにデプロイされていると想定するのが公正です。したがって、盲目的に呼び出すのではなく、新しいAPIの可用性を確認する必要があります。 :
Editコメントで指摘されているように、そのAPIは以前のiOSバージョンでは非公開だったため、NSBundleでrespondsToSelectorを使用することはできません
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
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
if(!receipt) {
/* No local receipt -- handle the error. */
}
NSString *jsonObjectString = [receipt base64EncodedString];