PAYATHON 2026

为什么 TestFlight 中的订阅产品未加载、按钮不显示?

数据阿明

结论

订阅仍在等待审核,通常不会导致 TestFlight 中的商品加载失败。TestFlight 的 App 内购买使用 Sandbox。Apple 说明,App Review 也会在 Sandbox 中测试,IAP 无需先获批即可在审核环境中使用。Apple:Sandbox 中配置 App 内购买以供审核

从问题中的代码看,首先要确认应用实际调用了 fetchProducts()。按钮由 sub.products 生成;如果商品数组为空,ForEach 就不会创建按钮。代码片段定义了加载函数,却没有展示它在哪里执行。另一个线索是,加载失败时,代码会捕获错误并将 products 设为 [],界面上便只会看到按钮消失。

先确认商品加载函数确实执行

显示订阅页面时调用加载函数,例如:

.task {
    await sub.fetchProducts()
}

确保 sub 在视图生命周期内保持稳定,例如由视图通过 @StateObject 持有,或由上层通过 @ObservedObject 传入。不要因为 Xcode 的 StoreKit Configuration 文件中测试成功,就认定 TestFlight 已从 App Store Connect 获取到商品。本地配置和 Sandbox 商品目录是两种不同的测试路径。

区分“没有商品”和“加载失败”

当前实现会在发生错误后清空商品数组,但 UI 没有显示加载状态或错误。调试时至少记录请求 ID、返回数量和错误,并检查 Product.products(for:) 返回的结果是否包含预期 ID:

func fetchProducts() async {
    let ids = ["test_name"]

    do {
        let loadedProducts = try await Product.products(for: ids)
        products = loadedProducts

        print("Requested product IDs: \(ids)")
        print("Loaded product IDs: \(loadedProducts.map(\.id))")
    } catch {
        products = []
        print("Failed to load products: \(error)")
    }
}

实际项目中可以显示加载失败提示或重试入口。这样商品目录暂时不可用时,页面就不会看起来像是没有订阅功能。

检查 App Store Connect 与 Sandbox 配置

按顺序核对以下项目:

  1. test_name 必须与订阅的 Product ID 完全一致。还要确认该订阅属于当前应用对应的 App Store Connect 记录,并且应用的 Bundle ID 匹配。
  2. 确认订阅商品的必填资料、价格和销售地区都已配置完成,并检查测试账号所在的 storefront 是否包含在商品可售地区内。
  3. 确认 Account Holder 已接受 Paid Apps Agreement,且协议状态有效。Apple 特别指出,协议生效前,付费 IAP 无法正常用于审核测试。
  4. 如果刚修改过商品元数据,稍后再试。Apple 的 Sandbox 文档指出,元数据更改可能需要一段时间才会在 Sandbox 中显示。Apple:排查 Sandbox 中 IAP 不可用
  5. TestFlight 安装包会自动使用 Sandbox。要访问 TestFlight 的 Sandbox 测试控制项,可以在设备设置中退出 Media & Purchases 中的生产 Apple Account,再到 Developer 设置中登录 Sandbox Apple Account。测试购买使用 Sandbox 账号,不会产生真实扣款。Apple:在 TestFlight 测试订阅和 IAP

Apple 也建议在显示购买选项前,通过 StoreKit API 获取商品信息。如果仍未返回商品,应继续检查请求 ID、加载错误、Bundle ID、账号 storefront 和 App Store Connect 配置,不能只凭“等待审核”判断原因。Apple:审核前配置与测试 IAP

App Review 如何测试

审核人员会使用 Sandbox 测试购买,订阅无需先在 App Store 正式发布。确保审核人员能通过审核路径进入订阅页,并在 App Review Information 中提供必要说明,例如测试账号、订阅入口或地区限制情况。如果某项 IAP 在应用中无法找到或审核,请在审核备注中说明原因。

备注:内容仅供参考。