iOS14 内购审核被拒

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- 恢复完成")
    }
}

  1. 我们的产品逻辑是,用户点击购买按钮后,先执行恢复操作先判断是否是已购买用户,不是才会进行购买。这个在iOS13下没有没有任何问题。但是在iOS14下面就会有问题,看上面的代码,发现iOS 14下面,finishTransaction 是异步处理的, 而且会很慢,如果你这个沙盒测试账号购买历史记录比较多的话,需要等待很久的时间才能全部finish完,比如我的账号有100多个购买记录,每次先restore,后就会把这些交易记录添加到队列中,然后再finish,全部finish完成需要十几分钟,但是在iOS13下面就会立即处理完成。这就是购买失败的原因。

  2. 然后我们就修改代码添加一些等待吗逻辑,确认都处理完了,再去购买,再次提审,又被拒了,但是我们这边测试都没有问题,就是可能需要等待比较长的时间,我们就写了一个小作文,并且录屏说我们这边没有问题,让他们换个设备,换个沙盒账号再测试,但是等了几天没有回信,后来申述,又等了几天还是没有回信,前后耽误了半个月。

  3. 然后我们就继续开发新版本,然后又提审新版本,内购相关代码并没有修改,然后就过了。

你可能感兴趣的:(iOS14 内购审核被拒)