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
相关产品推荐
相关产品推荐

