应用启动指定次数后StoreKit评分弹窗不显示问题排查
应用启动指定次数后StoreKit评分弹窗不显示的问题
问题描述
我希望在应用启动指定次数后请求用户评分,但在launchNumber == 2时,StoreKit评分弹窗并未显示。不过if let scene =这段代码在按钮点击场景下可以正常工作,相关代码如下:
import SwiftUI import StoreKit @main struct ExampleApp: App { @AppStorage("launchNumber") var launchNumber: Int = 0 var body: some Scene { WindowGroup { ContentView() .onAppear { review() } } } func review() { launchNumber += 1 // print(launchNumber) guard launchNumber == 2 else { return } if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene { SKStoreReviewController.requestReview(in: scene) } } }
原因分析及解决办法
- 苹果官方调用频率限制:
SKStoreReviewController.requestReview有严格的调用限制,用户每年最多只会看到3次评分弹窗。如果之前已经触发过该请求(哪怕是测试阶段),即使代码逻辑正确,弹窗也不会再显示。 onAppear触发时机过早:ContentView的onAppear可能在应用场景还未完全进入foregroundActive状态时就执行了,此时获取的场景状态不符合要求,导致评分请求失败。可以改用监听ScenePhase的方式,在应用进入活跃状态后再触发请求。- 测试环境限制:模拟器上测试时,评分弹窗的显示不稳定,建议使用真实设备测试;另外TestFlight版本和正式版的弹窗触发逻辑有差异,正式版的限制更严格。
- 计数逻辑验证:取消注释
print(launchNumber),确认launchNumber在第二次启动时确实等于2,排除@AppStorage存储异常导致的计数错误。
优化代码示例
改用ScenePhase监听应用状态,确保在场景完全活跃后触发评分请求:
import SwiftUI import StoreKit @main struct ExampleApp: App { @AppStorage("launchNumber") var launchNumber: Int = 0 @Environment(\.scenePhase) private var scenePhase var body: some Scene { WindowGroup { ContentView() } .onChange(of: scenePhase) { newPhase in if newPhase == .active { review() } } } func review() { launchNumber += 1 print(launchNumber) guard launchNumber == 2 else { return } if let scene = UIApplication.shared.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene { SKStoreReviewController.requestReview(in: scene) } } }
内容的提问来源于stack exchange,提问作者Alexnnd
相关产品推荐
相关产品推荐

