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

SwiftyStoreKit verifyReceipt返回success但switch分支不执行

应用内订阅校验回调无法进入switch分支问题

问题现象

参考SwiftyStoreKit实现应用内订阅校验功能,已完成SwiftyStoreKit.verifyReceipt与SwiftyStoreKit.verifySubscription方法接入。调试过程中出现异常:在InAppReceiptVerificator类的*verifyReceipt()*方法内断点调试时,可观察到回调result包含"success"返回值,但调试器始终无法进入回调闭包内的switch statement分支,后续校验逻辑无法执行。

对应实现代码

func SubscriptionVerify(productID: String){
    SwiftyStoreKit.verifyReceipt(using: appleValidator!) { result in
        switch result {
        case .success(let receipt):
            let productId = productID
            // 校验订阅购买状态
            let purchaseResult = SwiftyStoreKit.verifySubscription(
                ofType: .autoRenewable, // 非自动续期订阅可传.nonRenewing
                productId: productId,
                inReceipt: receipt)
            
                
            switch purchaseResult {
            case .purchased(let expiryDate, let items):
                print("\(productId) is valid until \(expiryDate)\n\(items)\n")
                
            case .expired(let expiryDate, let items):
                print("\(productId) is expired since \(expiryDate)\n\(items)\n")
            case .notPurchased:
                print("The user has never purchased \(productId)")
            }

        case .error(let error):
            print("Receipt verification failed: \(error)")
        }
    }
}

排查方案

  • 先确认回调是否真的执行:在switch result代码行之前加一行打印print("receipt回调已触发,当前线程:\(Thread.current), result:\(result)"),运行看控制台是否输出这行日志。如果没有输出,说明闭包根本没执行,优先检查appleValidator实例是否被提前释放,不要用强制解包appleValidator!,改成可选绑定校验后再调用方法。
  • 检查回调线程问题:SwiftyStoreKit的网络回调默认在后台子线程触发,如果你的Xcode断点设置了仅主线程生效,或者本地有主线程执行的断言拦截,会出现断点不触发、看似没进分支的假象。如果需要在回调里执行UI相关操作,直接把回调内所有逻辑放到主队列调度:
    SwiftyStoreKit.verifyReceipt(using: appleValidator) { result in
        DispatchQueue.main.async {
            // 原有switch逻辑放在这里
        }
    }
    
  • 检查枚举版本匹配问题:如果本地集成的SwiftyStoreKit版本和参考代码的版本不一致,VerifyReceiptResult枚举可能存在case增减,导致你写的switch分支没有全覆盖、又没写default分支,出现匹配失败。可以临时给外层switch加default分支打日志,确认实际返回的枚举值:
    switch result {
    // 原有success、error分支
    default:
        print("未匹配到result枚举值:\(result)")
    }
    
  • 检查断点配置:如果控制台能正常打印回调内的日志,只是断点不进,说明是Xcode断点配置问题,删掉当前闭包内的旧断点,重新在switch行加新断点,取消断点的条件过滤、线程过滤设置即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:15:43