You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用StoreKitTest模拟失败交易时代理方法未触发问题

排查StoreKitTest模拟失败交易回调未触发的问题

结合你用Xcode 12 Beta 6的情况,以及你之前成功模拟过购买交易的背景,我整理了几个可能的原因和对应的排查方向:

  • 未正确处理异步回调的等待逻辑
    单元测试默认是同步执行的,而buyProduct是异步操作,如果你没有用XCTestExpectation来等待回调触发,测试会直接结束,看起来像是代理方法没被调用。你可以试试这样设置:

    let expectation = XCTestExpectation(description: "等待失败交易回调")
    // 配置测试会话
    testSession.failureError = SKError.Code.unknown
    testSession.failTransactionsEnabled = true
    testSession.buyProduct(productIdentifier: productIdentifier)
    
    wait(for: [expectation], timeout: 5.0)
    // 在代理方法中检测到failed交易时调用
    // expectation.fulfill()
    

    一定要记得在paymentQueue(_:updatedTransactions:)方法里,当识别到状态为failed的交易时,调用expectation.fulfill(),让测试等待回调完成后再结束。

  • StoreKitTest配置顺序的隐性要求
    部分Beta版本的StoreKitTest对配置顺序敏感,你可以尝试调整设置顺序:先指定failureError,再开启failTransactionsEnabled。虽然逻辑上看似无关,但Beta版API可能存在顺序依赖的小bug:

    // 调整后的配置顺序
    testSession.failureError = SKError.Code.unknown
    testSession.failTransactionsEnabled = true
    
  • 测试会话状态残留干扰
    如果你的测试用例是连续执行的,前一次测试的交易状态可能残留下来,影响当前测试的回调触发。建议在每个测试用例的setUp()方法里重置测试会话:

    override func setUp() {
        super.setUp()
        testSession.reset()
        // 重新设置代理、失败配置等内容
    }
    
  • Xcode 12 Beta 6的已知Bug
    作为Beta版本,StoreKitTest确实存在一些未修复的问题,比如failTransactionsEnabled设置不生效的情况。如果条件允许,你可以尝试更新到后续的Beta版本;或者临时用替代方案:手动创建一个状态为failed的交易,通过测试会话的simulateTransactions(_:)方法主动触发回调。

内容的提问来源于stack exchange,提问作者sash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:47:56