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

SwiftUI中.refundRequestSheet方法异常及结果捕获问题求助

SwiftUI .refundRequestSheet 异常问题排查与修复

问题1:点击「申请退款」无反应,始终返回.userCancelled

可能原因

  • 传入的交易ID无效:代码中用selectedTransactionID ?? 0作为默认值,当selectedTransactionID为nil时会传入无效的0,导致退款sheet无法正确处理请求,最终返回用户取消的结果。
  • 沙盒环境限制:沙盒测试账号/地区不支持退款测试,或者交易本身是无效的沙盒购买记录。
  • 状态绑定异常:refundSheetIsPresented的状态在sheet展示前或回调过程中被错误修改,导致sheet提前关闭。

修复方案

  1. 确保交易ID有效:触发退款sheet前先校验selectedTransactionID是否存在,避免传入无效ID:
    Button("申请退款") {
        guard selectedTransactionID != nil else {
            log("无效的交易ID")
            return
        }
        refundSheetIsPresented = true
    }
    
    同时在refundRequestSheet中直接使用非空的交易ID,去掉默认值:
    .refundRequestSheet(
        for: selectedTransactionID!,
        isPresented: $refundSheetIsPresented
    ) { result in
        // 结果处理逻辑
    }
    
  2. 验证沙盒环境配置:使用App Store Connect创建的沙盒测试用户,确保该用户已完成对应商品的沙盒购买,且测试地区支持退款流程。
  3. 同步状态绑定:避免在回调外手动修改refundSheetIsPresented的值,仅在回调结束后手动重置确保状态同步:
    .refundRequestSheet(...) { result in
        // 处理result逻辑
        refundSheetIsPresented = false
    }
    

问题2:重复申请退款时「Done」按钮无法点击

可能原因

  • 交易已存在退款请求:系统检测到该交易已发起过退款,展示提示但sheet内部状态异常,导致按钮交互失效。
  • 状态未正确重置:首次退款后refundSheetIsPresented状态未同步,再次触发时sheet处于异常状态。

修复方案

  1. 提前校验退款状态:发起退款前,通过StoreKit API查询交易的退款状态,避免重复触发已申请过退款的交易:
    import StoreKit
    
    func checkRefundStatus(for transactionID: UInt64) async -> Bool {
        do {
            let transactions = try await StoreKit.Transaction.all()
            return transactions.contains { transaction in
                transaction.id == transactionID && transaction.refundStatus != .notRequested
            }
        } catch {
            log("查询退款状态失败: \(error)")
            return false
        }
    }
    
    触发sheet前调用该方法,若已申请过退款则提示用户,不展示sheet。
  2. 强制重置sheet状态:每次回调结束后强制设置refundSheetIsPresented = false,确保状态干净,避免下次触发时出现异常。
  3. 升级系统版本:.refundRequestSheet是iOS 15+的API,部分早期iOS版本存在已知的sheet交互bug,尝试升级到较新的iOS版本测试。

注意事项

  • 沙盒环境中退款请求仅为模拟流程,不会真正生成退款记录,部分状态反馈可能与生产环境有差异。
  • 确保App已在App Store Connect中配置正确的内购项目,且测试账号拥有对应商品的购买权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:43:21