SKPaymentQueue的 restoreCompletedTransactions() 在完成后不会更新appStoreReceiptURL收据 .

我正在开发一个将通过自动续订订阅支持的Mac应用程序 . 恢复购买完成后,我需要更新收据,因为我需要检查当前订阅状态(到期日期等) .

我能想到的唯一解决方案是在恢复完成的事务完成后立即刷新收据,如下所示 . 这看起来确实有效 . 但是,系统会提示用户输入两次用户名和密码,这不是完美的体验 . 此外,我担心此类行为会导致应用审核被拒绝 .

public func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
    if !fileExistsAtAppStoreReceiptURL() {
        print("No receipt.")
    }

    let refreshRequest = SKReceiptRefreshRequest(receiptProperties: nil)
    refreshRequest.delegate = self
    refreshRequest.start()
}

private func fileExistsAtAppStoreReceiptURL() -> Bool {
    guard let appStoreReceiptURL = Bundle.main.appStoreReceiptURL else { return false }
    return FileManager().fileExists(atPath: appStoreReceiptURL.path)
}

public func requestDidFinish(_ request: SKRequest) {
    if request is SKReceiptRefreshRequest {
        updateCachedReceiptFromAppStoreReceiptURL()
        reverifyKnownPurchases()

        notify { self.delegate?.inAppPurchaseController(self, restoreCompletedTransactionsDidFinishWith: .success) }
    } else {
        notify { self.delegate?.inAppPurchaseController(self, didFinishRequestingIndividualProductInformationWith: .success) }
    }
}

其他一些说明:

  • No receipt. 确实显示在日志中 .

  • 因为在使用沙箱环境时会出现这种情况,所以当代码在 生产环境 中执行时,我不知道行为是否相同 .

  • 尝试使用新创建的测试用户后,行为未发生更改 .

  • 因为我想模拟真实情况,我在第二台Mac上恢复购买,而不是购买订购的Mac .

  • 还原过程的其余部分似乎正常工作 . 为每个已恢复的事务调用 paymentQueue:updatedTransactions: ,其transactionState为.restored .

为每个恢复的事务调用

  • SKPaymentQueue.default().finishTransaction(transaction) .

在applicationDidFinishLaunching中调用

  • SKPaymentQueue.default().add(self)

  • 虽然我正在使用自动续订订阅,但它没有发挥作用 . 例如,即使我使用非消耗品,也不会出现收据 .

  • 我没有使用服务器 .

  • Restoring Purchased ProductsrestoreCompletedTransactions()文档既未明确确认也未拒绝收据作为还原过程的一部分进行更新 . 这可能是预期的行为吗?

  • 因为今年早些时候我在iOS测试应用程序中遇到了类似的问题,这可能不是仅限Mac的情况 .

考虑到所有这些,有谁知道如何妥善处理这种情况?有没有人恢复刷新成功?