Objective-C项目中如何用RequestReviewAction替代废弃的SKStoreReviewController?
在Objective-C中集成RequestReviewAction替代废弃的SKStoreReviewController
前提说明
SKStoreReviewController的requestReview方法在iOS 16.0及以上已被废弃,替代方案是使用UIWindowScene的requestReviewActionWithCompletionHandler:方法。这个API仅支持iOS 16.0+,所以必须做好版本兼容处理。
集成步骤与代码示例
导入必要框架
在需要调用评分功能的文件中,导入UIKit和StoreKit框架:#import <UIKit/UIKit.h> #import <StoreKit/StoreKit.h>版本判断与调用评分请求
在触发评分的逻辑点(比如用户完成某个操作后),加入以下代码:// 检查系统版本是否支持新API if (@available(iOS 16.0, *)) { // 获取当前活跃的UIWindowScene(支持多场景App的适配逻辑) UIWindowScene *activeScene = nil; for (UIScene *scene in [UIApplication sharedApplication].connectedScenes) { if (scene.activationState == UISceneActivationStateForegroundActive && [scene isKindOfClass:[UIWindowScene class]]) { activeScene = (UIWindowScene *)scene; break; } } if (activeScene) { // 发起评分请求,并处理回调 [activeScene requestReviewActionWithCompletionHandler:^(NSError * _Nullable error) { if (error) { // 请求失败时的处理:比如引导用户手动前往App Store评分 NSLog(@"评分请求失败: %@", error.localizedDescription); } else { // 请求已成功发起,弹窗是否显示由系统决定 NSLog(@"评分请求已提交"); } }]; } } else { // 兼容iOS 16以下版本,使用旧API [SKStoreReviewController requestReview]; }
关键注意事项
- 系统频率限制:不管新旧API,系统都会限制评分弹窗的展示频率,短时间内重复调用不会触发弹窗,不要在用户每次操作时都调用。
- 回调的意义:
completionHandler仅告知你请求是否成功发起,无法得知用户是否完成评分或给出了什么评分。 - 场景获取逻辑:如果你的App支持多场景(比如iPad分屏),需要确保获取的是当前用户活跃的场景,否则可能无法触发弹窗。
- 测试注意:在开发环境/模拟器中,评分弹窗会每次响应调用;但在正式App Store环境中,系统会根据用户的使用频率等条件决定是否展示弹窗。
内容的提问来源于stack exchange,提问作者Alexandro
相关产品推荐
相关产品推荐

