Firebase.com から Android アプリをアップグレード

このドキュメントでは、既存の Firebase.com のアプリを新規の Firebase コンソールおよび API にアップグレードする方法について説明します。

アップグレードには次の 4 つの手順が必要になります。

  1. プロジェクトを新規の Firebase コンソールにアップグレードする
  2. 新規の Firebase SDK をインストールする
  3. データベースのコードを更新する
  4. 認証コードを更新する

プロジェクトは、新規の firebase.google.com コンソールにいつでもアップグレードすることができます。アプリケーションの動作は継続します。アプリケーションで Firebase の新機能の一部を使用できるようになったら、コードを更新することができます。

新規の Firebase コンソールにプロジェクトをインポート

  • Firebase コンソールに進み、「現在 Firebase.com に存在するプロジェクト」で対象のプロジェクトを見つけます。
  • アップグレードしたいプロジェクトの [インポート] ボタンをクリックします。
    • プロジェクトが firebase.com の有料プランに属する場合は、新規コンソールでプロジェクトのお支払い先を指定する必要があります。お支払い情報が自動的に移行することはありません。
    • 請求先アカウントを選択または作成します。インポートの完了後、プロジェクトのすべての請求はこのアカウントで行われます。
  • Realtime Database と Hosting のコンテンツは、Firebase コンソールに即座に自動インポートされます。
  • ユーザーデータは新たな認証バックエンドに自動的に移行します。データの移行はバックグラウンドで実行されるため、ユーザーはアプリの使用を続行できます。ユーザーの登録やログインも影響を受けません。ユーザー アカウントの移行中は、Firebaseコンソールの Auth タブにスピナーが表示されます。
  • Firebase.com アプリにアクティブなプロモーション コードがある場合は、お問い合わせください

新規の Firebase SDK をインストール

アプリケーションのコードを即座に更新する必要はありません。既存のデータベースと認証コードは、移行を終えたプロジェクトでも動作を続けます。ただし、アプリケーションで Firebase の新機能の一部を使用する準備ができたら、新規の Firebase SDK をインストールできます(新規の google-services.json ファイルをダウンロードし、gradle ファイルに google-services プラグインを忘れずに追加してください)。

新規 SDK の使用を開始すると、Firebase 向け Google アナリティクスが自動的に有効になります。デフォルトでは、アナリティクスのデータにより Firebase の他の機能や Google サービスが向上します。アナリティクスのデータを共有する方法は、設定でいつでも変更できます。 詳しくはこちらをご覧ください。

データベースのコードを更新

Gradle の依存関係を更新

最も簡単な開始方法は、Gradle の依存関係を変更することです。

変更前

dependencies {
  compile 'com.firebase:firebase-client-android:x.x.x'
}
変更後

dependencies {
  compile "com.google.firebase:firebase-database:10.2.6"
}

クラス リファレンスを修正

クラスの名前変更や移動により、アプリでは数多くのコンパイル エラーが発生しているはずです。これらの多くは、いくつかのシンプルな置換を行うことで修正することができます。

修正前 修正後
com.firebase.client com.google.firebase.database
FirebaseError DatabaseError
FirebaseException DatabaseException
Firebase.AuthStateListener FirebaseAuth.AuthStateListener
Firebase DatabaseReference

対象のクラスやメソッドが見つからない場合は、データベース参照ドキュメントを参照してください。

Android コンテキストを設定し、オフライン永続性を有効にする

新規 SDK では今後 Firebase.setAndroidContext() を呼び出す必要はありませんので、コードから削除してかまいません。

アプリでディスクの永続性を使用している場合は、FirebaseDatabase オブジェクトでこれを有効にできます。

変更前

Firebase.getDefaultConfig().setPersistenceEnabled(true);
変更後

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

2.x SDK の場合と同様、ディスクの永続性の有効化は、データベースへのその他の呼び出しが行われる前に完了している必要があります。

データベース参照を作成

