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 Products和restoreCompletedTransactions()文档既未明确确认也未拒绝收据作为还原过程的一部分进行更新 . 这可能是预期的行为吗?
-
因为今年早些时候我在iOS测试应用程序中遇到了类似的问题,这可能不是仅限Mac的情况 .
考虑到所有这些,有谁知道如何妥善处理这种情况?有没有人恢复刷新成功?