スマホアプリ開発を加速する、Firebaseを使ってみよう

第7回Google I/O 2016で発表された新しいFirebaseを覗いてみよう

2016年5月18日~20日に行われたGoogle最大のデベロッパー向けカンファレンスGoogle I/O 2016で、Firebaseのメジャーアップグレードが発表されました。これによりFirebaseは統合モバイルプラットフォームとでも言うべきものに進化し、さまざまなサービスを包括するより大きなプロダクトになりました。

図1 New Firebase
図1 New Firebase
Illustration created by Google.

今回は

  1. 新しくなったFirebaseの概要
  2. これまでの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環境にアクセス
図2 旧Firebase環境にアクセス

古いダッシュボードにログインすると、ページ上部に新環境へのアップグレードを促す注意書きが表示されています。⁠upgrade to our new console!」を選択してください。

図3 ⁠upgrade to our new console!」
図3 「upgrade to our new console!」

新しいダッシュボードが表示され、ページ下部に「現在 Firebase.com に存在するプロジェクト」が表示されます。プロジェクト名を確認し「インポート」を選択してください。

図4 新しいダッシュボード
図4 新しいダッシュボード

注意書きを読み、⁠続行」を選択します。この時点で古いダッシュボード(firebase.com)にはアクセスできなくなりますが、古いFirebase SDKとコードベースのまま運用を続けることは可能です。

図5 インポート続行の確認
図5 インポート続行の確認

「国/地域」を選択し「プロジェクトをインポート」します。

図6 プロジェクトのインポート
図6 プロジェクトのインポート

しばらく待つと図7のように表示されます。これでプロジェクトのマイグレーションは完了です。

図7 新しいプロジェクト
図7 新しいプロジェクト

マイグレーションの完了した新しいプロジェクトを選択すると、新しいダッシュボードにアクセスすることができます。⁠Database」を選択してデータベースの中身を確認してみましょう。

図8 データベースを確認
図8 データベースを確認

旧ダッシュボード同様データベースの中身が確認できれば成功です。

図9 データベースの表示
図9 データベースの表示

先ほども申し上げたように、このまま古いFirebase SDKでしばらく運用を続けることも可能ですが、できるだけ早めに新しいFirebase SDKにアップグレードしましょう。

新しいFirebase SDKをセットアップ

次に、新しいFirebase SDKをセットアップします。

ホームアイコンを選択してプロジェクトのホームに戻り「AndroidアプリにFirebaseを追加」を選択してください。

図10 新しいFirebase SDK
図10 新しいFirebase SDK

「パッケージ名」にご自身のアプリのパッケージ名を入力して「アプリを追加」を選択してください。

図11 アプリの詳細を入力
図11 アプリの詳細を入力

すると「google-services.json」という設定ファイルがダウンロードされます。このファイルを次の図12を参考にAndroidのプロジェクトのアプリケーションモジュール(典型的には/appの下)に設置してください。その後、⁠続行」を選択してください。

図12 設定ファイルをコピー
図12 設定ファイルをコピー

図13を参考に、プロジェクトのbuild.gradleとアプリケーションのbuild.gradleを編集します。

図13 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
図14 プロジェクトのOverview

ちなみに「google-services.json」をなくしてしまった場合、いつでもダッシュボードからダウンロードすることができます。プロジェクトのホームアイコン横にある歯車マークを選び、⁠プロジェクトの設定」を選択します。

図15 プロジェクトの設定
図15 プロジェクトの設定

ページ右側の「最新の設定ファイルをダウンロードします」から「google-services.json」をダウンロードすることができます。

図16 設定ファイルをダウンロード
図16 設定ファイルをダウンロード

これでFirebase SDKを最新にすることができました。

新しいFirebase SDK用にコードを修正する

新しいSDKではFirebaseにさまざまなプロダクトが統合された関係上、クラスの初期化コードと例外クラスあたりに多少変更が入りましたが、基本的な構造はこれまでとほとんど変わっておらず比較的簡単に対応することが可能です。

Realtime Databaseのコードを修正

次の表に変更点を一覧で紹介します。

BEFOREAFTER
com.firebase.clientcom.google.firebase.database
FirebaseErrorDatabaseError
FirebaseExceptionDatabaseException
FirebaseDatabaseReference

表のとおりパッケージ名が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」の導入により必要なくなりました。

最後に、ValueEventListenerChildEventListenerでエラー発生時に呼ばれるonCancedled(FirebaseError error)FirebaseErrorも表のとおりDatabaseErrorに変更する必要があります。

その他の部分は基本的にこれまでとまったく同じように扱うことができます。ただし、連載で扱わなかった部分にも細かい変更がありますので、詳しくは公式のマイグレーションガイドをご参照ください。

Authのコードを修正

次の表に変更点を一覧で紹介します。

BEFOREAFTER
import com.firebase.client.AuthData;import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
Firebase.AuthStateListenerFirebaseAuth.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のプロダクト群に加わった製品の中から筆者が特に重要だと考え興味をもったものを数点ピックアップし、実際の使い方をコードを交えながらご紹介したいと思います。どうぞお楽しみに。

おすすめ記事

記事・ニュース一覧