Firebase Notificationsの挙動でハマったこと(GCMとの挙動差異)
はじめに
この記事は Firebase Advent Calendar 2016 - Qiita
の二十ー日目の記事です。
- 昨日は srea - Qiita さんのPriorityを使ったページングと新着監視の手法 - Qiitaのお話です
- 明日は yamacraft - QiitaさんのFirebaseの最新情報はどこから入手すべきか(公式の情報発信サイト一覧) - Qiitaのお話です
ハマった現象
- アプリがバックグラウンド
- アプリが起動していない時
Notification通知のアイコンが豆腐になった
原因
- Firebase Cloud Messaging が
- アプリの受信Service(MyFirebaseMessagingService::onMessageReceived) を呼ばず、
- 直接Notificationを通知してしてしまうから
- 従来のGCMだと、受信Serviceの中で NotificationCompatを自前で表示
- 指定なしだとアプリアイコンを使うという話があるが、それが探せないことがあるらしい
状態 | Notification | Data | 両方を含む |
---|---|---|---|
Foreground | onMessageReceived | onMessageReceived | onMessageReceived |
Background | 通知自動生成★ | onMessageReceived | 通知自動生成★、DataはIntentのextrasに |
★のパターン。。
詳細な状況の話(参考情報)
対処法
デフォルトの通知アイコンとアクセントカラーを設定しておく
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
基本的な実装の話
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 にできない物がある現状だったりも。。