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

StoreKit 2:.subscriptionStatusTask延迟及加载时显示ProgressView的方法

关于StoreKit .subscriptionStatusTask 延迟与状态同步的问题

我在应用主视图中使用.subscriptionStatusTask,Xcode测试时一切正常,但TestFlight环境下,用户购买订阅后,.subscriptionStatusTask检测状态变化并触发存在延迟,需数秒后应用才会识别到已切换为Pro版本(通过发布变量标记是否为Pro)。现提出以下问题:

  1. 该延迟属于正常行为吗?
  2. 是否应在购买成功后立即将发布变量设为true?但我使用.manageSubscriptionSheet,用户重新订阅或升级时无法设置该变量。
  3. 能否在.subscriptionStatusTask加载时显示ProgressView?由于它是修饰符,我在闭包内设置Pro变量,尝试设置加载标志但无法正确重置以隐藏进度视图。

问题解答与建议

1. 延迟是否正常?

是正常的。TestFlight环境下,App Store服务器的订阅状态同步存在网络延迟是普遍现象——苹果的服务器需要处理购买验证、状态同步,再将更新推送到设备,这个流程在测试/生产环境都可能有几秒延迟,和Xcode本地测试的模拟验证逻辑完全不同。

2. 能否购买成功后立即标记Pro状态?

不建议直接硬设为true,这会导致状态不同步(比如用户购买失败但本地标记为Pro,或者退款后本地状态没更新)。但针对.manageSubscriptionSheet的场景,可以通过监听交易流来补充同步:

  • 在展示manageSubscriptionSheet时,监听Transaction.updates流,在确认交易状态为.purchased且完成transaction.finish()后,立即更新本地发布变量,同时保留.subscriptionStatusTask作为最终的状态校验兜底。
  • 这种方式既能在购买成功后快速响应UI,又能通过.subscriptionStatusTask确保长期的状态一致性。

3. 如何在.subscriptionStatusTask加载时显示ProgressView?

可以通过单独的@Published变量控制进度视图的显示,关键是在.subscriptionStatusTask的生命周期内正确管理这个变量:

@Published var isPro = false
@Published var isLoadingSubscriptionStatus = true

var body: some View {
    Group {
        if isLoadingSubscriptionStatus {
            ProgressView()
        } else {
            // 主视图内容,根据isPro展示不同UI
        }
    }
    .subscriptionStatusTask(for: Product.SubscriptionInfo.Status.self) { statuses in
        defer { isLoadingSubscriptionStatus = false }
        // 处理状态更新,设置isPro
        isPro = statuses.contains { $0.state == .subscribed }
    }
}
  • 使用defer语句确保无论闭包执行成功还是失败,都会关闭加载状态;
  • 如果是购买后等待状态同步的延迟场景,可以额外在交易开始时开启临时加载标识,交易完成后关闭,配合.subscriptionStatusTask的最终状态确认。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:22:10