◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/ビジネス
⟐ ビジネス/2026-04-13初級

Rorkアプリのレーティングを上げる:In-App Reviewリクエストのタイミングと実装ベストプラクティス

RorkアプリにApp Store評価リクエスト(SKStoreReviewManager)を実装する方法と、レビュー獲得率を最大化するタイミング戦略を解説。Rorkへのプロンプト例付きで実装手順を紹介します。

Rork585App Store91レビュー9SKStoreReviewManagerASO27レーティング最適化SwiftUI66

アプリのApp Storeレーティングは、ダウンロード数に直結します。同じカテゴリの競合アプリと並んだとき、星4.5と星3.8では選ばれ方がまったく違う。

Rorkで作ったアプリのレーティングを上げるために一番効果が高いのは、「ちょうどいいタイミング」でレビューをお願いすることです。Appleが提供するSKStoreReviewManagerを使えば、App内から直接レビューダイアログを表示できます。ただしAppleには年3回という表示上限があり、タイミングを間違えると上限を無駄遣いしてしまう。

SKStoreReviewManagerの基本的な制約

まず知っておくべき制約を整理しておく。

  • 年間3回まで: 同一デバイス・同一アプリで年間3回しかダイアログが表示されない(それ以上呼び出しても無視される)
  • Appleが最終判断: requestReview()を呼んでも、Appleのアルゴリズムが「タイミングが悪い」と判断すると表示されない
  • TestFlightでは動作しない: テスト中は表示されないため、実機リリース後にしか効果を確認できない
  • 強制はできない: ダイアログの内容や評価を操作することは規約違反

RorkでIn-App Reviewを実装する

RorkのAIに以下のような指示を出すと、SwiftUIでの実装コードを生成してくれます。

アプリにApp Storeのレビューリクエストを実装してください。
- ユーザーが3回目のセッションを完了したタイミングで表示
- 一度表示したら30日間は再表示しない
- UserDefaultsで状態を管理する

生成されたコードを確認しながら、実際の実装を見てみよう。

import SwiftUI
import StoreKit
 
// レビューリクエストの状態管理
class ReviewManager: ObservableObject {
    private let sessionCountKey = "review_session_count"
    private let lastReviewDateKey = "review_last_requested"
    private let minimumSessionCount = 3
    private let minimumDaysBetweenRequests = 30
    
    var shouldRequestReview: Bool {
        let sessionCount = UserDefaults.standard.integer(forKey: sessionCountKey)
        
        // 必要なセッション数に達していない
        guard sessionCount >= minimumSessionCount else { return false }
        
        // 前回のリクエストから十分な日数が経過しているか確認
        if let lastDate = UserDefaults.standard.object(forKey: lastReviewDateKey) as? Date {
            let daysSinceLastRequest = Calendar.current.dateComponents(
                [.day], from: lastDate, to: Date()
            ).day ?? 0
            guard daysSinceLastRequest >= minimumDaysBetweenRequests else { return false }
        }
        
        return true
    }
    
    func incrementSessionCount() {
        let current = UserDefaults.standard.integer(forKey: sessionCountKey)
        UserDefaults.standard.set(current + 1, forKey: sessionCountKey)
    }
    
    func requestReviewIfAppropriate(in scene: UIWindowScene?) {
        guard shouldRequestReview, let scene = scene else { return }
        
        SKStoreReviewManager.requestReview(in: scene)
        
        // リクエスト日時を記録
        UserDefaults.standard.set(Date(), forKey: lastReviewDateKey)
        
        // カウンターをリセット(次のサイクルのため)
        UserDefaults.standard.set(0, forKey: sessionCountKey)
    }
}
 
// SwiftUIビューでの使用例
struct ContentView: View {
    @StateObject private var reviewManager = ReviewManager()
    @Environment(\.scenePhase) private var scenePhase
    
    var body: some View {
        NavigationStack {
            // メインコンテンツ
            MainContentView()
        }
        .onChange(of: scenePhase) { _, newPhase in
            if newPhase == .active {
                reviewManager.incrementSessionCount()
                
                // ビューが完全に表示されてからダイアログを出すために少し遅延
                DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
                    let scene = UIApplication.shared.connectedScenes
                        .first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene
                    reviewManager.requestReviewIfAppropriate(in: scene)
                }
            }
        }
    }
}

レビュー獲得率を最大化するタイミング戦略

年3回の上限を最大限に活かすには、「ユーザーが満足しているときに呼ぶ」というシンプルな原則を徹底します。

