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

