【问题标题】:iOS Receipt not found未找到 iOS 收据
【发布时间】:2017-08-26 01:35:18
【问题描述】:

我正在 Swift 3.0 应用中实现应用内购买,因此我需要获取应用收据以对照 iTunes 商店进行验证。以下是我获取收据的方式:

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

收据 URL 的控制台输出是:

应用收据:可选(file:///Users/dustinspengler/Library/Developer/XCPGDevices/433E8E8F-B781-4ADC-A92D-5CABC28E94D6/data/Containers/Data/Application/C25BE9B6-FB64-4D49-9CF2-9DA371060A7B /StoreKit/收据)

然后它无法将收据转换为Data 并且 catch 语句打印:

将收据转换为数据时出错:文件“收据”无法打开,因为没有这样的文件。

在游乐场、模拟器和真实设备上运行此程序时,我得到完全相同的输出,所以 考虑到用户尚未进行应用内购买,这是否意味着该应用不存在收据? 在阅读 Apple 的 documentation 时,我得到的印象是它们总是被创造出来的,无论之前是否购买过。

【问题讨论】:

  • 在用户进行购买之前没有收据。对于从 App Store 下载的应用程序(甚至是免费应用程序)。这是购买,所以会有收据。对于来自 Xcode 的调试版本,在进行应用内购买之前没有收据。
  • 感谢@Paulw11 的回复!如果您想将此作为答案提交,我会接受。
  • 考虑到此信息未在 Apple 文档中列出,是否有人愿意对否决票发表评论?

标签: ios receipt


【解决方案1】:

此答案基于应用程序在本地计算机上运行的上下文。如果该应用已在应用商店中上线,则在您下载该应用的那一刻就会收到一张收据,即使它是免费的。

@Paulw11 回答:

在用户购买之前没有收据。对于从 App Store 下载的应用程序(甚至是免费应用程序)。这是购买,所以会有收据。对于来自 Xcode 的调试版本,在进行应用内购买之前没有收据。

【讨论】:

  • 不确定这是否已经改变,但我正在运行 iOS 12 和 Xcode 10,从 Xcode 构建到我的设备,并且在调用 SKReceiptRefreshRequest 后能够获得收据。之后 Bundle.main.appStoreReceiptURL 包含收据。
  • 此信息不正确。一旦用户从应用商店下载了一个应用程序,即使是免费的,也会有一张收据,该应用程序的收据与应用程序本身的购买相对应。如果应用有应用内购买或订阅,那么收据也将包含这些购买。
猜你喜欢
  • 2020-01-14
  • 1970-01-01
  • 2019-08-17
  • 2018-01-03
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
相关资源
最近更新 更多