Firebase Notificationsの挙動でハマったこと(GCMとの挙動差異)

はじめに

この記事は Firebase Advent Calendar 2016 - Qiita

の二十ー日目の記事です。

ハマった現象

  • アプリがバックグラウンド
  • アプリが起動していない時

Notification通知のアイコンが豆腐になった

原因

  • Firebase Cloud Messaging が
  • アプリの受信Service(MyFirebaseMessagingService::onMessageReceived) を呼ばず、
  • 直接Notificationを通知してしてしまうから
    • 従来のGCMだと、受信Serviceの中で NotificationCompatを自前で表示
    • 指定なしだとアプリアイコンを使うという話があるが、それが探せないことがあるらしい

状態 Notification Data 両方を含む
Foreground onMessageReceived onMessageReceived onMessageReceived
Background 通知自動生成★ onMessageReceived 通知自動生成★、DataはIntentのextrasに

★のパターン。。

詳細な状況の話(参考情報)

qiita.com

対処法

  • デフォルトの通知アイコンとアクセントカラーを設定しておく

  • AndroidManifest.xml

    <meta-data android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@android:drawable/sym_action_email" />
    <meta-data android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/colorAccent" />

変更できますではなく設定が必須である というお話。

対処法追記(2017/1

  • OS7以降 カラーアイコン対応 (枠が四角アイコンでもOK)
  • OS6以下 単色アイコン(抜きが必要)
    • OS7の感覚で指定してしまうと、アイコンが豆腐になるorz

qiita.com


基本的な実装の話

gihyo.jp

GCMとの差分

  • プロジェクト単位で、Googleアカウント招待みたいな形で情報共有が可能
    • アカウントの使い回しみたいなことはしなくていい
  • FCMのWebConsoleからNotificationを送れるようになった
    • 一度送ったメッセージをコピーして再送が出来る
    • 従来通りendpointに送信することも可能

よくcurlの例が出てきますが、postman(Chrome plugin) 辺りを使うと便利

curl --header "Authorization: key=$api_token" \
     --header Content-Type:"application/json" \
     https://fcm.googleapis.com/fcm/send \
     -d "{\"to\": \"/topics/news\",\"notification\": {\"text\": \"メッセージ\"}}"
項目 key value
post url https://fcm.googleapis.com/fcm/send
header Authorization key=$api_token
header Content-Type application/json
body {\“to\”: \“/topics/news\”,\“notification\”: {\“text\”: \“メッセージ\”}}

api_token は RegistrationId送信 時に取得できる値を指定

String refreshedToken = FirebaseInstanceId.getInstance().getToken();


2017/1/6追記

の記事を読んで

Firebase Analyticsを無効にできない?

これRun転送するときに思っていたんですが、サービスとかが再転送時にちゃんと再起動されていない挙動で

  • アプリケーションの設定より、アプリを強制終了する
  • アプリを消す
  • 端末自体を再起動する

あたりをしないと変更差分を認識しないような感じがしています

蛇足 Google開発者サービス(Google play services)がサポートする環境は、バージョン10.2.x以降、API14になるとのこと。

去年一回でグレってminsdk-14でリリースされたやつが、10.X.X では正式になるという話ですね

10.0.X までは動かせるのかな? 現状9.8.0でしか動作確認していませんが・・*1

*1:まだ物によっては10.0.X にできない物がある現状だったりも。。