効果的なタイミング:

  • タスクや目標の達成直後(ゲームのステージクリア、目標達成など)
  • アプリを複数回使用した後(3〜5回目のセッション)
  • 機能を実際に活用して価値を実感したとき

避けるべきタイミング:

  • アプリを開いた直後(まだ価値を実感していない)
  • エラーや問題が発生した直後
  • 複雑な操作の途中

実際に効果が高い実装例:ゲームアプリなら「ステージクリア時」、習慣アプリなら「7日連続達成時」、生産性アプリなら「タスク完了5回目時」がそれぞれ高いレビュー率につながります。

// 特定のアクション達成時にレビューリクエストを呼ぶ例
struct TaskCompletionView: View {
    @StateObject private var reviewManager = ReviewManager()
    @State private var completedTaskCount = 0
    
    var body: some View {
        VStack {
            Text("タスク完了: \(completedTaskCount)件")
            
            Button("タスクを完了する") {
                completedTaskCount += 1
                
                // 5件達成時にレビューリクエスト
                if completedTaskCount == 5 {
                    let scene = UIApplication.shared.connectedScenes
                        .first as? UIWindowScene
                    reviewManager.requestReviewIfAppropriate(in: scene)
                }
            }
        }
    }
}

レビューを増やすためのもう一つのアプローチ

SKStoreReviewManager以外にも、レビューを増やす有効な方法があります。

「フィードバック」ボタンの設置: ネガティブなフィードバックをApp Storeに書かれる前に受け取るため、設定画面に「フィードバックを送る」ボタンを置く。メールやサポートフォームに誘導することで、不満を持ったユーザーがApp Storeに低評価を書く前にキャッチできます。

// 設定画面のフィードバックボタン
Button("フィードバックを送る") {
    let subject = "アプリへのフィードバック"
    let body = "アプリバージョン: \(Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "不明")\n\n"
    let urlString = "mailto:support@example.com?subject=\(subject.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "")&body=\(body.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "")"
    
    if let url = URL(string: urlString) {
        UIApplication.shared.open(url)
    }
}

App Storeのレビューページへの直接リンク: 満足しているユーザー向けに、App Storeのレビューページに直接飛ぶリンクを設置します。

// App Storeレビューページへの直接リンク
func openAppStoreReview(appID: String) {
    let urlString = "https://apps.apple.com/app/id\(appID)?action=write-review"
    if let url = URL(string: urlString) {
        UIApplication.shared.open(url)
    }
}

レビュー戦略で一番大切なのは、良いアプリを作ることです。どれだけ巧みにリクエストタイミングを工夫しても、アプリ自体の品質が低ければ低評価が集まる。Rorkで質の高いアプリを作りながら、その価値を実感した瞬間に丁寧にお願いする——これが長期的に最も効果的なアプローチです。

12年の個人開発で見えてきたこと

リリース直後にチェックしているもの

  • クラッシュレポートの上位エラーを24時間ごとに確認しているか
  • AdMob/StoreKit の収益ダッシュボードに異常検知が出ていないか
  • ユーザーレビューに技術的な指摘が含まれていないか
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

⟐ ビジネス2026-05-03
Rork で作ったアプリを App Store でヒットさせる — ASO・価格・課金設計の実践ガイド
Rork で開発したアプリを App Store で見つけてもらい、適切な価格で売り、継続課金にも成功するための実践ガイドです。ASO戦略・価格心理学・IAP設計・サブスクリプション運用を、個人開発の現場で実際に使っている手順として解説します。
⟐ ビジネス2026-04-26
Rork Max のネイティブアプリを App Store 上位へ — 設計から AdMob・StoreKit 2・サブスクまでの順番
Rork Max で作った SwiftUI ネイティブアプリを、カテゴリ上位に残るアプリへ育てるための順番を書き残します。広告を出すかどうかを1か所で決める AdGate、StoreKit 2 の Transaction.updates 監視、ASO とリテンションの線引きまで、動くコード付きです。
⟐ ビジネス2026-07-19
アプリを手放す日の実務 — App Store の「Appを転送」で引き継がれるもの・作り直すもの
App Store Connect の「Appを転送」でアプリを売却・移管する際の条件と実務を整理します。評価やサブスク購読者など引き継がれるもの、TestFlight や APNs キーなど作り直すもの、ユーザーの再ログインが発生する箇所まで公式情報に基づいてまとめました。