Know-how アプリ開発 読了目安 約7分

Flutterでアプリ内レビューを依頼する|タイミングと実装、やってはいけないこと

アプリの評価とレビューは、ストアでの見つけやすさに大きく影響します。ただ、起動直後に「評価してください」と出すと、かえって印象を悪くします。OSが用意している仕組みを使って、自然にお願いする方法を紹介します。

OSが用意しているレビュー依頼の仕組み

iOSとAndroidには、アプリの中からストアの評価を依頼するための公式の仕組みがあります。アプリを離れずに、その場で星をタップして評価できるダイアログです。

iOSAndroid
仕組みの名前SKStoreReviewController(StoreKit)Google Play In-App Review API
表示回数の制限1つのアプリにつき365日で最大3回一定期間ごとの上限あり(詳細は非公開)
表示されるかどうか呼び出しても、OSの判断で表示されないことがある同左
結果の取得評価したかどうかは分からない同左

大事なのは、呼び出しても必ず表示されるとは限らないことです。表示回数の上限や、利用者が設定で依頼をオフにしている場合など、OSが判断して表示を見送ります。また、アプリには「表示されたか」「評価されたか」が伝わりません。そのため、「レビューを依頼する」ボタンを押したのに何も起きない、という作りは避ける必要があります。

in_app_reviewパッケージで実装する

Flutterでは、in_app_review パッケージを使うと、iOSとAndroidの両方の仕組みを同じコードで呼び出せます。pubspec.yaml に追加します。

dependencies:
  in_app_review: ^2.0.0
  shared_preferences: ^2.0.0

バージョンは、追加する時点の最新を flutter pub add in_app_review で入れるのが確実です。基本の呼び出し方は次のとおりです。

import 'package:in_app_review/in_app_review.dart';

Future<void> askForReview() async {
  final inAppReview = InAppReview.instance;
  if (await inAppReview.isAvailable()) {
    await inAppReview.requestReview();
  }
}

isAvailable() は、その端末でダイアログを出せる状態かを確認します。Androidでは、Google Playからインストールしたアプリでないと false になることがあります。

「いつ出すか」がいちばん大切

レビュー依頼は、出すタイミングで結果が大きく変わります。起動した直後や、何かの作業の途中に出すと、利用者は邪魔に感じて閉じるか、低い評価をつけてしまいます。

おすすめは、利用者が目的を達成して、満足しているであろう瞬間です。

  • ゲームでステージをクリアした直後
  • 写真の加工を終えて保存した直後
  • 記録アプリで7日連続の記録を達成したとき
  • ツールで変換が成功し、結果を確認したあと

逆に、エラーが出た直後、課金の画面、初めて起動したときのチュートリアル中は避けます。何度か使ってもらい、アプリの良さが伝わったあとで聞くのが基本です。

条件をつけて出すコード例

次の例では、「インストールから3日以上たっている」「目的の操作が5回以上成功した」「前回の依頼から120日以上たっている」の3つを満たしたときだけ、レビューを依頼します。記録には shared_preferences を使っています。

import 'package:in_app_review/in_app_review.dart';
import 'package:shared_preferences/shared_preferences.dart';

class ReviewPrompter {
  static const _kFirstLaunch = 'review_first_launch';
  static const _kSuccessCount = 'review_success_count';
  static const _kLastAsked = 'review_last_asked';

  /// アプリ起動時に1回呼ぶ(初回起動日を記録する)
  static Future<void> recordLaunch() async {
    final prefs = await SharedPreferences.getInstance();
    if (!prefs.containsKey(_kFirstLaunch)) {
      await prefs.setInt(_kFirstLaunch, DateTime.now().millisecondsSinceEpoch);
    }
  }

