App Distribution Android SDK を使用して新しいアプリ内ビルドアラートを設定する

オプションの Firebase App Distribution SDK を使用すると、アプリの新しいビルドがインストール可能になった場合にアプリ内アラートをテスターに表示できます。このガイドでは、App Distribution SDK を使用してテスター向けの新しいビルドアラートを作成する方法と、それをカスタマイズする方法について説明します。

始める前に

まだ Firebase を Android プロジェクトに追加していない場合は追加します。

ステップ 1: App Distribution Tester API を有効にする

  1. Google Cloud Console でプロジェクトを選択します。

  2. [Firebase App Testers API] で [有効にする] をクリックします。

ステップ 2: App Distribution をアプリに追加する

アプリレベルのモジュールの Gradle ファイル(通常は app/build.gradle)で、App Distribution Android SDK の依存関係を宣言します。

Java

dependencies {
    // ADD this line
    implementation 'com.google.firebase:firebase-appdistribution:16.0.0-beta02'
}

Kotlin+KTX

dependencies {
    // ADD this line
    implementation 'com.google.firebase:firebase-appdistribution-ktx:16.0.0-beta02'
}

ステップ 3: アプリ内アラートを構成する

App Distribution SDK でテスター向けアプリ内ビルドアラートを設定するには、次の方法があります。

  • 基本アラート構成: テスターに対して表示される、アプリのアップデートとログインのための事前構築済みのダイアログが含まれます。
  • 詳細アラート構成: 独自のユーザー インターフェースをカスタマイズできます。

App Distribution SDK を初めて使用する場合は、基本アラート構成を使用することをおすすめします。

基本構成

updateIfNewReleaseAvailable を使用して、アラートをまだ有効にしていないテスターに対して事前構築済みの有効化アラート ダイアログを表示し、新しいビルドが提供されているかどうかを確認します。このメソッドを呼び出すと、このメソッドにより次のシーケンスが実行されます。

  1. テスターがアラートを有効にしているか確認します。テスターがまだアラートを有効にしていない場合は、Google アカウントを使用して App Distribution にログインするよう求めます。

  2. 対象のテスター向けの新しいインストール ビルドがあるかどうか確認します。

  3. 事前構築済みのアラートをテスターに表示して、アップデートを促します。

  4. 新しいビルドが Android App Bundle(AAB)の場合、テスターは Google Play にリダイレクトされ、そこでアップデート プロセスを完了します。

    新しいビルドが Android Application Package(APK)の場合、SDK はバックグラウンドで新しいビルドをダウンロードします。ダウンロードが完了すると、インストールを促すプロンプトがテスターに表示されます。SDK は NotificationManager を使用して、ダウンロードの進行状況の通知をユーザーに送信します。onProgressUpdate ハンドラを updateIfNewReleaseAvailable タスクにアタッチして独自の進行状況インジケーターを追加することもできます。

updateIfNewReleaseAvailable() は、アプリ内の任意の場所で呼び出すことができます。たとえば、MainActivity の onResume() メソッドの実行中に updateIfNewReleaseAvailable() を呼び出すことができます。

次の例では、テスターがアラートを有効にしているかどうか、また、新しいビルドにアクセスできるかどうかを確認します。それらの条件が満たされている場合、ビルドのインストールが可能になるとダイアログが表示されます。

Java

public class MainActivity extends AppCompatActivity {
    FirebaseAppDistribution firebaseAppDistribution =
        FirebaseAppDistribution.getInstance();

    @Override
    public void onResume() {
        super.onResume();
        firebaseAppDistribution.updateIfNewReleaseAvailable()
            .addOnProgressListener(updateProgress -> {
              // (Optional) Implement custom progress updates in addition to
              // automatic NotificationManager updates.
            })
            .addOnFailureListener(e -> {
              if (e instanceof FirebaseAppDistributionException) {
                // Handle exception.
              }
            });
    }
}

Kotlin+KTX

