Android O の新機能 通知チャンネル(Notification Channel)に対応する
Android 8.0 バージョンの SDK を対象としているアプリは、通知をユーザーに送信するために 1 つ以上の通知チャンネルを実装する必要があります。
チャネルを作らないと通知こなくなる。
前提
- 通知の送信側 : Firabase Cloud Messaging (FCM)
 - 端末 : Android O (8.0.0)
- API level 26
 
 
基本的なやり方はココを参考に
参考 : https://stackoverflow.com/questions/46784463/firebase-notification-is-not-working-on-android-o
対応ポイント(ざっくり)
- Android OではNotification Channelが必須
 - デフォルトのNotification Channelは 
AndroidManifest.xmlで定義できる - ・・がチャネルは 
onMessageReceived()で作成される - FCMからのデータペイロードが 
data,notification両方の場合、アプリがバックグラウンドにいると、通知はシステムトレイに届く - システムトレイに届く前にチャネルを作っておかないといけない
 
[蛇足] FCMのメッセージ(アプリがバックグラウンドの場合)の注意点
FCMから送られてくるjsonのデータ形式によって、動作が変わる
(最初の参考URLにあるstackoverflowの記述だと、dataペイロードがない場合にシステムトレイに届く、のように記載があるが、公式ドキュメントは以下。 dataとnotification両方ある場合にシステムトレイに届く)
参考 : https://firebase.google.com/docs/cloud-messaging/android/receive#handling_messages
| アプリの状態 | 通知 | データ ペイロード | 両方 | 
|---|---|---|---|
| フォアグラウンド | onMessageReceived | onMessageReceived | onMessageReceived | 
| バックグラウンド | システムトレイ | onMessageReceived | 通知: システムトレイ インテントの追加部分にあるデータ | 
- 通知 : json に 
notificationのみ - データペイロード : json に 
dataのみ - 両方 : json に 
notification,data両方含まれる 
FCMからのプッシュ通知
対応手順 : https://firebase.google.com/docs/cloud-messaging/android/client
FirebaseのSDKバージョンを確認する
Version 10.2.6で Notification Channel対応しているので、アプリの使っている Firebase バージョンを確認
dependencies {
     compile 'com.google.firebase:firebase-messaging:11.8.0'
}
manifestを編集
マニフェストで指定できるのは、デフォルト通知のアイコン、色、チャネル
<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />
<meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/colorAccent" />
<meta-data
    android:name="com.google.firebase.messaging.default_notification_channel_id"
    android:value="@string/default_notification_channel_id"/>
これらマニフェストで指定される値は FCM の notification に含まれるデータで上書きされる。
参考 : https://firebase.google.com/docs/cloud-messaging/http-server-ref
- チャネルIDは 
android_channel_id 
channel_idはマニフェストで指定しなくてもFCMがデフォルトの通知チャネルを作ってくれるっぽいけど、変なチャネル名になるらしい。
チャネルを作成
参考実装 : https://github.com/firebase/quickstart-android
MainActivityなどでチャネルを作成しておく(これ忘れると通知こない)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  // Create channel to show notifications.
  String channelId  = getString(R.string.default_notification_channel_id);
  String channelName = getString(R.string.default_notification_channel_name);
  NotificationManager notificationManager = getSystemService(NotificationManager.class);
  notificationManager.createNotificationChannel(new NotificationChannel(channelId,
      channelName, NotificationManager.IMPORTANCE_LOW));
}
[補足] アプリのターゲットバージョンについて
また、targetSdkVersion で O 以上を指定してビルドする場合には、このチャンネルを一つ以上作成しないと、ユーザに通知が表示されなくなってしまうらしいので、ご注意ください。
O より前のバージョンをターゲットとしてビルドしたアプリを、O のユーザがインストールした場合はこの制限を気にする必要はありません。
チャネルを作成せずに、ターゲットバージョンだけ上げてしまうと、Android O端末でだけプッシュ通知が受信できなくなってしまう。
(アプリのターゲットSDKバージョンに次第で、Android O端末でも以前の通知方法で受信できるということでもある)
以下、Api Level26対応ならば以下のような感じ
android {
  compileSdkVersion 26
  buildToolsVersion "26.0.2"
...
ここを変えると このアプリはちゃんとAndroid O対応してるよ! と表明することになるので、以下の他変更点にも留意。