2016/10/12時点の記事です。
結論
- GCMよりは簡単そう。
- アイコン設定がいまいち。
- データの受け渡しは、FCMのjsonには含めない方がいいかも。
導入について
導入については、色んなところで説明されているし、公式のサンプルが優秀なので、割愛します。
公式ガイドを参照してください。
つまづいたとことか、注意点とか
- app直下に、FCM管理画面で取得したgoogle-service.jsonを設置しとかないと、
compile 'com.google.firebase:firebase-messaging:9.6.1'
を設定した段階でbuildが通らなくなる。 - なんでかbuildが通らない(エラー忘れちゃった)
app/build.gradleにいかを記述することで解決するかも。
android {
.........
packagingOptions {
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
}
}
これでダメなら、AndroidStudioの再起動で通るようになるかも。
イラついたところ
アイコンの設定です。
アプリがforegroundの時は、問題なく行えます。
FirebaseMessagingServiceをextendsしたクラスのonMessageReceivedが起動して、そこで通知を作成しています。
しかし、backgroundにいる場合、onMessageReceivedが動きません。
そもそも、このサービス自体呼び出されないっぽいです。
2017/03/01 どうやら呼び出されるようになったっぽい
何か方法があるのかと思ったら、公式のバグ仕様のようです。
そうすると、勝手に通知も作られるため、アイコンはデフォルト設定になってしまいます。
よくある角丸のアイコンにしてると、グレーの丸の中に角丸の四角で白抜きされた、よく分からないアイコンになります・・・・。
ダメでしょ・・・。
badgeについて
Push通知を飛ばすときって、メッセージがあったり、お知らせがあったりなので、badgeも更新したいですよね。
FCMのpushに送るjsonのフォーマットに、dataってのがあります。
何かデータを受け取りたい場合、notificationではなく、dataに入れるべきです。
dataは、ActivityのgetIntent().get("hoge")で受け取れますが、notificationは、OnMessageReceivedまでしか引き継がれないためです。
しかし、「これbadgeの更新に使えるじゃん!」って思ってたのですが、これは罠でした。
foregroundの時は、問題ないです。
受け取ったbadgeも更新できてますし、アプリの二重起動も起こらないようにできます(わざと起動させることもできます)。
しかし、backgroundの時が問題です。
状況としては以下のことが考えられます。
-
アプリが起動していない。通知から起動すれば問題無し > ◯通知以外から起動すると、データが受け取れない > ×
-
アプリは起動しているが、backgroundにいる通知から起動すれば問題無し > ◯起動中のアプリ一覧から動かすとデータが受け取れていない > ×
-
アプリは起動しているし、foregroundだけど、画面がスリープになっているbackground扱いになる > まぁ問題無し通知から起動すると、アプリが二重起動される > ×スリープから解除してもデータは受け取れていない > ×
~~まぁ、データの受け渡しに関しては、あまり使わない方が良さそうです。
これならいっそ、データの受け渡しはできない仕様にしてほしかった・・・。
2017/03/01 どうやら呼び出されるようになったっぽい
まとめ
とりあえず現状は、通知だけを行うものとして考えて、合わせて送りたいデータがある場合は、別の方法を考えた方が良さそうです。
起動時とか復帰の時(onResume)とかでAPIで受け取るようにするとか。
導入については、ちょっとだけ躓いたものの、基本的にはそれほど苦労せず導入できました。