ちょっとうろうろ

思いつくままちらほらと

Firebase 触ってみた

最近仕事で Firebase を触る機会があって、色々試してみたので忘れないうちにメモ代わりに書き残しておこうと思う。

こういうのって触らないとすぐ忘れちゃうしね。。。


Firebase とは

Google が運営している MBaas(Mobile Backend as a Service だったっけ?)。2011 年に始まったサービスで 2014 年に Google が買収して一気に機能が追加されたみたいだけど、私が知ったのは最近のことなのでそこまで深くは知らない。HP はここ

要するに、バックエンド側でやるべき面倒なサービスを肩代わりしてやりやすくしてくれるものだ。Web アプリなので、もちろんブラウザ上で操作することになるが、触った感じ、ロードは若干長いけどレスポンスは問題ないレベルだと思う。

基本的な機能には以下のものがある。

  • Analytics
  • Develop
    • Realtime Database
    • Authentification
    • Cloud Messaging
    • Storage
    • Hosting
    • Test Lab
    • Crash Reporting
  • Grow
    • Notifications
    • Remote Config
    • App Index
    • Dynamic Links
    • Invites
    • AdWords
  • Earn
    • AdMod

大別すれば、解析・開発・運用・収益辺りになると思うけど、Analytics は左の機能リストのトップにあるし、メイン機能っぽく見える。

f:id:AmayaSusuki:20161005201148p:plain WEB の画面はこんな感じ。

当然のことだけど、アプリを登録して端末側で実際に使用し、レポートなりなんなりを送ってもらわないと使えない。

ということで、導入方法から見ていこうと思う。私がやったのは Android アプリなので、iOS とか Web アプリのやり方は別の所で見てください。そんなにやり方は変わらないと思うけど。

Firebase の導入

導入方法はいたって簡単で、というか、Android Studio を使っていれば何の問題もなく導入できる(と思う)。

とりあえず Firebase

方法としては二種類あって、

  • Android Studio からアプリと Firebase を接続する
  • Firebase プロジェクトにアプリを登録する

のどちらかをやればいい。まぁどちらかと言えば前者のが簡単だと思う。自動でやってくれるし。

Android Studio にやってもらう方法

Android StudioTools -> Firebase を選択すると、Assistant タブが開く。そこから任意の項目を選んで、手順に従って操作すれば Firebase との接続が大体完了する。

各項目を開くと、① に Connect your app to Firebase の項目があるので、その直下の Connect ボタンを押下する。Firebase にサインインしていない場合、ここでサインインを行う。

サインイン後、新しい Firebase プロジェクトを作成するか、既存の Firebase プロジェクトを使用するかを選択する。

その後、Connect to Firebase ボタンを押下する。上手く接続できれば、ダイアログが閉じるはず。

Firebase プロジェクトからアプリを登録

Firebase プロジェクトのメインページには Android, iOS, Web アプリを登録するフォームがそれぞれある。ここで登録したい種類のアプリのボタンを押下する。つまり、今回は Android アプリを選ぶ。

するとダイアログが開き、登録するアプリのパッケージ名と、SHA-1 証明書を入力するフォームが表示される。適切に入力し、アプリを登録を押下して次に進む。

次の画面に遷移すると、自動的に google-services.json ファイルのダウンロードが開始される。ダウンロードしたファイルを Android アプリの App ディレクトリに追加し、続行ボタンを押下する。

最後に、表示された手順に従って、Android アプリの build.gradle ファイルを編集し、Android Studio に表示されている Sync now を押下すれば、アプリが登録されるだろう。

正直、この辺はやってなくて、「こうやればできそう」ってだけなので、後で確認した方が良いかな。。。


ここまでやってアプリが登録できれば、後はアプリ側で Firebase を利用できるように設定・実装を行えばいい。

まずはAndroid プロジェクトの設定を行おう。

Android プロジェクトの設定

build.gradle を編集して、Firebase をアプリから利用できるようにする必要があるんだけど、Firebase の利用にはネット接続が必須なので、そのためのパーミッションを設定する必要がある。

なので、AndroidManifest.xml 開き、<manifest> の下に以下のパーミッションを追加する。

<manifest **省略**>
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

    **省略**
</manifest>

後は使いたい機能のライブラリを build.gradle に追加してやれば Firebase の API が利用可能になる。

この辺は、Android StudioTools -> Firebase で開く Assistant タブに記載されてる手順に従えばできると思う。

一応今回やってみた機能(Analytics, Crash Reporting, Notification)を手動で追加するなら次のようになる。

