appStoreReceiptURL ==在restoreCompletedTransactions()之后为零

时间:2018-07-09 23:26:22

标签: ios macos in-app-purchase subscription

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) }
    }
}

其他一些注意事项:

  1. No receipt.确实显示在日志中。

  2. 因为在使用沙箱环境时会发生此行为,所以我不知道在生产环境中执行代码时行为是否相同。

  3. 尝试使用新创建的测试用户后,行为没有改变。

  4. 因为我想模拟现实情况,所以我在第二台Mac上恢复了购买,而不是在第二台Mac上恢复了购买。

  5. 还原过程的其余部分似乎正常工作。对于每个恢复状态为.restored的已恢复事务,将调用paymentQueue:updatedTransactions:

  6. 每个恢复的事务都会调用
  7. SKPaymentQueue.default().finishTransaction(transaction)

  8. SKPaymentQueue.default().add(self)在applicationDidFinishLaunching:中被调用。

  9. 尽管我使用的是自动续订,但它没有作用。例如,即使我使用的是非消耗品,收据也不会出现。

  10. 我没有使用服务器。

  11. Restoring Purchased ProductsrestoreCompletedTransactions()文档既没有明确确认也没有否认收据已作为还原过程的一部分进行了更新。这可能是预期的行为吗?

  12. 由于我今年早些时候在iOS测试应用中遇到了类似的问题,所以这可能不是Mac专用的情况。

牢记所有这些,有人知道如何正确处理这种情况吗?有人在恢复+刷新上成功了吗?

0 个答案:

没有答案