Firebase Analyticsを調べてみた

# Firebase Analyticsとは
アプリケーションの利用状況の解析のために以前よりGoogle Analyticsを利用していましたが、よりモバイルアプリケーションの解析に特化したFirebase Analyticsがリリースされました。今回はFirebase Analyticsを調査してみました。

# サンプルアプリケーションの調査
## ビルド
サンプルアプリケーションを用いて動作を確認しようと思います。今回はAndroid用のサンプルを利用します。以下のページからサンプルをダウンロードします。
https://firebase.google.com/docs/samples/

次にFirebase Console上でプロジェクトを作成します。
https://console.firebase.google.com/

<img width="445" alt="スクリーンショット 2016-11-12 15.14.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/0bbbcfdb-491d-ac4f-26b7-54aa4a2f8485.png">

次にAndroidアプリにFirebaseに追加を選択します。
<img width="612" alt="スクリーンショット 2016-11-12 15.15.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/c05f1282-8f78-fbad-b6a6-4d0b4420e717.png">

パッケージ名はサンプルアプリケーションで使われている以下を選択します。Firebase Analyticsだけの利用の場合はSHA-1は必要ありません。

<img width="665" alt="スクリーンショット 2016-11-12 15.15.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/44468cfc-1035-d201-73d6-879d72e5741b.png">

google-services.jsonがダウンロードされます。このファイルをappディレクトリの下の置きます。
<img width="601" alt="スクリーンショット 2016-11-12 15.51.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/f0294393-3d8c-398f-b868-ab03ae88722e.png">

後は、gradleでビルドすれば通るはずです。

```bash
$ ./gradlew assembleDebug
```
## 動作
アプリケーションをAndroid Phoneにインストールします

```bash
$ adb install app/build/outputs/apk/app-debug.apk 
[100%] /data/local/tmp/app-debug.apk
	pkg: /data/local/tmp/app-debug.apk
Success
```
アプリケーションを起動するとなんか以下みたいなページが表示されました。
<img width="384" alt="スクリーンショット 2016-11-12 15.59.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/25cb7625-b97d-2038-201e-cc402da6ab91.png">
適当に選択したり、押したり、"Share"ボタン押したりしてみました。

#アプリケーション側の実装
Google Analyticsは確かv4からGoogle Tag Managerとの連携が必要となり、モバイルアプリケーションで簡単に使用状況を取るには面倒でした（A-Bテストが実現できたり高機能でしたが）。Firebase Analyticsは非常にシンプルです。

[Getting Started](https://firebase.google.com/docs/analytics/android/start/)でも記述されていますが、以下の2種類の情報を取得できます。

* イベント
    * ユーザーの操作によって随時イベントを送信することができます
* ユーザープロパティ
    * ユーザーの属性を送ります。例えば、国や地域など。
    * 一度セットするとアプリケーションの利用中は永続的に使われる
    * 最大25個のプロパティをセット可能

アプリケーションで使用するクラスは基本的にシングルトンの[FirebaseAnalytics](https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics)だけです。

サンプルアプリケーションのonCreate()では、FirebaseAnalyticsを取得しています。その後にgetUserFavoriteFood()メソッドでユーザーが選択した好きなFoodがない場合は、setUserFavoriteFood()を呼んでいます。getUserFavoriteFood()ではプリファレンスからデータを取得していて、アプリケーションの初回起動時に表示された"Which food is your favorite"の回答がとれます。

```java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // [START shared_app_measurement]
        // Obtain the FirebaseAnalytics instance.
        mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
        // [END shared_app_measurement]

        // On first app open, ask the user his/her favorite food. Then set this as a user property
        // on all subsequent opens.
        String userFavoriteFood = getUserFavoriteFood();
        if (userFavoriteFood == null) {
            askFavoriteFood();
        } else {
            setUserFavoriteFood(userFavoriteFood);
        }
```
setUserFavoriteFood()では、[setUserProperty](https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.html#setUserProperty(java.lang.String, java.lang.String))を使ってユーザーの属性をセットしています。

```java
private void setUserFavoriteFood(String food) {
        Log.d(TAG, "setFavoriteFood: " + food);
        mFavoriteFood = food;

        PreferenceManager.getDefaultSharedPreferences(this).edit()
                .putString(KEY_FAVORITE_FOOD, food)
                .apply();

        // [START user_property]
        mFirebaseAnalytics.setUserProperty("favorite_food", mFavoriteFood);
        // [END user_property]
```
イベントの送信では、オプションメニュー"Share"選択時に[logEvent()](https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.html#logEvent(java.lang.String, android.os.Bundle))を使ってイベントを送信しています。

```java
public boolean onOptionsItemSelected(MenuItem item) {
        int i = item.getItemId();
        if (i == R.id.menu_share) {
            . . . 
            // [START custom_event]
            Bundle params = new Bundle();
            params.putString("image_name", name);
            params.putString("full_text", text);
            mFirebaseAnalytics.logEvent("share_image", params);
```
またサンプルアプリケーションではViewPagerを使ってスワイプ動作が可能ですが、そこでどの画像を選択したのかもイベントで送信しています。ViewPagerで選択されたページの名前を送信しています。

```Java
protected void onCreate(Bundle savedInstanceState) {
    . . .
    mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                recordImageView();
                recordScreenView();
            }
        });
    . . . 
}

private void recordImageView() {
        String id =  getCurrentImageId();
        String name = getCurrentImageTitle();

        // [START image_view_event]
        Bundle bundle = new Bundle();
        bundle.putString(FirebaseAnalytics.Param.ITEM_ID, id);
        bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, name);
        bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, "image");
        mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle);
        // [END image_view_event]
    }
```

# 出力結果
Androidの場合は一晩ぐらいたつと結果が表示されていました。デバイスの種類や地域情報などは、特にアプリケーション上で明示的に送信していませんが、集計されています。

<img width="465" alt="スクリーンショット 2016-11-13 13.19.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/1b720832-fb65-0275-b30f-7e5e7b9f235a.png">

<img width="381" alt="スクリーンショット 2016-11-13 13.19.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/aab70435-fb97-b21a-faab-a2cd592f1d58.png">

先ほどのViewPagerで選択したページのイベントなのですが、以下のような結果で集計されていました。

<img width="382" alt="スクリーンショット 2016-11-13 13.28.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/632d16d9-ed88-5ede-1849-8623e8f427a4.png">

# ユーザープロパティ
Google Analyticsにはないユーザープロパティですが、イベントと異なり、コード上の記述だけでは反映されません。Firebase Analyticsのコンソール上でユーザープロパティの作成が必要です。

![スクリーンショット 2016-11-14 10.40.10.png](https://qiita-image-store.s3.amazonaws.com/0/85182/ed596a91-2065-6dcd-4ee8-2c33cca09e01.png)

このユーザープロパティをどのようにConsole上で見れるかといいますと、イベントなどでフィルタとして利用することが可能です

![スクリーンショット 2016-11-14 10.41.56.png](https://qiita-image-store.s3.amazonaws.com/0/85182/29713371-c2c9-468b-219e-2924c903c269.png)


# おわりに
まだ使い初めてばかりですが、概ね使い方は分かりました。Google Analyticsと比較してアプリケーション側はとてもシンプルな記述でイベントを記録できることが分かりました。引き続き調査を行いまた追記致します。