build.gradle(Project: App名 を開き、以下の記述を追加する(バージョンは適宜変更すること)。

build.script {
    ** 省略 **
    dependencies {
        ** 省略 **

        classpath 'com.google.gms:google-services:3.0.0'
    }
}

build.gradle(Module: App) を開き、以下の記述を追加する(バージョンは適宜変更すること)。

** 省略 **
dependencies {
    ** 省略 **
    compile 'com.google.firebase:firebase-core:9.6.1'
    compile 'com.google.firebase:firebase-crash:9.6.1'
    compile 'com.google.firebase:firebase-messaging:9.6.1'
}

上記の設定を追加後、APK のビルドに成功することを確認する。


設定が終わったら実際にコーディングする……が、Notification はコーディングなしでいける。

Firebase プロジェクトの Notification で送信メッセージを作成し、送りたいアプリを選択して送信するだけだ。とってもお手軽。

だけど、こういう条件で Notification を送信とか、そういう機能が見当たらないんだよね……もうちょっと調査が要るかも。

それと、Notification 以外の Analytics や Crash Reporting は端末側が Google アカウントを設定していること、そして Google Play Service を無効にしていないことが必要になる。特に後者は色々目の敵にされてるアプリだけど大丈夫なんだろうか。


さて肝心のコーディング。

まず、FirebaseAnalyticsインスタンスを作成する。

public class MainActivity extends AppCompatActivity {

    private FirebaseAnalytics mAnalytics;

    @Override
    protected void onCreate(@Nullable Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        setContentView(R.layout.activity_main);

        // インスタンスの作成
        mAnalytics = FirebaseAnalytics.getInstance(this);

        // 必要ならユーザプロパティを設定
        mAnalytics.setUserProperty("key", "value");
    }
}

このインスタンスからログイベントの送信ができる。イベントログの送信はこんな感じ。

 private void sendEventLog() {
        Bundle params = new Bundle();                           // 送信パラメータ用インスタンスの作成
        params.putString(FirebaseAnalytics.Param.ITEM_ID, "id");            // イベントログの ID を設定
        params.putString(FirebaseAnalytics.Param.ITEM_NAME, "name");            // イベントログの名称を設定
        params.putString(FirebaseAnalytics.CONTENT_TYPE, "type");           // イベントログのデータ型を設定
        mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, params);    // イベントログを送信
    }

params.putString メソッドで送れる情報は色々あって、何やらゲームっぽいパラメータ名なんだよね。Google Play Service のパラメータを継承してるんだっけか。まぁどっちにせよ、このメソッドで作った文字列は実は Firebase では見られなかったりする。見るには BigQuery とかいうのとリンクする必要があるんだとか。なんだよそれ。。。

また、イベントログが実際に反映されるのは、一日一回程度。最初の更新はアプリが最初に起動されてから二十四時間以内とのことらしい。Analytics 関連はリアルタイムで情報を反映するのは難しいのかな。情報量も半端ないだろうし。


Crash Reporting は自動で送信されるパターンと手動で送信するパターンがある。自動で送信されるパターンはとてもシンプルで、アプリのクラッシュ時にクラッシュレポートが送信される。

一方で、手動で送信する場合は以下のような記述をする必要があるだろう。

private sendCrashReporting(){
    FirebaseCrash.log("ID", "Description", "type"); // 送信したいログがあれば記述
    FirebaseCrash.logcat(type, "tag", "label"); // アプリのログから必要なログを抽出
    FirebaseCrash.report(Exception);        // レポートを送信
}

log メソッドは適当な文字列を、logcat は ADB のログから抽出した文字列をレポートのログに書き込むためのものだ。report すればそれまでに蓄積したすべてのログと一緒にレポートを送信できる。

ちなみに、単に Exception をレポートすると空欄だが、引数に文字列を入れて送信するとその文字列がちゃんと出る。


以上のような感じで、単にログやレポートを送信したいだけならかなり手軽にできる。

問題は解析結果が Firebase 上でどう表示されるかだろうか。

Analytics では、アプリの起動状況から得られるのはユーザの性別や年代といった大まかなユーザ情報や、アクティブユーザやユーザ維持率といった稼働状況、収益などといった情報がある。サンプルアプリで試しただけだからそれほど多くのことは分からないけれど、結構大まかなところしか分からなそうという印象がある。特にイベント。こちらから送信したイベントの中身が見られないので、ちゃんと使わないと雑多なものが並ぶだけになってしまう。

というか、イベントの使い道はやっぱり、目標到達プロセス(あるイベントに到達したときに、特定のイベントをきちんと通っているかを確認するための指標)と組み合わせて使うものなんだろうか。そこらへん、まだあんまり見定められてない。

Crash Reporting についてはやっぱり見にくい。

送信されたクラッシュレポートは、イベントのカテゴリを判別して自動で分類してくれるんだけど、同じエラーは同じカテゴリに分類されるんだよね。つまり、色んな原因で出たはずの NullPointerException は、全て同じカテゴリに分類されてしまう。これってすごく見づらいよね。それ以上の分類をしろってのも酷かもしれないけど……。

この辺の問題は、レポートの仕方、すなわちどんなエラーログを送信するかを適切に設計することでなんとかなるとは思う。使い方によっては結構柔軟になってくれそうな気はしている。


まとめ

ログ解析とかレポート取得とか認証処理とかするだけなら頼りになるけど、サーバ側で色々処理するなら別のが必要だと思う。

今回実装してみた機能以外にもたくさん機能はあるし、無料版でグダグダ言うのもあれなので、もうちょっと遊んでみたい。Hosting 辺りとか。