调用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
相关产品推荐
相关产品推荐

