Firebase Analyticsでイベントを送信する


## 実装方法

Firebase Analyticsでイベントを送信する場合は`FirebaseAnalytics`インスタンス（iOSは`FIRAnalytics`）の`logEvent()`を使います。

なお、Firebase Analyticsで送れるイベントは最大500、１イベントに登録できるパラメータの最大数は25という制限があります。（[参考](https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.html#logEvent(java.lang.String, android.os.Bundle))）

```java:Android.java
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);
```

```swift:iOS.swift
FIRAnalytics.logEventWithName(kFIREventSelectContent, parameters: [
  kFIRParameterContentType:"cont",
  kFIRParameterItemID:"1"
  ])
```

（注意）Android側の注意点ですが、数値としてを送る場合は`putString()`ではなく`putInt()`で明示的に数値としてパラメータ設定を行いましょう。数字を文字列で送ってもFirebase側で変換してくれません。

Firebase AnalyticsはGoogle Analyticsの「Category、Action、Label」と違って、イベントで送るパラメータの内容に具体的な制限はありません。
パラメータ名も独自名で指定が可能です。既存のパラメータに付け加えて送信することもできます。


```java:Android.java
Bundle params = new Bundle();
params.putString("image_name", name);
params.putString("full_text", text);
mFirebaseAnalytics.logEvent("share_image", params);
```

```swift:iOS.swift
FIRAnalytics.logEventWithName("share_image", parameters: [
  "name": name,
  "full_text": text
  ])
```

ただし、Firebase Analyticsでは推奨されるイベント名とパラメータの設定があり、出来る限り推奨された内容で送っておくと後々の作業で恩恵が受けられることがあります。
（とはいえ、カスタムである必要があるイベント名やパラメータ名もあるので、そのあたりはケースバイケースで実装すると良いでしょう）

参考：[イベントとプロパティ - Firebase ヘルプ](https://support.google.com/firebase/topic/6317484?hl=ja&ref_topic=6386699)

## コンソール画面での確認

無事イベントが送信されると、コンソール画面のイベント一覧に反映されます。

![スクリーンショット 2016-10-19 11.22.28.png](https://qiita-image-store.s3.amazonaws.com/0/4560/ce0e1dab-ac30-b3b7-fc55-d03936732b5b.png "スクリーンショット 2016-10-19 11.22.28.png")
（一部のイベントの名前に疑問を持ってはいけません…）

イベントはこちらがコード上に実装したものの他に、自動的に取得してくれるものもあります。このキャプチャでいうと`app_*`、`first_open`、`notification_*`が該当します。これらのイベントが送られるタイミングの詳細に関しては、上記に参考リンクで貼った『[自動的に収集されるイベント - Firebase ヘルプ](https://support.google.com/firebase/answer/6317485?hl=ja&ref_topic=6317484)』を参照してください。

イベントはそれぞれレポートを確認することができ、さらにユーザーリストやユーザープロパティでのフィルタリングも可能です。こうすることで特定のユーザーに対するイベントの発火状況が確認しやすくなります。
また、イベントも１セッションごとの発火回数も確認することができます。

![スクリーンショット 2016-10-19 11.26.23.png](https://qiita-image-store.s3.amazonaws.com/0/4560/47353e2e-4813-e76a-8c52-42d5bf5ba87f.png "スクリーンショット 2016-10-19 11.26.23.png")

![スクリーンショット 2016-10-19 11.26.35.png](https://qiita-image-store.s3.amazonaws.com/0/4560/3feb834b-6596-e3a9-67ee-4af08577f349.png "スクリーンショット 2016-10-19 11.26.35.png")

### イベントで送ったパラメータの見方

**現時点、おそらく今後もコンソール画面でパラメータの値を見ることはできません**。おそらく詳細なデータはBigQueryを利用して見てくれという感じのようです。
なお、BigQueryを利用する際は従量課金制であるBlazeプランへの移行が必要となります。

### 値について

イベントに表示されている値ですが、 **パラメータの中で数値のみを送っている要素が１つだけのとき、送られてきた値の合計値が表示される** ようです。
ややこしいので、Androidのみですが例を記載します。

```java:Android.java

// 1. 値が表示される
Bundle params1 = new Bundle();
params1.putInt("value", value);
mFirebaseAnalytics.logEvent("event1", params1);

// 2. 値が表示される（はず、未確認だったかもしれない）
Bundle params2 = new Bundle();
params2.putInt("value1", value1);
params2.putString("value2", value2);
mFirebaseAnalytics.logEvent("event2", params2);

// 3. 値が表示されない
Bundle params3 = new Bundle();
params3.putInt("value1", value1);
params3.putInt("value2", value2);
mFirebaseAnalytics.logEvent("event3", params3);

// 4. 値が表示されない
Bundle params4 = new Bundle();
params4.putString("value1", value1);
params4.putString("value2", value2);
mFirebaseAnalytics.logEvent("event4", params4);


// 誤って一度でも数字と文字列を両方送ってしまうと値が表示されない
// （数値しか送られなかった期間を指定すれば、値がでてくるのかも）
```

`1.`の場合でも、誤ってevent1のvalueに対して文字列を送ってしまうと値の合計値は表示されなくなってしまいます。ただ数値しか送られなかった期間に指定すれば、そのときは値が表示されるかもしれません。

で、ここまでやっても見れるのは`数値の合計値`なので、送っても恩恵がありそうなパターンは少なそうな印象があります（全ユーザーの合計スコアとか集計したい場合には有用なのかな？）

## コンバージョンイベントを使用する。

イベント一覧にある「コンバージョンとしてマークを付加」をONにすることで、NotificationsでPush通知を送った場合のコンバージョンイベントとして設定することができます。

![スクリーンショット_2016-10-19_17_21_10.png](https://qiita-image-store.s3.amazonaws.com/0/4560/bfd4e025-316e-93cf-660a-f8cbfbd21b71.png "スクリーンショット_2016-10-19_17_21_10.png")

1つのNotificationsで登録できるコンバージョンイベントは１つだけです。結果は以下のように表示されます。

![スクリーンショット_2016-10-19_17_26_46.png](https://qiita-image-store.s3.amazonaws.com/0/4560/71de3c84-2d81-0d94-754e-81d7d2735f1e.png "スクリーンショット_2016-10-19_17_26_46.png")

送信が送信したデバイス数で既読がPush通知からのアプリ起動数、コンバージョンがそこからのイベント発生数になります。
Push通知を用いたグロースハックの簡単な分析程度は実装しやすいのかなと思っています。

## おわりに

他にもFirebase Analytics内の「ユーザーリスト」の設定などでイベントを設定値として使用することができます。現時点ではここでようやく推奨値で設定した恩恵を受けられる場面がありますが、その辺りはまたユーザーリストの解説記事の中で説明します。

## 参考資料

- サンプルコードの引用元
	- [イベントのログを記録する（Android）  |  Firebase](https://firebase.google.com/docs/analytics/android/events)
	- [イベントのログを記録する（iOS）  |  Firebase](https://firebase.google.com/docs/analytics/ios/events)
- [com.google.firebase.analytics  |  Firebase](https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/package-summary)