新規の SDK では、Firebase 参照を DatabaseReference に置き換え、FirebaseDatabase クラスを使用してデータベースへの初期参照を取得します。データベース参照は、コードで以下のように取得できます。

変更前

Firebase rootRef = new Firebase("https://<your-app>.firebaseio.com/");
変更後

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();

Database URL は、ダウンロードした google-services.json ファイルに基づいて自動的に決定されるため、手動で指定する必要はありません。ただし、手動で指定することは可能です(データ移行時に役立つ場合があります)。

変更前

Firebase ref = new Firebase("https://<your-app>.firebaseio.com/path/to/data");
変更後

DatabaseReference ref = FirebaseDatabase.getInstance()
    .getReferenceFromUrl("https://<your-app>.firebaseio.com/path/to/data");

Java モデル オブジェクトを更新

2.x SDK の場合と同様、Firebase Database は、ユーザーが DatabaseReference.setValue() に渡した Java オブジェクトを JSON に自動変換し、DataSnapshot.getValue() を使用して JSON を Java オブジェクトへ読み込むことができます。

新規 SDK では、DataSnapshot.getValue() で JSON を Java オブジェクトへ読み込む際に、JSON の不明のプロパティはデフォルトで無視されるため、今後 @JsonIgnoreExtraProperties(ignoreUnknown=true) は不要になります。

Java オブジェクトを JSON に書き込む際に項目 / ゲッターを除外する場合、メモには今後、@JsonIgnore ではなく @Exclude を使用します。

変更前

@JsonIgnoreExtraProperties(ignoreUnknown=true)
public class ChatMessage {
   public String name;
   public String message;
   @JsonIgnore
   public String ignoreThisField;
}

dataSnapshot.getValue(ChatMessage.class)
変更後

public class ChatMessage {
   public String name;
   public String message;
   @Exclude
   public String ignoreThisField;
}

dataSnapshot.getValue(ChatMessage.class)

Java クラスにない JSON に余分なプロパティが存在する場合は、ログファイルに次の警告が表示されます。

W/ClassMapper: No setter/field for ignoreThisProperty found on class com.firebase.migrationguide.ChatMessage

この警告は、クラスに @IgnoreExtraProperties メモを配置することで削除できます。Firebase Database を 2.x SDK の場合と同様に動作させ、不明のプロパティがある場合に例外をスローする場合は、クラスに @ThrowOnExtraProperties メモを配置します。

認証コードを更新

Firebase Authentication 機能は現在、独自の FirebaseAuth クラスの背後で動作しているため、認証は現在 Firebase 参照ではなく FirebaseAuth インスタンスで動作しています。

Gradle の依存関係を更新

Authentication 機能は独自のモジュールで動作しているため、最初に依存関係を build.gradle に追加する必要があります。

dependencies {
  compile 'com.google.firebase:firebase-auth:10.2.6'
}

インポートを更新

変更前

import com.firebase.client.AuthData;
変更後

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

ユーザーを匿名でログイン

認証メソッドは以前と同様に動作しますが、現在は FirebaseAuth オブジェクトでのメソッドとして新たな名前が付けられています。AuthData は現在 FirebaseUser に置き換えられています。2.x API および新規 API の両方の、匿名でのログイン例を以下に示します。

変更前

ref.authAnonymously(new Firebase.AuthResultHandler() {
   public void onAuthenticated(AuthData authData) { }
   public void onAuthenticationError(FirebaseError firebaseError) {
       throw firebaseError.toException();
   }
});
変更後

FirebaseAuth auth = FirebaseAuth.getInstance();
auth.signInAnonymously().addOnFailureListener(new OnFailureListener() {
   public void onFailure(Throwable throwable) {
       throw new RuntimeException(throwable);
   }
});

カスタム トークンによるユーザーのログイン

クライアント側でカスタム トークンを使用して認証する方法も、これまでの動作方法とほぼ同じです。次に、カスタム トークンによるログインの方法を 2.x API と新規 API とで示します。

変更前

