设置和管理消息优先级

Android 中的下行消息传递优先级有两种:普通优先级和高优先级。普通优先级和高优先级的消息传递方式如下:

  • 普通优先级。这是数据消息和通知消息的默认优先级。 当设备未休眠时,普通优先级消息会被立即传递。当设备处于低电耗模式时,此类消息可能会被延迟传递以节省电量,直到设备退出低电耗模式。如果是对时间不太敏感的消息(例如新电子邮件通知、使界面保持同步或在后台同步应用数据),建议您选择普通传递优先级。

  • 高优先级。FCM 会立即尝试传递高优先级消息,允许 FCM 在必要时唤醒休眠设备并运行一些有限的处理(包括非常有限的网络访问)。高优先级消息通常应该会导致用户与您的应用或其通知进行互动。

决定消息是高优先级还是普通优先级

虽然普通优先级消息适合一般更新,但如果您需要确保紧急事项或操作立即传送,请选择高优先级。由于普通优先级消息的传送时间可能会受到低电耗模式的影响,因此将大多数面向用户的通知设为高优先级可确保及时传送。例如,聊天消息、账号问题或外卖更新等通知应设置为高优先级。

高优先级和普通优先级消息的消息处理

在 Android 设备上接收高优先级或普通优先级消息时,系统会在 onMessageReceived 处理程序中分配几秒时间处理消息载荷,高优先级消息的处理时间会略长于普通优先级消息。此时间应仅足以立即呈现通知。如果您还需执行其他操作,例如从设备存储中加载图片,或调用服务器以收集额外内容,则需要采取额外步骤。

onMessageReceived 方法在单独的工作器线程上调用。根据最佳实践,您应在 onMessageReceived 方法中立即处理消息载荷并呈现通知。您不应在 onMessageReceived 方法中进行额外的异步网络调用或在单独线程中处理载荷,否则可能会导致您的应用在载荷完全处理之前脱离有效的进程生命周期之外。如果发生这种情况,您可能会发现某些发送的 FCM 消息导致通知延迟或缺失。

如果您确实需要更多时间来处理消息(例如提取消息载荷中包含的 imageUrl),则需要使用 WorkManager 或前台服务等机制来延长应用生命周期。当您替换 onMessageReceived 方法以验证通知是否已完全处理时,应遵循以下指导。

  • 对于高优先级通知:使用 Android WorkManager 启动加急作业,以验证高优先级通知是否获得优先处理时间,从而验证通知渲染是否运行完成。好消息是,如果您担心高优先级 FCM 处理会耗尽加急作业配额,其实大可不必担心。在调度高优先级 FCM onMessageReceived 后立即安排的加急作业可享有短暂的豁免。
  • 对于普通优先级通知:请改用 Android WorkManager 启动常规 WorkRequest。这样可以验证处理通知所需的额外工作最终会得到执行,同时避免使用优先处理,从而减少不必要的电池消耗问题。

设置消息的优先级

您可以使用 Admin SDKFCM REST API 和 Firebase 控制台向用户发送通知。如需通过 Admin SDK 和 FCM REST API 更改优先级设置,您必须更新消息 JSON 载荷。您可以使用以下代码示例来了解如何将优先级设置为高。对于从控制台发送的通知,不支持设置 Android 专用通知字段。

 {
  "message": {
      "notification": {
          "body": "Purchase exceeding $500 detected",
          "title": "Credit card purchase"
      },
      "data": {
          "purchaser": "Your child",
          "items": "Gravity Defier Sneakers"
      },
      "android": {
          "priority": "high"
      },
      "apns": {
          "headers": {
              "apns-priority": "5"
          }
      }
  }
}

在低电耗模式下测试高优先级通知

为了确保用户收到高优先级通知时正确接收和处理,请按照以下说明测试您的通知:

  1. 按照使用低电耗模式测试您的应用中的说明将设备切换至低电耗模式。
  2. 在测试设备上通过应用访问您的 FCM 注册令牌。如需详细了解如何访问令牌,请参阅向后台应用发送测试消息
  3. 获得 FCM 令牌后,使用 FCM 通知发送代码或包含与高优先级通知匹配配置参数的 cURL 命令将通知发送到测试设备。

