> ## 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.

# 按页面主题和订阅来源标记用户

> 根据用户访问的页面和订阅推送通知的页面，在 OneSignal 中为用户添加标签，然后细分以进行有针对性的活动。

您可以根据用户在您的网站或应用中交互的页面，在 OneSignal 中为用户添加标签，然后将这些标签用于细分和有针对性的消息传递。本页面涵盖两种不同的模式——选择最符合您目标的模式，或同时运行两种模式。

## 选择您的模式

| 模式          | 代码运行时机        | 设置内容                               | 平台              |
| ----------- | ------------- | ---------------------------------- | --------------- |
| **按页面主题标记** | 每次页面或屏幕访问时    | 每个主题的计数标签（`gaming = 5`）            | Web、Android、iOS |
| **订阅时标记**   | 一次，当用户选择加入推送时 | 归因标签（`subscription_page = gaming`） | 仅 Web           |

**按页面主题标记** 构建随参与度增长的行为兴趣画像——适用于内容推荐、重新激活活动以及基于类别的细分，包括那些从未明确选择特定主题的用户。

**订阅时标记** 在选择加入时捕获单一时间点信号——适用于来源感知的欢迎消息和滴灌活动，其中用户订阅时所在的页面预测他们接下来想阅读的内容。

## 前提条件

* 安装并初始化 OneSignal [Web SDK](./web-sdk-setup) 和/或 [移动 SDK](./mobile-sdk-setup)。
* 熟悉[标签](./add-user-data-tags)和[细分](./segmentation)。

***

## 按页面主题标记（每次访问）

为用户标记他们最常参与的主题，以便提供更个性化的消息——提高相关性、点击率和满意度。

示例用例：

* 在时尚网站上，用户只对男士鞋子感兴趣——而不是女士连衣裙。
* 在新闻应用中，用户一直访问财经和体育文章——但从不关注娱乐或政治。

### 1. 定义您的主题分类

首先确定要跟踪的内容类别或主题。这些可能是：

* 广泛的垂直领域，如 `sports`、`finance` 或 `entertainment`
* 产品类型，如 `laptops`、`accessories` 或 `premium`
* 作者或品牌

<Note>
  - 从 3-8 个主题开始，保持管理简单。
  - 总体保持在 20 个主题以下，避免臃肿。
</Note>

### 2. 添加代码跟踪主题访问

下面的示例执行三件事：

* 跟踪每个页面或屏幕的一个或多个主题。
* 每次查看主题时增加访问计数。
* 每次查看时用更新的计数标记用户。

<CodeGroup>
  ```javascript JavaScript theme={null}
  const topics = ["sports", "entertainment"]; // One or many

  if (typeof localStorage !== "undefined" && Array.isArray(topics)) {
    topics.forEach(topic => {
      let count = parseInt(localStorage.getItem(topic), 10);
      count = isNaN(count) ? 1 : count + 1;
      localStorage.setItem(topic, count);
      OneSignal.User.addTag(topic, count.toString());
    });
  }
  ```

  ```kotlin Kotlin theme={null}
  val topics = listOf("sports", "entertainment") // One or many
  val sharedPrefs = context.getSharedPreferences("TopicPrefs", Context.MODE_PRIVATE)

  topics.forEach { topic ->
      val count = sharedPrefs.getInt(topic, 0) + 1
      sharedPrefs.edit().putInt(topic, count).apply()
      OneSignal.User.addTag(topic, count.toString())
  }
  ```

  ```swift Swift theme={null}
  let topics = ["sports", "entertainment"] // One or many
  let defaults = UserDefaults.standard

  for topic in topics {
      let count = defaults.integer(forKey: topic) + 1
      defaults.set(count, forKey: topic)
      OneSignal.User.addTag(key: topic, value: "\(count)")
  }
  ```
</CodeGroup>

### 3. 细分并发送个性化消息

一旦应用标签后，您可以使用以下方式定位用户：