ref.authWithCustomToken(AUTH_TOKEN, new Firebase.AuthResultHandler() {
   public void onAuthenticated(AuthData authData) { }
   public void onAuthenticationError(FirebaseError firebaseError) {
       throw firebaseError.toException();
   }
});
変更後

FirebaseAuth auth = FirebaseAuth.getInstance();
auth.signInWithCustomToken(AUTH_TOKEN)
        .addOnCompleteListener(this, new OnCompleteListener() {
            @Override
            public void onComplete(@NonNull Task task) {
            }
        });

サーバー上で生成するカスタム トークンは、新しい形式です。Node.js および Java 対応の Firebase Admin SDK を使用して、新規 API と互換性のあるカスタム トークンを作成することも、サードパーティの JWT ライブラリを使用してカスタム トークンを作成することもできます。

2.x API のヘルパー ライブラリでデフォルトで生成されるトークンは、有効期限が 24 時間となりますが、Firebase Admin SDK で生成されるカスタム トークンの有効期限は 1 時間です。

ソーシャル プロバイダのユーザーをログイン

Google、Facebook、Twitter などのソーシャル プロバイダの場合、変更点がやや大きくなります。

ソーシャル プロバイダのフローに変更はありません。最初にプロバイダからユーザーの認証情報を取得して、これらをもとに Firebase で認証を行います。

変更前

ref.authWithOAuthToken(provider, token, authResultHandler);
変更後

AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
mAuth.signInWithCredential(credential)

詳細については、Firebase での Facebook 認証の使用、または Firebase での Google 認証の使用を参照してください。

Twitter の認証も若干異なります。

変更前

Map options = new HashMap<>();
options.put("oauth_token", oauth_token);
options.put("oauth_token_secret", oauth_token_secret);
options.put("user_id", user_id);
ref.authWithOAuthToken(token.provider, options, authResultHandler);
変更後

AuthCredential credential = TwitterAuthProvider.getCredential(token, secret);
mAuth.signInWithCredential(credential)

詳細については、Twitter を使用した認証を参照してください。

ユーザーをログアウト

変更前

ref.unauth()
変更後

FirebaseAuth.getInstance().signOut();

認証状態をモニタリング

変更前

ref.addAuthStateListener(new Firebase.AuthStateListener() {
   @Override
   public void onAuthStateChanged(final AuthData authData) {
       if (authData != null) {
           Log.i("AuthStateChanged", "User is signed in with uid: " + authData.getUid());
       } else {
           Log.i("AuthStateChanged", "No user is signed in.");
       }
   }
});
変更後

FirebaseAuth auth = FirebaseAuth.getInstance();
auth.addAuthStateListener(new FirebaseAuth.AuthStateListener() {
   @Override
   public void onAuthStateChanged(@NonNull final FirebaseAuth firebaseAuth) {
       final FirebaseUser user = firebaseAuth.getCurrentUser();
       if (user != null) {
           Log.i("AuthStateChanged", "User is signed in with uid: " + user.getUid());
       } else {
           Log.i("AuthStateChanged", "No user is signed in.");
       }
   }
});

既存のログインを移行

以前の SDK でアプリにログインしている場合、新しい SDK でログインし続けるためにはコードの修正が必要になります。それ以外の場合は、再度ログインする必要があります。これを行うためのオープンソースのサンプルコードは Firebase Auth Migration Helpers GitHub リポジトリで提供されています。

新しいパスワードのリセット テンプレートを更新

アプリで、メールとパスワードの認証によるユーザー ログインを許可する場合、通常、パスワードのリセット オプションをユーザーに付与します。

新規の SDK へのアップグレードが完了すると、パスワード リセットのメールでは、Firebase console で指定された新たなテンプレートが使用されます。アプリでのニーズに応じてこれを更新してください。

Firebase のライブラリを更新

以下のいずれかのライブラリを使用している場合は、最新バージョンへのアップグレードが必須になります。

ライブラリ サポートされているバージョン リソース
GeoFire 1.2.x GitHub

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。