デバイスのロックが解除される前にアプリに FCM メッセージを送信したい場合は、ダイレクト ブート モードを有効にできます。たとえば、ロックされたデバイスでも、アラーム通知がアプリのユーザーに届くようにしたい場合などです。
このユースケースを構築する場合は、ダイレクト ブート モードに関する一般的なベスト プラクティスと制限事項を遵守してください。ダイレクト ブートに対応したメッセージの可視性を考慮することが重要です。デバイスにアクセスできるユーザーであれば、ユーザーの認証情報を入力しなくてもこれらのメッセージを表示できます。
前提条件
- デバイスをダイレクト ブート モードに設定する必要があります。
- デバイスに Google Play 開発者サービスの新しいバージョン(19.0.54 以降)がインストールされている必要があります。
- アプリは FCM SDK(
com.google.firebase:firebase-messaging
)を使用して FCM メッセージを受信する必要があります。
アプリでダイレクト ブート モードのメッセージ処理を有効にする
アプリレベルの Gradle ファイルで、FCM ダイレクト ブート サポート ライブラリの依存関係を追加します。
implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
アプリ マニフェストで
android:directBootAware="true"
属性を追加して、アプリのFirebaseMessagingService
をダイレクト ブート対応にします。<service android:name=".java.MyFirebaseMessagingService" android:exported="false" android:directBootAware="true"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
この FirebaseMessagingService
をダイレクト ブート モードで実行できるようにすることが重要です。次の要件を使用して確認できます。
- ダイレクト ブート モードでの実行中、サービスは認証情報で保護されたストレージにアクセスできません。
- ダイレクト ブート モードでの実行中、サービスはダイレクト ブート対応として指定されていない
Activities
、BroadcastReceivers
、Services
などのコンポーネントを使用できません。 - ダイレクト ブート モードでの実行中、サービスで使用するライブラリは、認証情報で保護されたストレージにアクセスしたり、ダイレクト ブートに対応しないコンポーネントを呼び出したりすることはできません。つまり、アプリが使用し、サービスから呼び出されるライブラリは、ダイレクト ブート対応である必要があります。ダイレクト ブート対応でないライブラリについては、アプリは現在実行中のモードを確認し、ダイレクト ブート モードで実行中の場合はそれらのライブラリを呼び出さないようにする必要があります。たとえば、Firebase SDK はダイレクト ブートで動作しますが(アプリに含めてもダイレクト ブート モードでアプリのクラッシュを発生させることはありません)、多くの Firebase API はダイレクト ブート モードでの呼び出しに対応していません。
- アプリでカスタムの
Application
を使用している場合は、Application
もダイレクト ブート対応である必要があります(ダイレクト ブート モードでは認証情報で保護されたストレージにアクセスできません)。
ダイレクト ブート対応のメッセージを送信する
HTTP v1 API を使用して、ダイレクト ブート モードのデバイスにメッセージを送信できます。
メッセージ リクエストには、リクエスト本文の AndroidConfig
オプションにキー "direct_boot_ok": true
を含める必要があります。次に例を示します。
https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send
Content-Type:application/json
Authorization: Bearer ya29.ElqKBGN2Ri_Uz...HnS_uNreA
{
"message":{
"token" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"data": {
"score": "5x1",
"time": "15:10"
},
"android": {
"direct_boot_ok": true,
},
}