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

调用requestReview()触发App Store评分前屏幕卡顿的解决方法

如何解决调用@Environment(\.requestReview)前的UI卡顿与交互失效问题

我在应用中使用@Environment(\.requestReview)来请求用户评分,但调用requestReview()后,评分弹窗出现前屏幕会卡顿,期间动画可正常播放,但UI交互(如点击按钮、滚动列表等)失效。相关代码如下:

@Environment(\.requestReview) private var requestReview
var body: some View {

    NavigationView {
        // View content
    }
    .onChange(of: rstatus) { newValue in

        switch newValue {
        case .ready:
            Task { @MainActor in
                requestReview()
            }

        // Other cases omitted for brevity

        }
    }
}

解决方案

1. 加入短暂延迟调用

在触发评分请求前加一段短延迟,让当前正在执行的UI渲染、交互任务先完成,避免主线程被抢占:

case .ready:
    Task { @MainActor in
        try await Task.sleep(nanoseconds: 300_000_000) // 延迟0.3秒,可根据UI复杂度调整
        requestReview()
    }

2. 等待主线程空闲时触发

利用RunLoop的空闲回调,确保在主线程没有待处理任务时再调用评分请求,能最大程度减少卡顿:

case .ready:
    RunLoop.main.perform(inModes: [.common]) {
        requestReview()
    }

也可以用更简单的异步延迟方式:

case .ready:
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
        requestReview()
    }

3. 避开UI状态突变的瞬间触发

如果rstatus的.ready状态是在用户操作(比如点击按钮、完成流程)后立即触发的,建议把评分请求移到用户操作的后续生命周期节点,比如页面onDisappear时,或者用户停止交互一段时间后再触发,不要在状态变更的瞬间直接调用。


原理说明

requestReview()内部会和App Store服务建立通信,这个过程会短暂占用主线程资源,导致UI交互暂时失效。通过延迟或等待主线程空闲的方式,能让当前的UI任务先收尾,再执行评分请求,从而缓解卡顿感。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:12:04