Firebase Cloud Messaging(FCM)のPUSH通知をトリガーに、スリープ状態から復帰する

Androidの場合、スリープ状態でPUSH通知を受けると、音だけ再生されて画面は真っ暗。

それだと気づけないので、LINEとかのPUSH通知とかは、PowerManagerで電源をONにした後にPUSH通知を作って表示したりしてます。

FCMで普通にやるとPUSH通知の受信から制御できないので、

どうやったらできるようになるのか、FCMの通知の仕組みから見ていきます。

FCMには通知が2種類存在します。

参照:FCM メッセージについて  |  Firebase

通知 通知の表示 通知の受信を制御 通知のタップを制御
通知メッセージ Auto X
データメッセージ Manual

凄くざっくりした感じですが、簡単に通知を表示するなら「通知メッセージ」を使って、

通知の受信をハンドリングしたり、通知の表示をカスタマイズしたい場合は「データメッセージ」を使います。

今回は、受信をハンドリングして電源をONにしたいので、「通知メッセージ」ではなく「データメッセージ」を利用します。

2種類の通知はAPIを叩く際に渡すJSONの構造によって決まります。

通知メッセージの場合は、 notification に通知内容を設定します。(dataも設定可能です)

{
  "to" : "axd2Wedbd2Wed2WBed9ebVeewdbd2WedbWq1",
  "notification" : {
    "body" : "hello",
    "title" : "greeting"
  },
  "data": {
    sound: 'ping'
  }
}

データメッセージの場合は data のみに通知内容を設定します。

{
  "to" : "axd2Wedbd2Wed2WBed9ebVeewdbd2WedbWq1",
  "data" : {
    "body" : "hello",
    "title" : "greeting"
  }
}

今回は、データメッセージを使いたいので、dataのみに値を設定してFCMのAPIを叩いてPUSH通知を送信します。

ここまでで、サーバー側の仕事は完了です。

後は、アプリ側でデータメッセージを受けて処理するだけです。

仕事上、最近、ReactNativeを使う機会が多いので、RNのコード例です。

import { AppRegistry } from "react-native";
import Wakeful from "react-native-wakeful";
import App from "./App";

AppRegistry.registerComponent("app", () => App);

AppRegistry.registerHeadlessTask(
  "RNFirebaseBackgroundMessage",
  () => async message => {
    Wakeful.acquire(); // 電源をON
    return Promise.resolve();
  }
);

PUSH通知を作る所までコード例を書いてないですが、RNでPUSH通知を作るか、

AppRegistry.registerHeadlessTask せずに、Android側でRNFirebaseMessagingServiceを継承して、

onMessageReceivedでPowerManagerで電源入れて、PUSH通知つくることまでやっちゃっても良い気がします。