多消息

multi 是一个特殊的工具模板,可以包含多个消息的数组,每个消息都有自己的触发器和目标,完全独立于其他消息。这与具有多个屏幕的单个消息不同,尽管多消息可以包含具有多个屏幕的消息。

interface MultiMessage {
  template: "multi";
  messages: Array<{
    id: string;
    template: string;
    content: object;
  }>;
}

当消息系统遇到具有 template: "multi" 的消息时,它会展平消息的 messages 数组,并将每个子消息作为独立的消息添加到消息系统中。“包装器”与 template: "multi" 然后被丢弃。包含的消息数量没有限制。每个单独的消息可以是任何其他模板,并且它们不需要共享相同的模板。但是,multi 消息不能嵌套在其他 multi 消息内部

此模式具有专门的用途。通常,在将消息添加到 Firefox 消息系统(在源代码中)时,没有理由将多个消息包装在一个消息中,因为您可以直接将多个消息添加到其中一个本地消息提供程序。但是,当通过 Experimenter 运行需要提供多个消息的消息实验时,此模式就会发挥作用。

例如,对于需要多个入门消息、提示、提醒等的大型功能的实验,需要这样做。Nimbus 实验具有 分支 结构,其中每个用户一次只能注册一个分支,并且每个分支的值必须是一个对象。此模板提供了一种方法,可以在单个分支上的单个功能值中包含多个消息。

由于最常用的消息模板支持多屏幕,因此多消息实验包含具有多个屏幕的消息的情况比较常见。在这种情况下,每个分支包含多个消息,每个消息包含多个屏幕。可以将其视为文件夹结构

The tree structure of a multi-message with two messages, each containing two screens

示例

{
  "template": "multi",
  "messages": [
    {
      "id": "EXAMPLE_WHATS_NEW_PAGE",
      "template": "update_action",
      "content": {
        "action": {
          "id": "moments-wnp",
          "data": {
            "url": "https://www.mozilla.org/%LOCALE%/etc/firefox/retention/thank-you-a/",
            "expire": 1730162684253
          }
        }
      },
      "trigger": { "id": "momentsUpdate" }
    },
    {
      "id": "EXAMPLE_SPOTLIGHT",
      "template": "spotlight",
      "content": {
        "template": "multistage",
        "backdrop": "transparent",
        "screens": [
          {
            "id": "EXAMPLE_SPOTLIGHT",
            "content": {
              "title": { "raw": "Hello, Firefox!" },
              "primary_button": {
                "label": { "string_id": "some-fluent-id" },
                "action": { "navigate": true }
              }
            }
          }
        ]
      }
    }
  ]
}