iOS14 内购失败 审核被拒
在iOS14发布后,我们提交了新版本,但是审核被拒,审核人员说是在iOS14下购买失败。
我们开始排查,发现在sandbox 环境下确实购买失败概率很高。
import Foundation
import StoreKit
class GrammPayQueueMgr: NSObject {
static let `default` = GrammPayQueueMgr()
var products: [SKProduct] = []
func setup() {
SKPaymentQueue.default().add(self)
fetchProduct()
}
func restoreAction() {
SKPaymentQueue.default().restoreCompletedTransactions()
}
func bugyAction(p: SKProduct) {
let payment = SKPayment(product: p)
SKPaymentQueue.default().add(payment)
}
var weekProcut: SKProduct {
return products[0]
}
func fetchProduct() {
let req = SKProductsRequest(productIdentifiers: ["xxxx"])
req.delegate = self
req.start()
}
func refreshReceipt() {
let req = SKReceiptRefreshRequest()
req.delegate = self
req.start()
}
}
extension GrammPayQueueMgr: SKRequestDelegate {
func requestDidFinish(_ request: SKRequest) {
print("sub- 请求完成")
}
func request(_ request: SKRequest, didFailWithError error: Error) {
print("sub- 请求失败err= \(error)")
}
}
extension GrammPayQueueMgr: SKProductsRequestDelegate {
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
print("sub- 获取到商品\(response.products)")
products = response.products
}
}
// 复现步骤: iOS14下 ,点击restore恢复完成后,然后点击购买,看updatedTransactions代理回调打印输出,(iOS13下先加载一会, 然后显示购买弹框,返回一个purchasing交易,输入密码后购买成功返回purchased),但是在iOS14下立即返回一个restored,就结束了。
// 点击购买后,正常情况下应该先回调一个purchasing交易,购买完成后返回,purchased。但是在iOS14下会返回一个restored
extension GrammPayQueueMgr: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
print("sub-交易状态来更新了\(transactions.count)")
guard let fobj = transactions.first else { return }
switch fobj.transactionState {
case .purchased:
print("sub-purchased 购买成功")
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.finsihTrans(trans: transactions)
}
case .restored:
print("sub-restored恢复")
finsihTrans(trans: transactions)
case .failed:
print("sub-failed 失败")
finsihTrans(trans: transactions)
case .purchasing:
print("sub-purchaing 购买中。。。")
default:
finsihTrans(trans: transactions)
}
}
func finsihTrans(trans: [SKPaymentTransaction]) {
for t in trans {
print("sub-finish 处理完成\(t.transactionIdentifier)-state=-\(t.transactionState)")
SKPaymentQueue.default().finishTransaction(t)
}
}
func paymentQueue(_ queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) {
}
func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) {
print("sub- 恢复完成 错误")
}
func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) {
print("sub- 恢复完成")
}
}
-
我们的产品逻辑是,用户点击购买按钮后,先执行恢复操作先判断是否是已购买用户,不是才会进行购买。这个在iOS13下没有没有任何问题。但是在iOS14下面就会有问题,看上面的代码,发现iOS 14下面,
finishTransaction
是异步处理的, 而且会很慢,如果你这个沙盒测试账号购买历史记录比较多的话,需要等待很久的时间才能全部finish完,比如我的账号有100多个购买记录,每次先restore,后就会把这些交易记录添加到队列中,然后再finish,全部finish完成需要十几分钟,但是在iOS13下面就会立即处理完成。这就是购买失败的原因。 -
然后我们就修改代码添加一些等待吗逻辑,确认都处理完了,再去购买,再次提审,又被拒了,但是我们这边测试都没有问题,就是可能需要等待比较长的时间,我们就写了一个小作文,并且录屏说我们这边没有问题,让他们换个设备,换个沙盒账号再测试,但是等了几天没有回信,后来申述,又等了几天还是没有回信,前后耽误了半个月。
-
然后我们就继续开发新版本,然后又提审新版本,内购相关代码并没有修改,然后就过了。
网友评论