如何从iOS 11中的iOS Receipt中获取original_application_version(第一个购买的版本号)?

Ade*_*aer 7 storekit ios receipt-validation swift ios11

我有一个付费的iOS应用程序.

我需要original_application_version从Apple AppStore Receipt 获取该号码(用户购买的第一个版本).

要获得收据,当我的应用加载时,我使用checkReceiptFromAppStore()功能:

func checkReceiptFromAppStore() {
    let receipt = self.getReceipt()
    print("receipt Data is: \(receipt)") // prints this: receipt Data is: Optional(5141 bytes)       
}
Run Code Online (Sandbox Code Playgroud)

getReceipt() 功能如下:

func getReceipt() -> Data? {
    if Bundle.main.appStoreReceiptURL != nil {
        print("app receipt: \(Bundle.main.appStoreReceiptURL)")
        do {
            let receiptData = try Data(contentsOf: Bundle.main.appStoreReceiptURL!)

            return receiptData
        } catch {
            print("error converting receipt to Data: \(error.localizedDescription)")
        }
    }
    return nil
}
Run Code Online (Sandbox Code Playgroud)

我已经观看了WWDC 2017 Advanced StoreKit关于In App购买和收据验证的视频以及关于使用收据的WWDC 2013视频,阅读与我的问题相关的不同资源(这个,这个,这个,这个,这个,这个,这个 ......) ,但我仍然不明白接下来要从App Store收据中获取"original_application_version"该怎么办.我只需要这个领域而且不明白为什么这么难得.我也读过这个:https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html

我认为当我运行打印时收据不是零("收据数据是:(收据)")它打印出来:收据数据是:可选(5141字节)

我可以假设我应该解析收据以获得该字段.我可以使用Decodable来做吗?有最简单的方法来获得这个original_application_version领域吗?没有收据验证可以做到这一点吗?

我只需要获取该original_application_version字段以检测用户购买的第一个版本的编号.如果您知道任何其他解决方案以获得第一个购买的版本号,我很高兴听到它们.

我正在开发Xcode 9,Swift 4,iOS 11

任何答案都赞赏,谢谢.

小智 1

应用程序收据中的所有收据字段均采用二进制格式。您应该使用任何类型的应用程序收据解码器才能获取original_application_version。在使用应用程序内容之前验证应用程序收据总是一件好事。例如,您可以使用 RMStore 框架(RMStore)。它包含收据验证器和解码器。Obj-C 源代码示例:

RMAppReceipt *appReceipt = RMAppReceipt.bundleReceipt;

if (appReceipt != nil && 
    [appReceipt.originalAppVersion length] > 0 && 
    ![appReceipt.originalAppVersion isEqualToString:@"1.0"]) {
    //Process your original app version 
} else {
    //Probably it is sandbox mode or app install via Xcode
    //Or maybe you should force app receipt refresh
}
Run Code Online (Sandbox Code Playgroud)