AndroidでFCMを実装してみた結果


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で受け取るようにするとか。

導入については、ちょっとだけ躓いたものの、基本的にはそれほど苦労せず導入できました。