大家好,我正在排查一个 TestFlight 沙盒环境中的 StoreKit 2 商品加载问题,希望获得建议。
一、现象
iOS App 通过 TestFlight 安装(Build 4)后,使用 Product.products(for:) 请求两个非消耗型内购项目。调用不会抛出错误,但始终返回空数组,因此购买页没有任何可购买商品。
products = try await Product.products(for: [
"com.shidan.qieting.plus.trial.7day",
"com.shidan.qieting.plus.lifetime"
]).sorted { $0.id < $1.id }
两个 Product ID 分别为:
Product ID
类型
价格
App Store Connect 状态
com.shidan.qieting.plus.trial.7day
非消耗型
Tier 0 / US$0.00
可供审核
com.shidan.qieting.plus.lifetime
非消耗型
US$5.99
可供审核
二、日志
在 TestFlight App 冷启动后,诊断日志记录:
2026-09-03T08:12:08Z [settings] plus products loaded: trialAvailable=false, lifetimeAvailable=false
打开购买页时再次调用,结果仍然为空。没有捕获到 StoreKit 异常,也没有购买流程报错。
三、系统级沙盒验证结果
为排除 App UI 和 StoreKit 商品加载代码的影响,我们还使用同一开发团队创建的 Sandbox Apple Account,在 iOS 的“设置 > 开发者 > Sandbox Apple Account > 管理 > Test Transactions”中直接测试:
Bundle ID:com.shidan.qieting
Product ID:com.shidan.qieting.plus.lifetime
系统提示:“提供的产品 ID 或套装 ID 无效”。该工具不经过 App 内的购买页或 Product.products(for:) 结果,仍无法识别这组 Bundle ID 与 Product ID。
四、已完成核验
代码中的 Product ID 与 App Store Connect 中的 Product ID 完全一致。
Release Bundle ID 与 App Store Connect App Record 一致,均为 com.shidan.qieting。
App ID 为显式 ID,不是 wildcard App ID。
Certificates, Identifiers & Profiles 中已启用 In-App Purchase capability;Xcode Target 也已启用,Xcode Cloud 使用自动签名。
TestFlight 使用 Archive 构建;共享 Scheme 的 ArchiveAction 没有 StoreKit Configuration 文件。本地 .storekit 文件只用于 Xcode Run/Test,本身不影响 Archive/TestFlight。
两个项目均已设置价格、175 个 App Store 地区可售,以及简体中文、繁体中文、英语本地化。
最后一次修改 IAP 元数据已经超过 48 小时。
Paid Apps Agreement、税务信息和银行信息均为有效/正在使用中。
尚未提交 App 或 IAP 审核;理解为 TestFlight 沙盒测试不应以提交审核为前提。
欧盟《数字服务法》(DSA)交易商合规信息仍在审核中;但该要求针对欧盟 App Store 产品页的交易商信息。Apple 官方说明中,单独通过 TestFlight 分发不属于在欧盟 App Store 以交易商身份分发,因此这不应影响 TestFlight 沙盒或 Test Transactions。
五、想请教
在上述条件已确认、Product.products(for:) 不报错却返回 [] 的情况下,是否还有容易遗漏的 App Store Connect、沙盒、签名或 TestFlight 配置?
是否有人遇到过“所有 Product ID 均正确、商品完整且全球可售,但 TestFlight 沙盒始终返回空数组”的情况?如果这是 Apple 沙盒端的已知延迟或异常,有什么进一步的排查或反馈渠道?
我可以按需要补充已打码的 App Store Connect 配置截图和完整诊断日志。谢谢。
3
0
291