订阅型内购Sandbox环境价格、Locale异常及旧价格显示问题求助
沙箱环境StoreKit获取旧订阅价格问题解决
问题描述
使用SKProductsRequest(productIdentifiers: productIdentifiers)从App Store Connect拉取产品信息时,沙箱环境(TestFlight、Xcode直接运行、App Center测试)中返回的订阅原价不正确:
- 已在App Store Connect将订阅新用户价格设置为$5.99/月,introductory offer为$1.99/月(前6个月)
- StoreKit返回的introductory offer正确,但原价始终是旧的$3.99
- 生产环境显示正常,购买弹窗也同步显示错误的旧价格
已尝试操作
- 查阅技术社区,有反馈称这是Apple的沙箱缓存问题,但无法确认自身操作是否有误
- 按照Xcode官方文档创建
synced StoreKit configuration file,问题依旧 - 修改模拟器位置设置,始终返回US locale
- 多次测试购买流程,弹窗价格无变化
解决方案
1. 等待沙箱缓存同步
Apple沙箱服务器的价格缓存更新存在滞后性,尤其是订阅价格变更后,通常需要24-48小时才能完成同步,部分情况下可能需要更久。如果刚修改完价格,优先等待一段时间再测试。
2. 重置沙箱测试账号
沙箱测试账号可能缓存了旧价格数据,操作步骤:
- 登录App Store Connect,进入「用户和访问」>「沙箱测试员」
- 删除当前使用的测试账号,重新创建一个全新的测试账号
- 用新账号在设备/模拟器上登录App Store(设置>App Store>退出当前账号,登录新沙箱账号),重新测试
3. 重新同步StoreKit配置文件
如果使用了同步的StoreKit配置文件:
- 在Xcode中执行菜单:
Product > StoreKit > Sync with App Store Connect - 清理项目缓存:按
Cmd+Shift+K,然后重新编译运行项目
4. 强制刷新设备/模拟器区域设置
区域设置异常可能导致价格显示不符合预期:
- 模拟器:进入「设置>通用>语言与地区」,选择目标地区(如美国),重启模拟器后再测试
- 真机:修改地区设置后,重启App或设备,确保区域设置生效
- 代码中可临时指定Locale验证价格显示(正式环境请勿硬编码):
let priceFormatter = NumberFormatter() priceFormatter.numberStyle = .currency priceFormatter.locale = product.priceLocale // 始终依赖产品返回的locale,不要硬编码 let displayPrice = priceFormatter.string(from: product.price)
5. 确认App Store Connect价格状态
检查App Store Connect中的价格设置:
- 确认价格层级的变更已提交并通过审核(即使生产环境已生效,沙箱可能延迟同步)
- 检查是否存在未发布的价格变更,确保所有修改都已发布
生产环境保障
- 生产环境的价格同步逻辑更稳定,只要App Store Connect中的价格设置已审核通过并生效,生产环境会返回正确价格
- 发布前务必使用全新的沙箱测试账号再次验证价格,确认无误后再提交生产版本
- 代码中禁止硬编码价格,始终通过
SKProduct的price和priceLocale属性获取并格式化价格,避免本地缓存旧数据
内容的提问来源于stack exchange,提问作者Shawn Frank
相关产品推荐
相关产品推荐

