2016年5月18日~20日に行われたGoogle最大のデベロッパー向けカンファレンスGoogle I/O 2016 で、Firebaseのメジャーアップグレードが発表されました。これによりFirebaseは統合モバイルプラットフォーム とでも言うべきものに進化し、さまざまなサービスを包括するより大きなプロダクトになりました。
図1 New Firebase
Illustration created by Google.
今回は
新しくなったFirebaseの概要
これまでのFirebase環境からのマイグレーション方法
について見ていきたいと思います。
新しくなったFireabaseの概要
これまでの連載 で解説してきたように、これまでのFirebaseが提供するサービスは
リアルタイムデータベース
認証基盤
静的Webサイトホスティング
等に限られていましたが、今回の大々的なアップグレードによりはるかに大きな機能を有する一大MBaaSへと変貌を遂げました。そのプロダクト数の多さ、Google I/Oでのセッションでの熱の入りようを鑑みても、FirebaseはGoogleがいま最も力を入れているモバイルプラットフォームと言い切ってしまって差し支えありません。
新しいFirebaseは次に挙げる4大フィーチャーから成り立っています。
Analytics
Develop
Grow
Earn
これら4大フィーチャーがさらに複数のプロダクトを抱えています。とてもすべてを紹介しきれないほど多いですが、筆者が重要だと考えるものを中心にご紹介したいと思います。
Analytics
Analyticsはその名の通り分析基盤です。これは従来のGoogle Analyticsを置き換えるもので、データのダウンサンプリング(間引き)や送信イベント数制限等も一切なく、無制限に使えるにもかかわらず完全無料です。新しいFirebaseではこのAnalyticsを中核技術と位置付けており、これから紹介するさまざまなプロダクトに横軸を通して連携できるようになっています。
ユーザ層やアプリの使用頻度、滞在時間やひとりあたりの売上など、これまで複数の分析サービスを組み合わせていたようなことが1ヵ所でできるようになります。また、ユーザをセグメントに分けて特定の層にだけプッシュ通知を送ったり、Google BigQuery と連動して詳細な解析をすることなども可能です。
Analyticsに関してはこの連載の次回でアプリに組み込む方法をご紹介予定です。
Develop
Developは開発支援に特化したフィーチャーで、以下のようなプロダクト群を内包しています。
Cloud Messaging
Authentication
Realtime Database
Storage
Hosting
Remote Config
Test Lab
Crash Reporting
Cloud Messaging
Firebae Cloud Messagingはクロスプラットフォームなメッセージ配信基盤です。これまでGoogle Cloud Messaging(GCM) と呼ばれていたものが、Firebaseプロダクト群に取り込まれました。
Authentication
従来のFirebaseから存在する認証基盤です。
Realtime Database
従来のFirebaseから存在するリアルタイムデータベースです。
Storage
従来のFirebaseには写真やファイル等のアップロード機能がなく外部サービスを自前で利用する必要がありましたが、Google Cloud Storage と連動して簡単かつ安全にファイルのアップロードをすることができるようになりました。これは待ちわびていた機能です。
Storageに関しても次回にアプリに組み込む方法をご紹介予定です。
Hosting
従来のFirebaseから存在する静的Webサイトホスティングです。
Remote Config
Remote Configはアプリを再リリースすることなくコンテンツの一部を差し替えたり、簡単にA/Bテストを実施することができる非常に強力な新機能です。プラットフォームや国ごとにコンテンツを出し分けたり、数字やフラグを切り替えたりすることも容易です。
Remote Configに関しても次回でアプリに組み込む方法をご紹介予定です。
Test Lab
Googleのデータセンター上に置かれている膨大な実機を使ったテストをネットワーク越しに行うことができるサービスです。Android Studioから直接実行する機能も提供されています。
Crash Reporting
アプリのクラッシュレポート機能です。クラッシュを検知するだけでなく、AnalyticsやNotificationと連携してクラッシュしたユーザにだけアップデートを促したりするようなことも可能です。
Grow
アプリの成長フェーズを支援するプロダクト群を内包しています。
Notifications
App Indexing
Dynamic Links
Invites
AdWords
Notifications
プッシュ通知を簡単に送ることができるWebコンソールです。1行もコードを書かなくても管理画面からプッシュ通知を送れるほか、AnalyticsやCrash Reportingと連携して特定のユーザにだけ通知を送ることもできます。
App Indexing
既存のApp IndexingがFirebaseプロダクト群に取り込まれました。Google検索結果にアプリの情報を表示し、ユーザに回遊を促すことができます。
Dynamic Links
より進化したディープリンクです。1つのリンクでiOSとAndroidなどプラットフォームごとに適切な場所に誘導したり、リンクに対応するアプリをインストールしているか否かで挙動を変えたりすることができます。
Invites
紹介コードやクーポンをディープリンクを使ってSMSやEメール越しに簡単にシェアすることができる機能を提供します。前述のDynamics Linksが利用されており、アプリが入っていなくてもユーザはクリックするだけで簡単にアプリをインストールしてクーポンの適用まで離脱することなく行うことができます。
AdWords
既存のGoogle AdWords がFirebaseプロダクト群に取り込まれました。アプリの宣伝を適切なユーザに簡単に行うことができます。
Earn
アプリの収益化フェーズを支援するフィーチャーです。
AdMob
既存のGoogle AdMob がFirebaseプロダクト群に取り込まれました。AdMobが提供するさまざまな種類の広告商品とアドネットワークを使ってアプリの収益化を助けます。
新機能まとめ
このように、新しいFirebaseはGoogleの既存のプロダクト群を取り込みつつ、Analyticsを中核としてそれぞれ補いあいながら1つのMBaaSとしてうまく協調するように再設計されていることが分かります。
開発し、リリースし、分析し、改善を繰り返すというアプリのリリースサイクルにFirebaseは見事にマッチしていることが見て取れるでしょう。
これまでのFirebase環境からのマイグレーション方法
今回のFirebaseのメジャーアップグレードでFirebase SDKも大幅にバージョンアップしています。
連載第1回 でご紹介した方法は後方互換性のために残されており、そのままでも使い続けることは可能ですが、前節で紹介したFirebaseのさまざまな新しい機能を利用するためにもぜひアップグレードしたいところです。本節では旧Firebaseプロジェクトのマイグレーションの方法と、それに伴うコードの変更について解説します。
プロジェクトのマイグレーション
まずはhttps://www.firebase.com/ から旧Firebase環境にアクセスし、「 LOGIN TO LEGACY CONSOLE」を選択してください。
図2 旧Firebase環境にアクセス
古いダッシュボードにログインすると、ページ上部に新環境へのアップグレードを促す注意書きが表示されています。「 upgrade to our new console!」を選択してください。
図3 「 upgrade to our new console!」
新しいダッシュボードが表示され、ページ下部に「現在 Firebase.com に存在するプロジェクト」が表示されます。プロジェクト名を確認し「インポート」を選択してください。
図4 新しいダッシュボード
注意書きを読み、「 続行」を選択します。この時点で古いダッシュボード(firebase.com)にはアクセスできなくなりますが、古いFirebase SDKとコードベースのまま運用を続けることは可能です。
図5 インポート続行の確認
「国/地域」を選択し「プロジェクトをインポート」します。
図6 プロジェクトのインポート
しばらく待つと図7 のように表示されます。これでプロジェクトのマイグレーションは完了です。
図7 新しいプロジェクト
マイグレーションの完了した新しいプロジェクトを選択すると、新しいダッシュボードにアクセスすることができます。「 Database」を選択してデータベースの中身を確認してみましょう。
図8 データベースを確認
旧ダッシュボード同様データベースの中身が確認できれば成功です。
図9 データベースの表示
先ほども申し上げたように、このまま古いFirebase SDKでしばらく運用を続けることも可能ですが、できるだけ早めに新しいFirebase SDKにアップグレードしましょう。
新しいFirebase SDKをセットアップ
次に、新しいFirebase SDKをセットアップします。
ホームアイコンを選択してプロジェクトのホームに戻り「AndroidアプリにFirebaseを追加」を選択してください。
図10 新しいFirebase SDK
「パッケージ名」にご自身のアプリのパッケージ名を入力して「アプリを追加」を選択してください。
図11 アプリの詳細を入力
すると「google-services.json」という設定ファイルがダウンロードされます。このファイルを次の図12 を参考にAndroidのプロジェクトのアプリケーションモジュール(典型的には/app
の下)に設置してください。その後、「 続行」を選択してください。
図12 設定ファイルをコピー
図13 を参考に、プロジェクトのbuild.gradle
とアプリケーションのbuild.gradle
を編集します。
図13 build.gradleに追加
まずプロジェクトのbuild.gradle
に次のような設定を追記します。
buildscript {
// ...
dependencies {
// ...
classpath 'com.google.gms:google-services:3.0.0'
}
}
次にアプリケーションの build.gradle
に次のような設定を追記します。
apply plugin: 'com.android.application'
android {
// ...
}
dependencies {
// ...
compile 'com.google.firebase:firebase-core:9.0.2'
compile 'com.google.firebase:firebase-database:9.0.2' // Realtime Database
compile 'com.google.firebase:firebase-auth:9.0.2' // Auth
}
// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'
最後の apply plugin: 'com.google.gms.google-services'
は必ず最終行に記述する必要があります。最後にGradleのSync
を選択すれば完了です。
すべての工程を完了すると、ダッシュボードには次のように新しいプロジェクトが作成されます。
図14 プロジェクトのOverview
ちなみに「google-services.json」をなくしてしまった場合、いつでもダッシュボードからダウンロードすることができます。プロジェクトのホームアイコン横にある歯車マークを選び、「 プロジェクトの設定」を選択します。
図15 プロジェクトの設定
ページ右側の「最新の設定ファイルをダウンロードします」から「google-services.json」をダウンロードすることができます。
図16 設定ファイルをダウンロード
これでFirebase SDKを最新にすることができました。
新しいFirebase SDK用にコードを修正する
新しいSDKではFirebaseにさまざまなプロダクトが統合された関係上、クラスの初期化コードと例外クラスあたりに多少変更が入りましたが、基本的な構造はこれまでとほとんど変わっておらず比較的簡単に対応することが可能です。
Realtime Databaseのコードを修正
次の表に変更点を一覧で紹介します。
BEFORE AFTER
com.firebase.client com.google.firebase.database
FirebaseError DatabaseError
FirebaseException DatabaseException
Firebase DatabaseReference
表のとおりパッケージ名がcom.firebase.client
からcom.google.firebase.database
に変更になっています。こちらは機械的に置換することで簡単に対応できます。
また、第3回 データの読み出しをマスターする で、データベースのリファレンスを取得するコードとして次のようなものを紹介しました。
Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/messages");
ref.addValueEventListener(new ValueEventListener() { });
この部分は次のように変更する必要があります。
DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
ref.addValueEventListener(new ValueEventListener() { });
FirebaseDatabase.getInstance().getReference()
の部分に注目してください。これまでのようにhttps://<YOUR-FIREBASE-APP>.firebaseio.com/
と明示していた部分は「google-services.json」の導入により必要なくなりました。
最後に、ValueEventListener
とChildEventListener
でエラー発生時に呼ばれるonCancedled(FirebaseError error)
のFirebaseError
も表のとおりDatabaseError
に変更する必要があります。
その他の部分は基本的にこれまでとまったく同じように扱うことができます。ただし、連載で扱わなかった部分にも細かい変更がありますので、詳しくは公式のマイグレーションガイド をご参照ください。
Authのコードを修正
次の表に変更点を一覧で紹介します。
BEFORE AFTER
import com.firebase.client.AuthData; import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
Firebase.AuthStateListener FirebaseAuth.AuthStateListener
「第5回 Firebaseのデータをセキュアに保つ 」のパスワード認証を使ったユーザ認証では、ユーザ作成のコードを次のようにしました。
Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
ref.createUser("email", "password", new Firebase.ValueResultHandler<Map<String, Object>>() {
@Override
public void onSuccess(Map<String, Object> result) {
Log.d(TAG, "Successfully created user account with uid: " + result.get("uid"));
}
@Override
public void onError(FirebaseError firebaseError) {
Log.d(TAG, "error: " + firebaseError.getMessage());
}
});
新しいFirebaseでは次のように修正する必要があります。
FirebaseAuth auth = FirebaseAuth.getInstance();
auth.createUserWithEmailAndPassword("email", "password")
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
FirebaseUser user = authResult.getUser();
user.getEmail();
user.getUid();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
新しいFirebaseでは認証用のクラスがFirebaseAuth
に変更になっており、FirebaseAuth.getInstance()
で取得することができます。
また旧環境ではFirebase.ValueResultHandler
インタフェースを渡すことで結果を取得していましたが、こちらもaddOnSuccessListener(OnSuccessListener)
とaddOnFailureListener(OnFailureListener)
に変更になっています。
認証成功時のコールバックもonSuccess(AuthResult authResult)
に変更になっており、コード例のようにFirebaseUser user = authResult.getUser()
のようにしてFirebaseUser
を取得してからuser.getUid()
でユーザのユニークキーを取得しています。
また同様に、旧環境でパスワード認証でログイン処理を行うコードは次のような例を紹介しました。
ref.authWithPassword("email", "password", new Firebase.AuthResultHandler() {
@Override
public void onAuthenticated(AuthData authData) {
Log.d(TAG, "User ID: " + authData.getUid() + ", Provider: " + authData.getProvider());
Log.d(TAG, "expires: " + authData.getExpires());
}
@Override
public void onAuthenticationError(FirebaseError firebaseError) {
Log.d(TAG, "error: " + firebaseError.getMessage());
}
});
こちらも新環境では次のように修正する必要があります。
auth.signInWithEmailAndPassword("email", "password")
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
FirebaseUser user = authResult.getUser();
user.getEmail();
user.getUid();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
こちらはよく見ると、前出のcreateUserWithEmailAndPassword()
がsignInWithEmailAndPassword()
に変わっただけで、その他はまったく同じです。
こちらも連載で扱った部分の修正は以上ですが、連載で扱わなかった部分にも細かい変更がありますので詳しくは公式のマイグレーションガイド をご参照ください。
最後に、古いライブラリを削除すれば対応完了です。
compile 'com.firebase:firebase-client-android:x.x.x' // 削除
まとめ
いかがだったでしょうか。
今回は新しくなったFirebaseの概要とあたらしくラインナップに加わったプロダクト群をご紹介し、後半では旧環境から新環境へマイグレーションする方法を解説しました。
次回は、今回Firebaseのプロダクト群に加わった製品の中から筆者が特に重要だと考え興味をもったものを数点ピックアップし、実際の使い方をコードを交えながらご紹介したいと思います。どうぞお楽しみに。