在直接启动模式下接收 FCM 消息

如果您想在设备解锁前将 FCM 消息发送到应用,可以启用直接启动模式。例如,您可能希望应用的用户即使在设备锁定的情况下也能收到提醒通知。

构建此用例时,请遵循直接启动模式的常规最佳实践和限制。请务必考虑支持直接启动的消息的公开范围。任何有权访问设备的用户都可以查看这些消息,而无需输入用户凭证。

前提条件

  • 必须对设备进行设置,以使其支持直接启动模式。
  • 设备必须安装较新版本的 Google Play 服务(19.0.54 或更高版本)。
  • 应用必须使用 FCM SDK (com.google.firebase:firebase-messaging) 才能接收 FCM 消息。

为应用启用消息处理直接启动模式

  1. 在应用级 Gradle 文件中,添加对 FCM 直接启动支持库的依赖项:

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. 通过在应用清单中添加 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 服务可以在直接启动模式下运行。您可以根据以下要求进行检查:

  • 在直接启动模式下运行时,该服务不应访问受凭证保护的存储空间。
  • 在直接启动模式下运行时,该服务不应尝试使用 ActivitiesBroadcastReceivers 等组件或其他未标记为能够感知直接启动的 Services
  • 在直接启动模式下运行时,该服务使用的库也不应访问受凭证保护的存储空间,并且不应调用 non-directBootAware 组件。也就是说,该应用通过此服务调用所使用的库要么需要能够感知直接启动,要么应用需要检查它是否在直接启动模式下运行,并且不在该模式下调用这些库。例如,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,
    },
}