Firebase Cloud Messaging(FCM)のPUSH通知をトリガーに、スリープ状態から復帰する
Androidの場合、スリープ状態でPUSH通知を受けると、音だけ再生されて画面は真っ暗。
それだと気づけないので、LINEとかのPUSH通知とかは、PowerManagerで電源をONにした後にPUSH通知を作って表示したりしてます。
FCMで普通にやるとPUSH通知の受信から制御できないので、
どうやったらできるようになるのか、FCMの通知の仕組みから見ていきます。
FCMには通知が2種類存在します。
通知 | 通知の表示 | 通知の受信を制御 | 通知のタップを制御 |
---|---|---|---|
通知メッセージ | 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通知つくることまでやっちゃっても良い気がします。