> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 应用内消息事件流

> 如何利用事件流来捕获应用内消息指标

本文档解释了我们的[应用内消息](./in-app-messages-setup)事件的功能和用法。您可以跟踪用户每次点击或查看这些消息时的重要参与统计信息，包括块级点击和特定页面显示。

## 应用内消息事件

有三种[`event.kind`](./event-streams-data#event-kind)类型的应用内消息事件：

* 应用内展示 - `message.iam.impression`
* 应用内点击 - `message.iam.clicked`
* 应用内页面显示 - `message.iam.page_displayed`

这些事件在用户打开设备上的应用内消息并与其交互时触发。

### 应用内展示

此事件在消息完成加载并显示在屏幕上后立即触发。

使用[轮播](./design-your-in-app-message#carousels)时，您可以使用`event.data.page_name`和`event.data.page_id`获取显示的特定页面的名称和UUID。

### 应用内点击

此事件适用于任何具有点击操作的元素或块（也称为"目标"）。您可以使用`event.data.target_name`和`event.data.target_id`获取被点击的特定目标的名称和UUID，以及使用`event.data.page_name`和`event.data.page_id`获取目标所属的页面。

有关详细信息，请参阅[应用内点击操作](./iam-click-actions)。

### 应用内页面显示

这是一个仅适用于[轮播](./design-your-in-app-message#carousels)的事件。您可以使用`event.data.page_name`和`event.data.page_id`获取显示的特定页面或卡片的名称和UUID。第一张卡片的展示在文档完成加载后立即触发。后续页面展示在滑动时触发。

## 应用内消息事件数据

每个`event.kind`可以根据您创建应用内消息的方式包含额外的事件数据。

<ParamField path="event.data.page_name" type="string">
  当`event.kind`为`clicked`或`page_displayed`时显示的页面或卡片的名称。对于`impression`事件不可用。

  `page_name`有助于了解显示了哪个页面以及在该页面上点击了什么。

  页面名称默认为"Card 1"、"Card 2"等，但您可以在块编辑器中更改名称。

  <Frame>
    <img src="https://mintcdn.com/onesignal/Z6xkXGfmy814If53/images/docs/e0862074b7ea2c064808035d2028410dae6aecc4bdf9ae4c4c83eeee1ac8d643-Screenshot_2025-01-17_at_1.30.34_PM.png?fit=max&auto=format&n=Z6xkXGfmy814If53&q=85&s=44d2b05d410b28b9e6fec94fd979ec5b" width="1040" height="826" data-path="images/docs/e0862074b7ea2c064808035d2028410dae6aecc4bdf9ae4c4c83eeee1ac8d643-Screenshot_2025-01-17_at_1.30.34_PM.png" />
  </Frame>
</ParamField>

<ParamField path="event.data.page_id" type="string UUID v4">
  页面的唯一标识符。在使用[轮播](./design-your-in-app-message#carousels)且旧卡片被删除或替换为新卡片的情况下很有用。
</ParamField>

<ParamField path="event.data.target_name" type="string">
  按钮或图像块元素的名称。您必须设置[点击操作](./iam-click-actions)。
</ParamField>

<ParamField path="event.data.target_id" type="string UUID v4">
  按钮或图像块元素的唯一标识符。您必须设置[点击操作](./iam-click-actions)。在使用[轮播](./design-your-in-app-message#carousels)且旧卡片被删除或替换为新卡片时，这很有用。
</ParamField>

## 创建您的应用内消息事件流

### 设置事件流

查看[事件流设置](./event-streams#setup)说明，以获取设置和个性化事件流的指导。以下提供了配置事件流的IAM特定步骤（第3步）。

## 确保您要跟踪的目标设置正确

为了在事件流请求正文中利用自定义名称，您必须在块编辑器或HTML编辑器中手动指定新的自定义名称。在自定义名称功能发布之前已存在的应用内消息将无法在事件流中公开`page_name`和`target_name`值，直到应用内消息为每个页面或块更新自定义名称。

应用内消息更新后，从那一刻起触发的事件流请求将可以访问这些值。在任何时候，`page_name`和`target_name`值都将反映当时应用内消息的自定义名称状态，如果应用内消息再次更新，这些值可能会发生变化。

<Tabs>
  <Tab title="块编辑器">
    所有三种事件都可以与此编辑器一起使用。使用块编辑器时，确保目标包含[应用内点击操作](./iam-click-actions)。目标包括图像、按钮、关闭按钮和背景块。文本块目前不支持点击操作，因此不包括在内。

    目标自定义名称应该是唯一的，以避免在仪表板体验中造成混淆。
  </Tab>

  <Tab title="HTML编辑器">
    只有应用内展示和点击事件可以与此编辑器一起使用。使用HTML编辑器时，您可以跟踪任何元素类型的点击，而不仅仅是按钮和图像。有2个要求：

    1. 元素必须具有`data-onesignal-unique-label="<insert_value>"`属性来跟踪目标
    2. 元素必须应用事件监听器，该监听器调用嵌入式[应用内JS库](./in-app-message-api)（即`OneSignalIamAPI`）的方法。

    注意：为避免混淆，请确保目标名称是唯一的。对于关键的唯一性，例如自定义内部报告，请使用OneSignal保证唯一的`target_id`。请注意，在多个元素上使用相同标签的`data-onesignal-unique-label`属性将合并其分析数据。更改这些标签会在原始标签下保留先前的数据，新数据分配给新标签。为了精确跟踪，优先使用`target_id`。

    例如：

    <CodeGroup>
      ```html html theme={null}
      // For elements that do something like tag a user or prompt a push do something like this:

      <body>
        <button data-onesignal-unique-label="my-tag-user-button">Tag User</button>
      </body>
      <script>
        document
          .querySelector("button[data-onesignal-unique-label="my-tag-user-button")
          .addEventListener("click", function(e) {
            OneSignalIamApi.tagUser(e, { fiz: "baz" });
           });
      </script>

      // or for elements that don't require any specific functionality of the OneSignalIamApi other than click tracking, just call trackClick

      <body>
        <button data-onesignal-unique-label="my-button">Click Here</button>
      </body>
      <script>
        document
          .querySelector("button[data-onesignal-unique-label="my-button")
          .addEventListener("click", function(e) {
            OneSignalIamApi.trackClick(e);
           });
      </script>
      ```
    </CodeGroup>

    **示例输入：**

    <CodeGroup>
      ```json json theme={null}
      {
        "page_name":"{{ event.data.page_name }}",
        "page_id":"{{ event.data.page_id }}",
        "target_id":"{{ event.data.target_id }}",
        "target_name":"{{ event.data.target_name }}",
        "iam_id":"{{ message.id }}",
        "iam_name":"{{ message.name }}",
        "event_kind": "{{ event.kind }}"
      }
      ```
    </CodeGroup>

    **示例输出：**

    <CodeGroup>
      ```json json theme={null}
      {
        "page_name" : "html_page",
        "page_id": "d8b28eda-add3-59f8-a12d-07c70642363b" ,
        "target_id": "6bab1bd9-4de6-557b-b5ed-ecb85baed f89",
        "target_name": "my-location-prompt-button",
        "iam_id": "bb6329b6-f81a-44aa-a571-30ef6746de0c",
        "iam_name": "html iam naming",
        "event_kind": "message. iam.clicked"
      }
      ```
    </CodeGroup>
  </Tab>
</Tabs>

### 使用唯一ID

最佳实践：将事件流用于分析目的时，使用`message.id`、`page_id`和`target_id`来验证唯一性。可以使用自定义名称，但它们旨在帮助以人类可读的格式区分一个IAM中的元素。如果您有多个应用内消息，请使用`message.id`来区分它们。

### 在块编辑器中使用清晰的名称

为所有应用内消息标题、卡片和块使用有意义且唯一的名称，以简化数据分析。要重命名轮播中的卡片，选择要更新的选项卡，然后选择卡片选项卡旁边的"选项"下拉菜单。您将看到重命名卡片的选项。

要重命名块，选择每个块右上角的三点选项菜单以打开重命名模式。所有自定义名称都将反映在仪表板报告和事件流中（如果适用）。除非设置并保存，否则自定义名称不会出现在事件流中。如果您有活跃的IAM并且最近设置了新的IAM事件流，您需要确保这些IAM具有有意义的自定义名称以进行更清洁的分析。

***
