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

使用ProductView开发内购:二次购买消耗型商品时“You're all set”弹窗未显示

问题原因及修复方案

核心原因:未完成消耗型商品的交易收尾

消耗型商品购买成功后,必须调用transaction.finish()告知App Store该交易已处理完成。如果跳过这一步,App Store会认为该交易仍处于未完成状态,当用户再次购买同一商品时,系统会直接复用已存在的未完成交易,不会触发完整的购买流程(包括“You're all set”弹窗)。

你的代码遗漏了关键逻辑

你提供的代码仅在购买完成时打印日志,没有执行交易收尾操作。这导致首次购买的交易一直处于挂起状态,第二次购买时系统直接跳过了弹窗环节。

修正后的代码

ProductView(id: productId)
    .productViewStyle(.compact)
    .onInAppPurchaseStart { product in
        logger.log("User has started buying \(product.id)")
    }
    .onInAppPurchaseCompletion { product, result in
        switch result {
        case .success(.success(let transaction)):
            logger.log("Success")
            // 必须调用finish,完成交易闭环
            transaction.finish()
        case .success(.failure(let error, let transaction)):
            logger.log("Failure: \(error.localizedDescription)")
            // 失败场景下若存在交易实例,也建议finish避免遗留问题
            transaction?.finish()
        case .failure(let error):
            logger.log("Purchase flow failed: \(error.localizedDescription)")
        }
    }

额外注意事项

  • 沙箱测试时,若需要重复测试同一消耗型商品的购买,可通过注销沙箱账号并重新登录来重置购买状态,或等待沙箱环境自动重置(通常需要几分钟)。
  • 在App启动阶段建议调用AppStore.sync(),同步并处理所有历史未完成交易,避免遗留交易影响后续购买流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:04:55