* [细分](./segmentation)以构建基于规则的群组（例如 `gaming >= 3` 的用户）。
* [API 筛选器](/reference/create-message#filters)以在单个活动中动态包含用户。

示例用例：

* 仅当用户访问相关页面 5 次或以上时，才就特定主题向用户发送消息。
* 向阅读特定作者超过 3 篇文章的用户推广文章。
* 向不断返回特定产品类别的购物者提供折扣。

### 最佳实践

建议：

* 在启动活动之前，使用 `console.log()`（Web）或您平台的日志记录器测试标签逻辑。
* 在所有页面上使用一致的主题命名约定。
* 将主题列表保存在中央位置（配置文件或远程配置），以便无需修改每个页面即可调整。

避免：

* 使用长或过于具体的标签键（完整的文章标题、长 URL）。
* 超过 OneSignal 的[标签限制](https://onesignal.com/pricing)。
* 使用个人身份信息（PII）进行标记。

***

## 订阅时标记（一次性，仅限 Web）

使用上下文数据（例如订阅者订阅时所在的页面主题或 URL 路径）为网页推送订阅者添加标签，以提供有针对性的后续活动。此模式检测选择加入、应用标签并为滴灌式消息提供细分。

### 1. 在选择加入时标记用户

当用户订阅推送通知时，使用 [`PushSubscription` change 监听器](./web-sdk-reference#addeventlistener-push-subscription-changes)检测选择加入，并应用包含有关其正在查看的页面的上下文数据的标签。

```javascript theme={null}
function pushSubscriptionChangeListener(event) {
  if (event.current.optedIn && !event.previous.optedIn) {
    // User just opted in — tag with subscription context
    var pathSegment = window.location.pathname.split('/')[1] || 'home';
    var pageTopic = document.querySelector('meta[name="article-topic"]')?.content || 'general';

    OneSignal.User.addTags({
      subscription_page: pathSegment,
      subscription_page_topic: pageTopic,
    });
  }
}

OneSignalDeferred.push(function(OneSignal) {
  OneSignal.User.PushSubscription.addEventListener("change", pushSubscriptionChangeListener);
});
```

**工作原理：**

* 当用户的推送订阅状态发生变化时（选择加入、选择退出、令牌刷新），`change` 事件触发。
* 当用户有活跃订阅时，`event.current.optedIn` 为 `true`。检查 `!event.previous.optedIn` 确保标签仅在初始选择加入时应用，而不是每次状态变化时。
* `window.location.pathname.split('/')[1]` 将路径的第一个段捕获为订阅上下文。例如，如果 URL 是 `https://example.com/gaming/article-123`，则 `subscription_page` 标签设置为 `gaming`。
* `pageTopic` 从 `<meta>` 标签提取，回退到 `'general'`。根据您网站的元数据结构进行调整。

### 2. 按标签细分用户

一旦应用标签，使用[细分](./segmentation)或 [API 筛选器](/reference/create-message#filters)根据这些标签定位用户。例如：

* 向 `subscription_page` 为 `gaming` 的用户发送活动。
* 基于标签值和时机创建动态细分（例如，距首次会话的小时数）。

### 3. 自动化后续消息

构建滴灌式活动，根据用户订阅的时间和订阅的内容触发消息。

**示例：游戏订阅者滴灌活动**

| 细分名称     | 筛选器                                                               | 描述              |
| -------- | ----------------------------------------------------------------- | --------------- |
| Gaming 1 | `subscription_page` = `gaming` AND First Session > 2h AND \< 24h  | 订阅后 2–24 小时内联系。 |
| Gaming 2 | `subscription_page` = `gaming` AND First Session > 24h AND \< 48h | 1 天后跟进。         |
| Gaming 3 | `subscription_page` = `gaming` AND First Session > 72h AND \< 96h | 3 天后最终检查。       |

<Info>
  使用上限时间限制（`<`）以防止用户在消息窗口过去后仍停留在细分中。
</Info>

### 4. 将细分与消息模板结合

一旦创建了细分：

* 为活动的每个阶段构建[模板](./templates)（介绍、提醒、促销）。
* 使用[旅程](./journeys-overview)在用户进入适当的细分时发送这些消息。

示例消息想法：

* 邀请加入游戏社区或社交群组。
* 推荐与其主题相关的热门文章。
* 发送独家优惠或折扣码。

### 最佳实践

* 使用反映实际用户意图的有意义的标签名称和值。
* 尽可能从页面元数据动态提取标签值。
* 仅在初始选择加入时标记——上面的监听器示例检查 `!event.previous.optedIn` 以避免在每次状态变化时重新标记。

<Warning>
  不要在标签值中包含个人身份信息（PII），例如姓名或电子邮件地址。避免在整个网站中硬编码标签值——从页面上下文动态提取它们。
</Warning>

***

## 常见问题

### 我应该使用哪种模式？

使用**按页面主题标记**来构建随时间变化的行为兴趣画像。计数器随每次访问而增长，因此可以根据参与深度（`gaming >= 5`）调整细分。使用**订阅时标记**在选择加入时捕获单一时间点的归因，适用于来源感知的欢迎消息，您希望在用户拥有长访问历史之前就响应他们订阅的*位置*。两种模式可以在同一网站上并行运行——它们设置不同的标签并回答不同的问题。

### 如果用户清除浏览器数据，标签会持久化吗？

不会。在 Web 上清除浏览器数据会创建新的订阅，存储在 `localStorage` 中的每个主题计数器也会一起重置。如果用户重新订阅（手动或通过[自动重新订阅](./web-push-setup#auto-resubscribe)），`change` 监听器会再次触发并根据当前页面重新应用订阅标签，但访问计数器会从头开始。

### 我可以在初始订阅后更新标签吗？

可以。您可以随时调用 `OneSignal.User.addTag()` 或 `OneSignal.User.addTags()` 来添加或更新标签。订阅监听器对初始上下文很有用，但您也可以根据持续行为标记用户。

### 我应该使用这些模式而不是消息事件筛选器吗？

它们用于不同的目的。当您希望按**用户访问或订阅的页面**细分时，使用本页面上的模式——即源自您的网站或应用的信号。当您希望按**用户与哪些 OneSignal 消息交互**（已送达、已点击等）细分时，使用[消息事件筛选器](./segmentation#message-event-filters)。它们是互补的，而不是冗余的。

### 订阅来源模式在移动设备上有效吗？

不直接有效。`PushSubscription.addEventListener("change", ...)` API 是 Web 特定的。在 iOS 和 Android 上，您可以通过在选择加入流程内调用 `addTag` 来实现类似的归因——例如，在用户接受[权限提示](./permission-requests)后立即用他们所在的屏幕或功能标记他们。

***

## 相关页面

<Columns cols={2}>
  <Card title="标签" icon="tags" href="./add-user-data-tags">
    向用户添加自定义属性以进行个性化和细分。
  </Card>

  <Card title="细分" icon="users" href="./segmentation">
    按属性、标签和行为对用户进行分组，以进行有针对性的消息传递。
  </Card>

  <Card title="Web SDK 参考" icon="code" href="./web-sdk-reference">
    OneSignal Web SDK 的完整参考，包括订阅监听器和标签方法。
  </Card>

  <Card title="移动 SDK 参考" icon="mobile" href="./mobile-sdk-reference">
    OneSignal 移动 SDK 的完整参考，包括标签方法。
  </Card>

  <Card title="旅程" icon="route" href="./journeys-overview">
    构建由细分进入或自定义事件触发的多步骤消息工作流。
  </Card>
</Columns>
