【Android】In-App Review APIを使ってレビュー機能をサクッと作ろう

# In-App Review APIとは

<img width="500px" alt="iar-flow.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223159/9612cdc1-769a-3f5c-4cca-6b96527cfc84.jpeg">

>The Google Play In-App Review API lets you prompt users to submit Play Store ratings and reviews without the inconvenience of leaving your app or game.

https://developer.android.com/guide/playcore/in-app-review

アプリやゲームから離れずストア評価・レビューをすることができるAPIで、


>During the flow, the user has the ability to rate your app using the 1 to 5 star system and to add an optional comment. Once submitted, the review is sent to the Play Store and eventually displayed.

ユーザーには星1~5段階評価 + コメントを送信してもらうことが可能となっています。
今まで独自にUIを作成しストア内アプリページへ誘導するなど行っていた方も多いと思いますが、置き換えることができそうです。

※Android 5.0 (API level 21)以上が対応デバイスとなっています。

# 導入方法

### gradle
利用するmodule(app等)のbuild.gradleにGoogle play core library（v1.8.0以上）を追加します。

```gradle:build.gradle

dependencies {
    implementation 'com.google.android.play:core:1.8.0'
or
    implementation 'com.google.android.play:core-ktx:1.8.0'
    ...
}
```

# 利用方法

```kotlin:SampleActivity.kt

import com.google.android.play.core.review.ReviewManagerFactory

button.setOnClickListener {
  val manager = ReviewManagerFactory.create(requireContext())
  val request = manager.requestReviewFlow()
  request.addOnCompleteListener { task: Task<ReviewInfo?> ->
      when {
          task.isSuccessful -> {
            val reviewInfo = task.result
            val flow = manager.launchReviewFlow(requireActivity(), reviewInfo)
            flow.addOnCompleteListener { task1: Task<Void?>? ->
              // The flow has finished.  
            }
          }
          else -> {
            // error or something
          }
       }
   }
}
```

※[ReviewInfo](https://developer.android.com/reference/com/google/android/play/core/review/ReviewInfo) Objectは利用時間が限られているので注意が必要です。
https://developer.android.com/guide/playcore/in-app-review/kotlin-java#kotlin

# テスト方法

#### 1. Google Play Storeの内部テストor内部アプリ共有にて確認
UI込みで確認する場合はこちら一択になります。

#### 2. FakeReviewManager

flowのコールバック確認などを行いたい場合はこちらが有効です。

```kotlin:SampleActivity.kt
import com.google.android.play.core.review.ReviewManagerFactory

button.setOnClickListener {
  // ここが変わる
  val manager = FakeReviewManager(context)
  val request = manager.requestReviewFlow()
  request.addOnCompleteListener { task: Task<ReviewInfo?> ->
      when {
          task.isSuccessful -> {
            val reviewInfo = task.result
            val flow = manager.launchReviewFlow(requireActivity(), reviewInfo)
            flow.addOnCompleteListener { task1: Task<Void?>? ->
              // The flow has finished.  
            }
          }
          else -> {
            // error or something
          }
       }
   }
}
```

試しに1であげてた際のスクショが↓↓↓

レビュー前
<img width="250px" alt="iar-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223159/eb96ea38-ab9d-af92-9041-d8d7b2b3c9ef.png">

レビュー後
<img width="250px" alt="iar-２.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223159/58e9bc1c-cfdf-a7bb-a962-6ba1339e5fe4.png">

# 最後に

内部テストからのレビュー時には非公開レビューとしてストアに表示されるので安心してテストを行うこともできそうです。（仕様として特に書いてない為 あくまで2020/8/7時点での挙動としてご留意ください）

また、ドキュメントには、[レビューをリクエストするタイミング](https://developer.android.com/guide/playcore/in-app-review#when-to-request)や[デザインガイドライン](https://developer.android.com/guide/playcore/in-app-review#design-guidelines)の記載もあるので実際に利用する際には一読しておくことをオススメします。