如何提高 iOS App 评分?99% 的开发者都用错了时机
这里每天分享一个 iOS 的新知识,快来关注我吧
前言
做 iOS 开发,应用的评价和评分有多重要,不用我说你也知道。App Store 的推荐算法、用户的下载决策,都跟评价数量和评分直接相关。
今天来讲讲如何引导用户评价你的应用。
StoreKit 2 的 RequestReviewAction
StoreKit 2 有一个 RequestReviewAction 环境值,专门用来请求用户评价。
它有个限制:一年内最多只能请求 3 次。这个限制是苹果控制的,你调用再多也没用,系统会自动限制。
这也意味着,你得选对时机,别浪费这 3 次机会。一年就 3 次,用完了就没了。
什么时候请求评价最合适?
苹果官方建议的最佳实践是这些:
1. 在用户完成某个成功操作后请求
比如用户完成了一个任务、达成了一个成就、或者完成了一轮游戏。这时候用户心情好,更愿意给好评。
2. 不要在应用启动时请求
即使不是第一次启动,也不要一打开应用就弹评价请求。用户还没用呢,你就要评价,体验很差。
3. 不要作为用户操作的直接结果
比如用户点击了某个按钮,不要立即弹出评价请求。应该延迟一下,让用户完成操作,再请求评价。
4. 避免在用户遇到问题或错误时请求
这个不用说了,用户正烦着呢,你这时候要评价,不是找骂吗?
简单说就是:选用户心情好的时候,别打扰用户。
基础实现
在 SwiftUI 里用 RequestReviewAction 很简单:
import SwiftUIimport StoreKitstruct ContentView: View {@Environment(\.requestReview) private var requestReviewvar body: some View {VStack {// 你的界面内容Button("请求评价") { presentReview() } } }private func presentReview() {Task {// 延迟 2 秒,确保用户完成操作try await Task.sleep(for: .seconds(2))await requestReview() } }}
注意这里有个延迟,让用户先完成操作,再请求评价。这个延迟很重要,别省略。我刚开始用的时候没加延迟,结果体验很差。
点击之后就会弹出评价弹窗:

UIKit 实现
如果你用的是 UIKit,实现也很简单。用 SKStoreReviewController 就行:
import UIKitimport StoreKitclass ViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad()let button = UIButton(type: .system) button.setTitle("请求评价", for: .normal) button.addTarget(self, action: #selector(requestReviewTapped), for: .touchUpInside) button.translatesAutoresizingMaskIntoConstraints = false view.addSubview(button)NSLayoutConstraint.activate([ button.centerXAnchor.constraint(equalTo: view.centerXAnchor), button.centerYAnchor.constraint(equalTo: view.centerYAnchor) ]) }@objc private func requestReviewTapped() { presentReview() }private func presentReview() {Task {// 延迟 2 秒,确保用户完成操作try? await Task.sleep(for: .seconds(2))await MainActor.run {if let windowScene = view.window?.windowScene {SKStoreReviewController.requestReview(in: windowScene) } } } }}
UIKit 的实现稍微复杂一点,需要获取 windowScene。但核心逻辑是一样的,都是延迟一下再请求评价。
版本管理:避免重复请求
苹果的限制是一年 3 次,但实际项目里,你肯定不想在同一个版本里重复请求。用户已经评价过了,再弹就没意义了。
所以最好记录一下,当前版本是否已经请求过评价。可以用 UserDefaults 来记录,我写了个 ReviewPromptManager 来管理这个:
import Foundation@MainActorfinal class ReviewPromptManager {static let shared = ReviewPromptManager()private let lastPromptedVersionKey = "lastPromptedVersion"private var currentAppVersion: String? {Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String }/// 返回 `true` 如果当前版本还没请求过评价func canRequestReview() -> Bool {guard let currentAppVersion else { return false }let lastPromptedVersion = UserDefaults.standard.string(forKey: lastPromptedVersionKey)return lastPromptedVersion != currentAppVersion }/// 标记当前版本已经请求过评价func markReviewRequested() {guard let currentAppVersion else { return }UserDefaults.standard.set(currentAppVersion, forKey: lastPromptedVersionKey) }}
这个 ReviewPromptManager 会检查当前版本是否已经请求过评价。如果请求过,就不再请求了。每次更新版本后,会重新允许请求。用起来很简单,直接调用 canRequestReview() 检查就行。
完整的实现方案
把版本管理和评价请求结合起来,就是一个完整的方案。实际用的时候,在用户完成某个成功操作后,检查一下是否可以请求,然后延迟一下再弹:
import SwiftUIimport StoreKitstruct ContentView: View {@Environment(\.requestReview) private var requestReviewvar body: some View {VStack {// 你的界面内容Button("完成某个操作") { handleSuccessAction() } } }private func handleSuccessAction() {// 处理成功操作// ...// 检查是否可以请求评价if ReviewPromptManager.shared.canRequestReview() { presentReview() } }private func presentReview() {Task {// 延迟 2 秒,确保用户完成操作try? await Task.sleep(for: .seconds(2))await requestReview()ReviewPromptManager.shared.markReviewRequested() } }}
这样就能避免重复请求,也能在合适的时机请求评价。实际用的时候,记得在用户完成某个成功操作后再检查,别一打开应用就弹。
我能想到的一些实际应用场景,针对不同的应用
习惯追踪应用
用户完成连续打卡 10 天,这时候心情好,很适合请求评价。
游戏应用
用户赢得一局游戏,这时候情绪高涨,很适合请求评价。但要注意,不要每局都请求,可以设置一个条件,比如连续赢 3 局,或者达到某个里程碑。
学习应用
用户完成一个课程、通过一个测试,这时候有成就感,很适合请求评价。
健身应用
用户完成一个训练计划、达到一个目标,这时候有满足感,很适合请求评价。
总之就是选用户心情好的时候,成功率会高很多。
用户隐私设置
iOS 有个隐私设置,允许用户全局禁用应用的评价请求。如果用户开启了这个设置,你的请求就不会显示。这个你控制不了,但也不用担心,根据我的经验,大部分用户还是愿意评价的。
不过要注意,有些用户就是不喜欢评价,即使他们很喜欢你的应用。这很正常,不用强求。
最后
你的应用里有请求评价的功能吗?遇到过什么坑?评论区聊聊。
这里每天分享一个 iOS 的新知识,快来关注我吧
夜雨聆风