  /// 目的の操作が成功したときに呼ぶ(保存完了、クリアなど)
  static Future<void> onSuccess() async {
    final prefs = await SharedPreferences.getInstance();
    final count = (prefs.getInt(_kSuccessCount) ?? 0) + 1;
    await prefs.setInt(_kSuccessCount, count);

    final now = DateTime.now();
    final first = DateTime.fromMillisecondsSinceEpoch(
        prefs.getInt(_kFirstLaunch) ?? now.millisecondsSinceEpoch);
    final lastMs = prefs.getInt(_kLastAsked);
    final last = lastMs == null ? null : DateTime.fromMillisecondsSinceEpoch(lastMs);

    final installedLongEnough = now.difference(first).inDays >= 3;
    final usedEnough = count >= 5;
    final notAskedRecently = last == null || now.difference(last).inDays >= 120;
    if (!(installedLongEnough && usedEnough && notAskedRecently)) return;

    final inAppReview = InAppReview.instance;
    if (await inAppReview.isAvailable()) {
      await prefs.setInt(_kLastAsked, now.millisecondsSinceEpoch);
      await inAppReview.requestReview();
    }
  }
}

呼び出す側では、保存が終わって完了のメッセージを表示したあとなど、画面が落ち着いたタイミングで ReviewPrompter.onSuccess() を呼びます。ほかのダイアログや広告が表示されている最中に重ならないようにしてください。全画面広告を閉じた直後なども、利用者の気分が乗っていないので避けたほうが無難です。

許可の確認画面と同じく、ダイアログを重ねない考え方は、アプリの「許可しますか?」はなぜタイミングが大事なのかでも書いています。

やってはいけない依頼のしかた

AppleとGoogleは、それぞれのガイドラインでレビュー依頼の方法にルールを設けています。違反すると、審査でのリジェクトやストアからの削除につながることがあります。

  • 満足した人だけをストアに誘導する:「このアプリは気に入りましたか?」と聞き、「はい」の人だけにレビューを依頼し、「いいえ」の人は問い合わせフォームに誘導する。こうした選別(レビューゲーティング)は認められていません。Googleは、評価ダイアログの前に意見を尋ねる質問を表示すること自体を禁じています。
  • 見返りを約束する:「レビューを書くとコインがもらえる」など、評価と引き換えに特典を渡すことは禁止されています。
  • 独自のレビュー依頼画面を出す:iOSでは、レビューの依頼には公式の仕組みを使うことが求められています。自作のポップアップで星を選ばせる方法は使わないようにします。
  • ボタンに割り当てる:「評価する」ボタンを押したときに requestReview() を呼ぶと、表示制限に引っかかったときに何も起きず、壊れているように見えます。

「評価する」ボタンを置きたいときは

設定画面などに、利用者が自分の意思でレビューを書けるボタンを置きたい場合は、ストアのアプリのページを開く openStoreListing を使います。こちらは回数の制限がなく、押せば必ずストアが開きます。

await InAppReview.instance.openStoreListing(
  appStoreId: '1234567890', // iOSのApple ID(App Store ConnectのアプリIDの数字)
);

Androidではパッケージ名から自動でストアのページが開くので、appStoreId はiOS用の指定です。

動作確認の注意点

  • iOS:開発中(Xcodeやflutter runで入れたアプリ)では、呼び出すたびにダイアログが表示されますが、送信はできません。TestFlightで配布したアプリでは表示されません。本番と同じ動きは、ストア公開後にしか確認できません。
  • Android:Google Playからインストールしたアプリでないと表示されません。確認には、Play Consoleの内部テストトラックや、内部アプリ共有を使います。一度表示すると上限に達して出なくなることがあるので、何度も試したい場合はテスト用のアカウントを使います。

まとめ

  • レビュー依頼は、OSの公式の仕組み(in_app_review)を使う。表示されるかどうかはOSが決める。
  • 何度か使ってもらい、目的を達成して満足した瞬間に出す。
  • ほかのダイアログや広告と重ねない。前回から十分に期間を空ける。
  • 満足度で選別する、見返りを約束する、といった依頼のしかたはしない。
  • 設定画面のボタンには openStoreListing を使う。

レビューの数を増やすいちばんの近道は、結局のところ、使い続けたくなるアプリにすることです。その考え方は個人開発アプリが「使われ続ける」ために大切なことにまとめています。