RORK LABEN
TOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しましたTOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しました
記事一覧/ビジネス
ビジネス/2026-04-13初級

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

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

Rork515App Store78レビュー9SKStoreReviewManagerASO27レーティング最適化SwiftUI63

アプリの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-06-14
レビュー数は『お願いの文面』より『出すタイミング』で決まる — Rork アプリの評価設計
Rork で出したアプリのレビュー数が伸びないとき、原因の多くは依頼の文面ではなく、依頼を出す瞬間の選び方にあります。expo-store-review の頻度制限と、評価を得やすい『嬉しさの瞬間』の定義をまとめました。
ビジネス2026-06-02
壁紙アプリの App Store ローカライズを多言語で運用して見えた所感 — メタデータ翻訳より「現地での読まれ方」を整える
壁紙アプリの App Store ローカライズを複数ロケールで運用してきて分かった、メタデータ翻訳・キーワード欄・スクリーンショット文言の現地化の手応えと落とし穴を、個人開発の現場目線でまとめた所感です。
ビジネス2026-05-12
RorkアプリをAndroidに展開して最初に驚いたこと — App StoreとGoogle Playの設計思想の違い
10年超の個人開発・累計5,000万DL超の経験から語る、RorkアプリをAndroidに展開したときに発見したApp StoreとGoogle Playの根本的な違い。Short DescriptionやASO戦略など、知らないと損するポイントをまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →