【问题标题】:How to get the original_application_version (the first purchased version number) out of iOS Receipt in iOS 11?如何从 iOS 11 的 iOS Receipt 中获取 original_application_version(第一个购买的版本号)?
【发布时间】:2026-02-11 12:20:03
【问题描述】:

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

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

为了获取收据,当我的应用加载时,我使用checkReceiptFromAppStore() 函数:

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

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
}

我看过WWDC 2017 Advanced StoreKit有关应用内购买和收据验证的视频和WWDC 2013 Video about using Receipts,阅读不同 与我的问题相关的资源(thisthisthisthisthisthisthis...),但我仍然不明白下一步该做什么得到 App Store 收据中的“original_application_version”。我只需要这个领域,不明白为什么这么难得到它。 我也读过这个:https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html

我认为当我运行 print("receipt Data is: (receipt)") 时,收据不是零,它会打印:receipt Data is: Optional(5141 bytes)

我可以假设我应该解析收据以获取该字段。我可以使用可解码来做到这一点吗?有没有最简单的方法来获得这个original_application_version 字段?是否可以在没有收据验证的情况下执行此操作?

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

我正在使用 Xcode 9、Swift 4、iOS 11 进行开发

感谢任何答案,谢谢。

【问题讨论】:

    标签: ios swift ios11 storekit receipt-validation


    【解决方案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
    }
    

    【讨论】: