手动启动应用时SKStoreReviewController的requestReview方法不生效问题
评分弹窗仅调试可显示、正式启动不显示的原因及修复方案
核心原因1:SKStoreReviewController的环境规则限制
- 苹果官方对生产环境的评分弹窗做了严格限制:单个应用对同一名用户1年内最多只能弹出3次评分请求,仅Xcode调试模式下不受该规则限制,所以调试时每次调用都能正常弹出。
- 如果你安装到iPad上的是Release签名包(包括Ad Hoc、TestFlight、正式版IPA),都会触发该规则,若之前已经触发过3次弹窗,当年内不会再展示。另外TestFlight环境下该API默认不会弹出任何弹窗。
核心原因2:冷启动时场景状态获取时序问题
你在viewDidAppear中通过connectedScenes筛选活跃状态场景的逻辑,在应用冷启动刚完成的瞬间很容易失效:冷启动时场景状态还处于从foregroundInactive到foregroundActive的过渡阶段,你的筛选条件会过滤掉过渡状态的场景,导致拿不到可用的WindowScene,请求逻辑不执行。
Xcode调试时因为进程附加的时序差异,刚好能命中foregroundActive状态,所以可以正常弹出。
验证方案:将评分请求逻辑延迟1秒执行,测试冷启动是否能正常弹出:
DispatchQueue.main.asyncAfter(deadline: .now() + 1) { // 原有评分请求逻辑 }
核心原因3:iPad场景获取逻辑适配问题
iPad支持多窗口多场景,你直接取全局connectedScenes第一个符合条件的场景,很容易取到非当前交互窗口的场景,建议从当前控制器所属的窗口获取对应场景,修复后的代码如下:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if #available(iOS 14.0, *) { guard let currentScene = view.window?.windowScene else { return } SKStoreReviewController.requestReview(in: currentScene) } else if #available(iOS 10.3, *) { SKStoreReviewController.requestReview() } }
其他可能原因
如果用户在iPad系统「设置」-「App Store」中关闭了「App内评分及评论」选项,所有应用的评分弹窗都不会触发展示。
内容的提问来源于stack exchange,提问作者RRN
相关产品推荐
相关产品推荐