在 Android 上降低高优先级 FCM 的优先级

Android 设备上的高优先级消息适用于对时间敏感的用户可见内容,因此应该会生成面向用户的通知。如果 FCM 检测到一种模式,在这种模式下,消息不会生成面向用户的通知,那么系统可能会将您的消息优先级降低为普通优先级,或委托 Google Play 服务进行处理。

FCM 在确定是否降低消息优先级或代理消息时,会使用 7 天的消息行为;它会针对您应用的每个实例单独做出这一决定。如果在响应高优先级消息时,以对用户可见的方式显示通知,那么今后的高优先级消息不会受到影响。

使用 Google Play 服务进行通知委托

符合特定标准的高优先级通知消息由 Google Play 服务代理,而不是降低优先级。这意味着,Google Play 服务会代表应用显示通知,而无需启动应用。这样做是为了在 Android 设备上提供更好的整体用户体验。

请注意,在与收到的消息相关的分析报告方式方面,代理通知消息引入了一些变化:

  • 为了报告针对代理通知的分析,您的应用必须使用 FCM SDK 24.0.0 或更高版本。
  • 您可能会发现,与引入代理通知之前相比,收到的消息出现延迟或数量下降。这是因为,只有在应用启动后才会报告针对代理通知的分析,如果通知未导致应用打开,则可能根本不会报告这类分析。

以这种方式代理通知消息是使用 Android Q+ 以及 Google Play 服务 19054000 或更高版本的应用的默认行为。通过 HTTP v1 API 发送的消息会进行代理,但通过 Firebase 控制台或旧版 API 发送的消息不会进行代理。请注意,此功能目前处于 Beta 版阶段,随时可能发生变化。

虽然我们强烈建议您使委托保持启用状态,因为它对设备电池和内存有好处,但您可以通过以下任一方式停用此行为:

  • 基于应用级:在应用清单中,添加指令 <meta-data android:name= "delivery_metrics_exported_to_big_query_enabled" android:value="false"/>
  • 基于应用实例:对于应用实例,请根据具体应用场景在界面流程中为应用设置 fun setNotificationDelegationEnabled(disable: Boolean): Task<Void!>
  • 基于消息:对于发送请求,在 AndroidNotification 对象中将 proxy 键设置为 DENY

衡量 Android 设备上的消息优先级降低情况

  • 个别消息。在传递时,您可以将通过 getPriority() 获得的传递优先级与通过 getOriginalPriority() 获得的原始优先级进行比较,来确定是否降低个别消息的优先级。

  • 所有消息。FCM Aggregate Delivery Data API 可以报告您发送给 Android 的所有消息中,有多少百分比的消息被降低优先级。有些消息可能会从汇总数据报告中省略,但总体上,您应该可以通过这些报告从全局角度了解优先级降低率。如需了解详情以及获取用于查询 API 的示例代码,请参阅我们的汇总传送数据一文。您也可以通过 API Explorer 进行探索。

  • 代理通知。代理通知不会计入当前的 FCM 或 GA 传送指标,因此通知传送指标可能会下降高达 15%。如需针对代理消息进行报告,请使用 FCM Aggregate Delivery Data APIProxyNotificationInsightPercents 会报告成功代理的通知所占的百分比,以及无法成功代理的消息的详细信息。

排查通知延迟问题

  • 确保应用实例启用了通知。如果用户已为您的应用停用通知权限,系统将无法发布任何通知,因此会降低您的消息的优先级。您应验证通知是否已启用,然后再向应用实例发送高优先级消息。

  • 避免在处理通知时进行额外的网络调用。由于一小部分 Android 移动用户使用的是高延迟网络,因此请避免在显示通知之前打开与服务器的连接。在允许的处理时间结束之前回调服务器可能会让使用高延迟网络的用户面临风险。

    请在 FCM 消息中包含通知内容并立即显示。如果您需要同步 Android 上的其他应用内内容,可以使用 WorkManager 安排一项任务,在后台进行同步。