class MainActivity : AppCompatActivity() {
    var firebaseAppDistribution = FirebaseAppDistribution.getInstance()

    override fun onResume() {
        super.onResume()
        firebaseAppDistribution.updateIfNewReleaseAvailable()
            .addOnProgressListener { updateProgress ->
              // (Optional) Implement custom progress updates in addition to
              // automatic NotificationManager updates.
            }
            .addOnFailureListener { e ->
                if (e is FirebaseAppDistributionException) {
                    // Handle exception.
                }
            }
    }
}

詳細構成

ログインの詳細構成

signInTester メソッドと isTesterSignedIn メソッドを使用すると、テスターのログイン エクスペリエンスを柔軟にカスタマイズでき、操作感をアプリのデザインに合わせることができます。

次の例では、テスターが App Distribution テスター アカウントにすでにログインしているかどうかを確認します。これにより、まだログインしていないテスターにのみログイン ユーザー インターフェース(UI)を表示できます。テスターがログインしたら、updateIfNewReleaseAvailable を呼び出して、テスターが新しいビルドにアクセスできるかどうかを確認します。

Java


if (!firebaseAppDistribution.isTesterSignedIn()) {
    // Start your sign in UI here.
    //
    // When the tester chooses to proceed with the update,
    // call signInTester():
    //
    //   firebaseAppDistribution.signInTester().addOnSuccessListener( unused -> {
    //       // Handle successful sign in.
    //   }).addOnFailureListener(e -> {
    //       // Handle failed sign in.
    //   });
}

// Only check for updates if the tester is already signed in (do not prompt).
if (firebaseAppDistribution.isTesterSignedIn()) {
    firebaseAppDistribution.updateIfNewReleaseAvailable().addOnFailureListener( e -> {
        // Handle failed update.
    });
}

Kotlin+KTX

if (!firebaseAppDistribution.isTesterSignedIn) {
    // Start your sign in UI here.
    //
    // When the tester chooses to proceed with the update,
    // call signInTester():
    //
    //   firebaseAppDistribution.signInTester().addOnSuccessListener {
    //       // Handle successful sign in.
    //   }.addOnFailureListener {
    //       // Handle failed sign in.
    //   });
}

// Only check for updates if the tester is already signed in (do not prompt).
if (firebaseAppDistribution.isTesterSignedIn) {
    firebaseAppDistribution.updateIfNewReleaseAvailable().addOnFailureListener {
        // Handle failed update.
    }
}

アップデートの詳細構成

checkForNewRelease メソッドと updateApp メソッドを使用すると、テスターにアップデートを促す際のプロンプトを柔軟にカスタマイズできます。また、事前構築済みのアップデート ダイアログやダウンロード進行状況インジケーターをカスタマイズして、アプリのデザインに合わせることもできます。

なお、updateApp にはダウンロードの進行状況を示す機能はありません。したがって、NotificationManager を使用するか、なんらかのアプリ内ステータス表示を使用するか、または他のアプローチを使用して、独自の進行状況表示を実装する必要があります。

次の例では、新しいリリースが提供されているかどうかを確認してから、カスタム UI を表示します。checkForNewReleaseupdateApp を呼び出す前にログインの詳細構成を使用して、テスターがログインしていることを確認してください。

Java

firebaseAppDistribution.checkForNewRelease().addOnSuccessListener(release -> {
    if (release != null) {  // New release available.

        // Start your update UI here.
        //
        // When the tester chooses to proceed with the update, call updateApp():
        //
        //      firebaseAppDistribution.updateApp()
        //              .addOnProgressListener(updateState -> {
        //                  // Use updateState to show update progress.
        //              });
    }
}).addOnFailureListener(e -> {
    // Handle failed check for new release.
});

Kotlin+KTX

firebaseAppDistribution.checkForNewRelease().addOnSuccessListener { release ->
    if (release != null) { // New release available.

        // Start your update UI here.
        //
        // When the tester chooses to proceed with the update, call updateApp():
        //
        //      firebaseAppDistribution.updateApp()
        //          .addOnProgressListener { updateState ->
        //              // Use updateState to show update progress.
        //          }
    }
}.addOnFailureListener {
    // Handle failed check for new release.
}

