【Android】既存アプリにFirebaseを入れるときにハマった話



[【Android】30分で実装するPush通知](http://qiita.com/SnowMonkey/items/7f08eb0275f2420c29eb)にてFirebase導入の簡単さと便利さに感激して早速弊社の[アプリ](https://play.google.com/store/apps/details?id=jp.jmty.app2)にも導入しました。
が、しかし、既存のアプリに組み込んでリリース前に動作確認しているときに想定外の不具合が発生して、ドハマりしたので書き残しておきます。

使おうとした機能はFirebase AnalyticsとNotificationです。
（動作確認は基本的にNexus5の6.0.1で実施してます）

# 既存のplay-servicesライブラリとの競合

## 結論
- play-servicesライブラリはgoogle-servicesプラグインで置き換える

（「[Firebase Get Started](https://firebase.google.com/docs/android/setup)」に書いておいてくれよおおおおおお！！！！）

## 問題点と解決方法
### 問題点
既存アプリでplay-servicesを使っている場合、「[Get Started](https://firebase.google.com/docs/android/setup)」の通りにそのままライブラリとプラグインを追加すると、ANRが発生します。
※アプリ起動後、一度ホーム画面へ行って再度アプリへ戻ったタイミングでANRが発生するので微妙に気付きにくいのがミソです。。。

[ライブラリ同士で競合している](https://stackoverflow.com/questions/37380974/app-stops-responding-after-resuming-from-background-sometimes-could-firebase-be)とのこと。


### 解決方法
既にGoogle Analyticsなどを使っていて、「[Get Started](https://firebase.google.com/docs/android/setup)」の通りに導入すると以下のようになります。

```app/build.gradle（対応前）

dependencies {
    // 略
    
    // google play service
    compile 'com.google.android.gms:play-services:9.0.2'
    compile 'com.google.android.gms:play-services-base:9.0.2'
    compile 'com.google.android.gms:play-services-gcm:9.0.2'

    // ADD Firebase
    compile 'com.google.firebase:firebase-core:9.0.2'
    compile 'com.google.firebase:firebase-messaging:9.0.2'
    compile 'com.google.firebase:firebase-crash:9.0.2'
}

apply plugin: 'com.google.gms.google-services'
```

以下のようにplay-servicesを削除して、play-service-analyticsを追加すればOKです。（Analyticsを使っていなければ追加は必要ありません）

```app/build.gradle（対応後）

dependencies {
    // 略
    
    // google play service
    compile 'com.google.android.gms:play-services-base:9.0.2'
    compile 'com.google.android.gms:play-services-gcm:9.0.2'
    compile 'com.google.android.gms:play-services-analytics:9.0.2'

    // ADD Firebase
    compile 'com.google.firebase:firebase-core:9.0.2'
    compile 'com.google.firebase:firebase-messaging:9.0.2'
    compile 'com.google.firebase:firebase-crash:9.0.2'
}

apply plugin: 'com.google.gms.google-services'
```


# Notificationアイコンがカスタムできない

## 結論
- シンプルかつ輪郭だけで判別できるようなアイコンにしよう

## 問題点と解決方法
### 問題点
9.0.2現状、Firebase Notificationではアプリがbackgroundにいるときに表示される[Notificationアイコンはカスタマイズできません](http://stackoverflow.com/questions/37325051/notification-icon-with-the-new-firebase-cloud-messaging-system)。
使われるアイコンはアプリのLauncherアイコンなのですが、任意のNotification用のアイコンには変えられないわけです。
更に、アイコン画像はsmallIconにセットされる仕様らしく、Android端末のバージョンによってはアイコンが判別できなくなります。
（手元には4.x系と6の端末しかなかったのですが、5.0以上の端末で判別不可？）


ということで、よくある角丸の四角いアイコンの中にサービス名などを書いているようなアイコンだと全く判別付きません。

### 対応前後での見え方
角を丸くした四角いアイコン（赤枠外透過あり）を使っていたのですが以下のようになってしまい、どのアプリからの通知だかさっぱりわかりません。。。
![notif_icon_sq_sample.png](https://qiita-image-store.s3.amazonaws.com/0/109065/2a2cd077-d806-aec7-be8d-276360b56f23.png "notif_icon_sq_sample.png")

これを、背景透過の輪郭だけでわかるアイコンにすると
![notif_icon_sample.png](https://qiita-image-store.s3.amazonaws.com/0/109065/b023669e-7ea5-0427-d2d3-50fd01463f85.png "notif_icon_sample.png")

なんとなくどのアプリからの通知か分かるようになった気がします。

### Launcherアイコンの例
例えば下のスクショだと、2段目のLauncherアイコンならおそらく判別可能ですがそれ以外はどのアプリからの通知だか分からないです。
![screen_shot.png](https://qiita-image-store.s3.amazonaws.com/0/109065/0de2a4e3-ae72-bbcb-4873-d9501718a56b.png "screen_shot.png")

とはいえそう簡単にLauncherアイコンを変えるわけにもいかないと思いますので、早くNotificationアイコンのカスタマイズできるようにして欲しいところです。。。


# （おまけ）Google Play servicesをFirebase APIsに寄せていく動き
[Google APIs for Android](https://developers.google.com/android/guides/releases)をみると、以下のような記述があります。

```
・App Invites (now Firebase Invites) is still available at com.google.android.gms.appinvite, but going forward you should use com.google.firebase:firebase-invites.

・Firebase Cloud Messaging builds on and improves the Google Cloud Messaging API. You can keep using Google Cloud Messaging with com.google.android.gms.gcm, but we recommend upgrading to com.google.firebase:firebase-messaging.
```


超意訳すると以下の内容になります。

- App Invites使いたかったら```com.google.firebase:firebase-invites```使ってね。```com.google.android.gms.appinvite```は今んとこ使えるけど使えなくなってもしらないよ。
- Firebase Cloud Messaging ＞ Google Cloud Messaging APIだよ。まだ```com.google.android.gms.gcm```使えるけど、```com.google.firebase```使ってFirebase Cloud Messagingへの移行をオススメするよ。

ということで、I/O 2016でさんざんFirebaseのセッションしてたことも踏まえて、Googleは諸々の機能をFirebaseに移行しようとしているみたいです。
Google教徒のみなさまはこの期にFirebase導入を検討してみてはいかがでしょう。

ｸﾞｰﾒﾝ(　´-｀)†