Firebase使ってみたあれこれ気づきとハマりポイント

# 序

ようやく重い腰を上げてFirbaseを初めて使ってみました。
その時感じた事や、気になった点、ハマりポイントなどのまとめです。
特にAnalyticsは癖があるように思います。

# 1. TestLab
無料で出来るようになっているはずなので使ってみよう！
と単純なサンプルアプリをAndroidStudio(当時2.2)で作っただけのものをテストしようとしてみました。
AndroidStudioからはまだ出来ない様子だったので、apkをアップして実行する方を試しました。

動かなかった(ノД`)

## 現象1
apkをアップロードしようとするとエラーになって受け付けてもらえない。

RoboTestもインストゥルメンテーション テストもどちらもNGでした。
エラーメッセージ

```
ファイルを Google Cloud Storage (GCS) にアップロードできませんでした。
GCSの権限が誤っている可能性があります。
```

## 現象2
apkをアップロードできるようになった後も、テストを実行しようとするとエラー。

エラーメッセージ

```
必須の権限が設定されていないため、Test Lab でテスト
マトリックスを作成できませんでした。必須の
APIが適切に有効化されていることを確認してください。
```

## 解決策
らちがあかなかったので、 結局サポートに問い合わせました。
いろいろやりとりした結果、原因が以下の二つありました。

- 現象1の解決策：
「Google Cloud Storage JSON API」が無効になっているのを有効化する


- 現象2の解決策：
「Google Cloud Testing API」が無効になっているのを有効化する

これらを、Google Cloud Consoleの方から有効化すると、めでたくアップロード＆テストの実行が出来るようになりました。

**追記(2017/03/21　18:57)**
Firebaseコンソールに関連づけたアカウントが、標準的なGoogleアカウントではなく、GoogleAppsで取得しているアカウントでした。関連あるか分かりませんが、一応サポートにも報告してあります。

# 2. Notification

いわゆるPushですね。
特に困るようなことは無かったです。
チュートリアル通りに進めて、必要な記述をbuild.gradleに追加して、google-services.jsonを落としてプロジェクトに反映して、コンソールから何か打てば、それだけで通知が表示されました。

FCMで自前サーバーからバッチで送りたいとかの要望が無ければ、Tokenリフレッシュでデバイストークンを送るとかの実装も不要です。

ただし、以下で動作が異なるので注意が必要です（バックグラウンドとフォアグラウンドについての情報は知ってたのでハマりはしませんでしたが、対応するのにそれなりにかかりました）。

- アプリがバックグラウンドにいるとき  
FirebaseSDKが自動で通知を出します。
この通知のアイコンとサークルカラーの変更は以下のようにしてAndroidManifest.xmlに記述します。

```AndroidManifest.xml
<!-- [START fcm_default_icon] -->
<!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
	 See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
	android:name="com.google.firebase.messaging.default_notification_icon"
	android:resource="@mipmap/ic_launcher_round"/>
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
	 notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
	android:name="com.google.firebase.messaging.default_notification_color"
	android:resource="@color/notify_circle"/>
<!-- [END fcm_default_icon] -->
```


- アプリがフォアグラウンドにいるとき 
自分で受信処理をする必要があります。Notificationも必要なら自分で出す必要があります。
頑張ってFirebaseが出すレイアウトに合わせようとしたら結構手間取りました。
やらないのが吉かもしれません。
そもそも、アプリがフォアグラウンドにいるのだから通知をわざわざ出すのは仕様としてどうかというのもありますので、そのあたりは検討次第でしょう。  

- アプリプロセスが完全に死んでいるとき 
自分はここで少しハマりました。デバッガーの「停止」ボタンを押すと、関連サービスが完全に死ぬので、その後に通知を送っても受け取ってくれません。
アプリ履歴のリストから消したり「全て終了」にしても、関連サービスは生き残るようで、きちんと受信できますのでご心配なく。
開発中、デバッグ時の注意ですね。

#3. Analytics

結構いろいろハマりました。
まず、私がテスト実装していたときは、Firebaseコンソールが古いときだったので、リアルタイムで確認が出来ず、翌日以降になってやっと数値がぽちぽち入る、でも件数が非常に少ないので作ったユーザーリストが有効に使えず苦労したりしました。
今は、StreamView, DebugViewが出来たので、比較的確認しやすくなっているかと思います。
https://developers-jp.googleblog.com/2017/03/realtime-analytics-for-everyone.html

私はBigQuery連携をして中身を覗かなければならず、いつ課金額が増えるかとｶﾞｸﾌﾞﾙしながら実験していました。

Analyticsで気をつけるポイントは以下です。

## ユーザープロパティ

- プロパティをまずコンソールで作ってから、アプリから送るようにする
まあこれはドキュメントでもさんざん注意書きされているので、気をつけましょう。

- 一度作ったものは消せない

- 文字
私がやったときは大文字を使うと後のユーザーリストで使えないかのような動作をしていたので、小文字とアンダースコア("_")以外は使わない方がいい、とメモに書いてあります。BigQueryには入ってきていたんですがね。
最新のコンソールでどうかは未検証です。検証できたら追記します。

## ユーザーリスト

以下は、StreamView, DebugViewで解消されている問題もあるかもしれません。
未検証ですので、検証できたら追記します。

- リスト作成から、実際にカウントされるようになるまでタイムラグがある
実感では、「リストを作成した翌日にアクセスしたユーザーからカウントされる」ような挙動をしていました。
このために確認に大変時間がかかりました。
特にイベントをユーザーリスト毎にフィルタリングできるようになるまで非常に時間がかかって苦労しました(リストに追加されるのが翌日からなので、フィルタリングに使えるのが更にその翌日・・・つまりユーザーリストを作ってから二日経たないと使えない)。
また、このため、「過去に遡ってユーザーをフィルタリングしてそこにpushを出す」みたいな運用は出来ないかのように見えます。あらかじめ可能な限りのユーザーリストを作っておかないと、ということで、かなり先見の明が必要なようにも感じました。
**2017/03/28追記:新しいStreamView,DebugViewでも同じ**

- 件数が少ないと表示されない
10件未満だと数日経つまでカウントが計上されない感じがありました。
また、BigQuery上データがあるのに、ずっと計上されないものもあり、なかなかに不明な動作をしていました。デバッグ中でも、複数の端末やアカウントで何度も何度もアクセスする必要があって大変苦労しましました。
エミュレーターも大量に作りましたが、**Google Play Service**が入ってないともしかしたらカウントされてないかも知れません。
- ユーザーIdを送信できるが、一覧で確認できるようなコンソール画面内のビューが存在しない
**2017/03/28追記:DebugViewでは見られますが溜めた情報を見られる一覧はありません。**
- 端末名,機種名の取得がデバイスによっては失敗している
**⇒最新コンソール(2017/03/21時点)で解消済み。SOV33がレポートに上がっているのを確認しました。**
SOL23(4.4)、KYT31(5.0)などは取れてましたが、SOV33(OS6.0/7.0)は取れてませんでしたね。
メーカーにより機種名を設定している場所が異なるか、OSバージョンによりGoogle側の指示する「機種名設定箇所」が変わったかのようで、Firebase側は一箇所しか参照していないので取れていたり取れていなかったりするようです。
ただBigQueryにはいくつか設定値の項目は入ってきていて、手当たり次第その辺は端末から送っているようなので、集計側の問題だと思います。

## イベント送信

**2017/03/28追記**

- イベント名に日本語文字は使えるが、ハイフン"-" やカッコ "()" など使えない  
DebugViewで見ていたら「error」が記録されていて、そのエラーコードが"2"でした。
説明を読むと、「イベント名が長すぎるか、使用できない文字が使われています」でした。
実は移植アプリで試していて、GoogleAnalytics(以降GA)との併用をすることになっていたので、GAで送っている"category","action","label"を、`category-action-label`として繋げて送っていました。で、試した結果、ハイフンがダメだと分かり、アンダースコア"_"で回避しました。
ちなみに、DebugViewで見ているときは、Bundleしたパラメータを見られますが、「イベント」ビューからは、見られません。(BigQuery連携が必要)


# その他
基本的に導入は楽で新規アプリではどんどん導入していくべきだと思います。
ただ、Analyticsに関しては、使い方によってはまだまだGoogle Analyticsの方が見やすい、操作しやすい、ということはある気がしています。
ということで、次のアプリでは、「両方に対応して」と言われてしまいました・・・