ステップ 4: 送付する前に App Distribution がリリース前のビルドのみに含まれるように分離する

App Distribution Android SDK は本番環境用アプリでの使用を意図していません。この SDK に組み込まれている自己更新機能は、ランタイムにコードが実行されない場合であっても、Google Play ポリシー違反とみなされる可能性があります。

Android SDK のコードが本番環境用アプリに含まれないようにするには、リリース前ビルド バリアントのソースセットで実装されているクラスからこの SDK を使用し、本番環境のソースセットではこの SDK が使用されないようにすることをおすすめします。このクラスでは、アプリの他の部分で必要な機能は公開する必要があります。

たとえば、上記のログインの詳細構成を使用する場合は、リリース前バリアント内で、SDK を使用してテスターのログインとアプリのアップデートを行うメソッドが含まれるクラスを実装します。

Java

// src/{pre-release variant}/java/com/example/AppDistributionWrapper.java

class AppDistributionWrapper {
    FirebaseAppDistribution firebaseAppDistribution =
        FirebaseAppDistribution.getInstance();

    void signInAndUpdate() {
        // Use the App Distribution SDK to sign in the tester and update the app.
    }
}

Kotlin+KTX

// src/{pre-release variant}/java/com/example/AppDistributionWrapper.kt

class AppDistributionWrapper {
    val firebaseAppDistribution = FirebaseAppDistribution.getInstance()

    fun signInAndUpdate() {
        // Use the App Distribution SDK to sign in the tester and update the app.
    }
}

本番環境のバリアント ソース内で、同じクラスの別バージョン(SDK を使用しないバージョン)を実装します。

Java

// src/{production variant}/java/com/example/AppDistributionWrapper.java

class AppDistributionWrapper {
    void signInAndUpdate() {
        // In production, do nothing.
    }
}

Kotlin+KTX

// src/{production variant}/java/com/example/AppDistributionWrapper.kt

class AppDistributionWrapper {
    fun signInAndUpdate() {
        // In production, do nothing.
    }
}

アプリコード(たとえば、メイン アクティビティの onResume() 内)から、ラッパー メソッドを呼び出します。

Java

// src/main/java/com/example/MainActivity.java

public class MainActivity extends AppCompatActivity {
    AppDistributionWrapper appDistributionWrapper =
        new AppDistributionWrapper();

    @Override
    public void onResume() {
        super.onResume();
        appDistributionWrapper.signInAndUpdate();
    }
}

Kotlin+KTX

// src/main/java/com/example/MainActivity.kt

class MainActivity : AppCompatActivity() {
    var appDistributionWrapper = AppDistributionWrapper()

    override fun onResume() {
        super.onResume()
        appDistributionWrapper.signInAndUpdate()
    }
}

アプリレベルのモジュールの Gradle ファイル(通常は app/build.gradle)で、App Distribution Android SDK の依存関係を更新し、リリース前のビルド バリアントのみが含まれるようにします。

Java

dependencies {
    // UPDATE the dependency to include the "beta" variant only (example)
    betaImplementation 'com.google.firebase:firebase-appdistribution:16.0.0-beta02'
}

Kotlin+KTX

dependencies {
    // UPDATE the dependency to include the "beta" variant only (example)
    betaImplementation 'com.google.firebase:firebase-appdistribution-ktx:16.0.0-beta02'
}

ステップ 5: 実装をビルドしてテストする

最後に、アプリをビルドし、Firebase コンソールを使用してテスターにビルドを配布して実装をテストします。

次のような一般的な問題については、アプリの配布に関するトラブルシューティング ガイドをご覧ください。

  • テスターがアプリ内アラートを受信できない
  • テスターが Google へのログインを複数回求められる
  • テスターのログインループが発生する