web-dev-qa-db-ja.com

非推奨のTransactionReceipt

私はこのコードをアプリ内購入に使用しており、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で最初に廃止されました

それを修正するには?

28
Ali Sufyan

次のようなものに置き換えます:

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

その後、NSDataNSStringに変換します.....

16
Nikos M.

非推奨について

この質問は技術的に非推奨の属性に対処する方法を尋ねているので、OPがまだ7未満のiOSバージョンにデプロイされていると想定するのが公正です。したがって、盲目的に呼び出すのではなく、新しいAPIの可用性を確認する必要があります。 :

Objective-C

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

SwiftはiOS 7以降にのみ展開できるため、appStoreReceiptURLを安全に使用できます

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

領収書の検証について

新しいAPIレシートには、ユーザーが実行したすべてのトランザクションのリストが含まれるようになりました。 documentation は、領収書がどのように見えるかを明確に示しています。

receipt outline

つまり、本当にしたい場合は、レシートに含まれるすべてのアイテムを繰り返し処理して、各トランザクションに対して検証できます。

領収書の検証の詳細については、次を参照してください obc.io

20
Daniel Galasko
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
if(!receipt) {
 /* No local receipt -- handle the error. */ 
}
NSString *jsonObjectString = [receipt base64EncodedString];
10
Phil