本指南展示如何使用 Google Tag Manager (GTM) 加载和初始化 OneSignal Web SDK,然后在初始化后可选地设置 External ID 和 OneSignal 标签。
前提条件
- 支持 HTTPS 的网站。
- 您可以在 GTM 中为网站的容器发布更改。
- 您已完成 OneSignal Web SDK 设置流程,直到将代码添加到网站步骤。这将为您提供:
1. 设置您的 OneSignal Web 应用
按照 Web SDK 设置直到将代码添加到网站步骤。这是您获取 OneSignal App ID 的地方。
2. 创建 GTM 变量
为您在标签中引用的值创建 GTM 变量。这可以避免硬编码,并使您的设置更易于维护。
创建 ONESIGNAL_APP_ID 变量
- 在 GTM 中,转到 Variables > New。
- 选择 Constant。
- 将其命名为
ONESIGNAL_APP_ID
- 将值设置为您的 OneSignal App ID。
- 保存
现在您可以在 GTM 的任何地方使用 {{ ONESIGNAL_APP_ID }} 引用您的 App ID。
创建 ONESIGNAL_EXTERNAL_ID 变量(推荐)
如果您使用外部标识符关联用户(例如,来自数据库或身份验证系统的用户 ID),请使用此变量。
根据值在您网站上的可用方式选择变量类型。常用选项:
- Data Layer Variable(推荐)
- First-Party Cookie
- DOM Variable(高级)
3. 创建 OneSignal init 标签
- 在 GTM 中,转到 Tags > New
- 为标签命名:
OneSignal - Init
- Tag Type:Custom HTML
- 粘贴以下代码。
- 在 Advanced Settings > Tag firing options 下,设置 Once per page。
- 在 Triggering 下,选择 Initialization - All Pages。
<!--
OneSignal – 使用 Google Tag Manager 初始化 Web SDK
此代码片段:
- 加载 OneSignal Web SDK
- 使用您的 App ID 初始化 OneSignal
- 启用订阅铃铛 (notifyButton)
适用于大多数网站。
-->
<!-- 1. 加载 OneSignal Web SDK (v16) -->
<!-- 此脚本必须在您希望 OneSignal 可用的每个页面上加载 -->
<script
src="https://cdn.onesignal.com/sdks/web/v16/OneSignalSDK.page.js"
defer>
</script>
<script>
// 确保 GTM dataLayer 存在
// 此处仅用于可选地推送 "OneSignalInitialized" 事件
window.dataLayer = window.dataLayer || [];
// OneSignalDeferred 是一个队列,在 SDK 完全加载后运行
window.OneSignalDeferred = window.OneSignalDeferred || [];
// 2. SDK 就绪后初始化 OneSignal
window.OneSignalDeferred.push(function (OneSignal) {
OneSignal.init({
/*
必填
建议将 OneSignal App ID 设置为 GTM 变量。
您可以在 OneSignal 控制面板中找到:
Settings > Keys & IDs
*/
appId: "{{ONESIGNAL_APP_ID}}",
/*
可选 – 仅在您的 SERVICE WORKER 不在根目录时需要
如果您的 service worker 位于:
/OneSignalSDKWorker.js
…则不应设置 serviceWorkerPath 或 serviceWorkerParam。
仅在您的 service worker 位于子目录中时取消注释并更新以下选项
(例如:/push/onesignal/)。
*/
//serviceWorkerPath: "push/onesignal/OneSignalSDKWorker.js",
//serviceWorkerParam: { scope: "/push/onesignal/" },
/*
可选
启用 OneSignal 订阅铃铛 (notifyButton),
允许用户订阅或取消订阅通知。
更多提示选项请参见:https://documentation.onesignal.com/docs/en/permission-requests
*/
notifyButton: {
enable: true
}
})
.then(function () {
// OneSignal 初始化成功
console.log("[OneSignal] init success");
// 推荐:推送事件到 GTM 以触发其他标签
window.dataLayer.push({
event: "OneSignalInitialized"
});
})
.catch(function (e) {
// 初始化失败(无效 App ID、缺少 service worker 等)
console.log("[OneSignal] init failed", e);
});
});
</script>
4. 设置 External ID 和标签
设置 External ID 是可选的,但建议设置,因为它允许您跨设备识别用户并与您的后端同步。
将 ONESIGNAL_EXTERNAL_ID 推送到 dataLayer
此示例展示如何将用户 ID 推送到 dataLayer,以便 GTM 可以通过 ONESIGNAL_EXTERNAL_ID 变量(在步骤 2 中创建)读取它。
<script>
window.dataLayer = window.dataLayer || [];
// 从数据库或身份验证系统获取您的用户 ID。
// 确保这是一个字符串值。
var userId = "your_user_id_here";
dataLayer.push({
ONESIGNAL_EXTERNAL_ID: String(userId),
});
</script>
创建 GTM 标签以设置 External ID
标签配置:
- 标签名称:
OneSignal – Set External ID
- 标签类型:Custom HTML
- Tag firing options:Once per page
- Trigger:
- 创建
OneSignalInitialized 的自定义事件触发器(在上面的 OneSignal - Init 标签中设置),并且
- 可选地,如果您知道用户 ID 在页面加载时可用。
设置 External ID 的必需方法是 OneSignal.login(externalId),其中 externalId 是一个字符串。如果 {{ONESIGNAL_EXTERNAL_ID}} 为空(或 GTM 替换为 “undefined” / “null”),login 调用将被跳过,External ID 将不会被设置。这是一个常见的 GTM 时序问题。
<script>
// OneSignalDeferred 确保在 OneSignal SDK 就绪后运行
window.OneSignalDeferred = window.OneSignalDeferred || [];
window.OneSignalDeferred.push(function (OneSignal) {
/*
从 Google Tag Manager 读取 External ID。
这应该是一个 GTM 变量(Data Layer Variable 或 Custom JS Variable)。
*/
var externalId = "{{ONESIGNAL_EXTERNAL_ID}}";
console.log("[OneSignal] raw external ID from GTM:", externalId);
/*
基本验证:
- GTM 可能将 undefined/null 替换为字符串
- OneSignal.login 需要一个字符串
*/
if (!externalId || externalId === "undefined" || externalId === "null") {
console.log("[OneSignal] External ID missing, skipping login");
return;
}
// 确保 External ID 是一个干净的字符串
externalId = String(externalId).trim();
console.log("[OneSignal] Calling OneSignal.login with External ID:", externalId);
/*
使用 External ID 将用户登录到 OneSignal。
这将当前浏览器/设备链接到此用户。
*/
OneSignal.login(externalId)
.then(function () {
console.log("[OneSignal] External ID set successfully:", externalId);
})
.catch(function (e) {
console.log("[OneSignal] Failed to set External ID", e);
});
});
</script>
设置数据标签
此步骤使用 Web SDK 发送 OneSignal 用户标签。
标签配置:
- 名称:
OneSignal - Add Tags
- Tag Type:Custom HTML
- Tag firing options:Once per page
- Trigger:
OneSignalInitialized,以及
- 您的标签数据可用条件(例如:登录后、个人资料页面、购买后)。
粘贴此代码并替换示例标签 TAG 和 VALUE。
<script>
window.OneSignalDeferred = window.OneSignalDeferred || [];
window.OneSignalDeferred.push(function (OneSignal) {
OneSignal.User.addTags({
TAG_1: "VALUE_1",
TAG_2: "VALUE_2",
});
});
</script>
仅在有用户数据可用时发送标签(例如,登录后、加载个人资料后或已知转化事件后)。
Consent Mode 和隐私注意事项
如果您的网站使用 Consent Mode / CMP,请决定 OneSignal 应何时加载:
- 仅在同意后(欧盟/英国常见),或
- 立即(在默认允许”功能性”存储的地方常见)。
GTM 支持 Consent Initialization 触发器和标签级同意控制,以根据用户同意管理标签行为。但是,OneSignal 也提供隐私同意方法来控制 SDK 何时加载。
- 在 GTM 中,打开 Preview 模式。
- 加载您的网站并确认:
OneSignal - Init 触发一次。
OneSignalInitialized 出现在 GTM 事件时间线中(如果您保留了事件推送)。
- 订阅您的网站。有关提示详细信息,请参阅网页权限提示。
- 在 OneSignal 控制面板中,转到 Audience > Subscriptions 并确认:
- 选择加入后出现订阅。
- 如果设置了 External ID,则可见 External ID。
- 从 Messages > New Push 发送测试推送。
如果初始化正常工作,您将看到选择加入后 OneSignal 中出现订阅。
故障排除
-
Init 标签触发,但 SDK 从未加载
- 检查是否有 Content Security Policy (CSP) 阻止
https://cdn.onesignal.com。
- 检查广告拦截器/脚本拦截器。
-
dataLayer 错误
- 确保在任何
dataLayer.push() 调用之前设置 window.dataLayer = window.dataLayer || []。
-
重复提示 / 重复 SDK 加载
- 确保您没有通过网站代码、CMS 插件或另一个 GTM 标签加载 OneSignal。
-
Add Tags 运行但未出现在 OneSignal 中
- 确认 Trigger Group 等待
OneSignalInitialized。
- 确认您的用户操作触发器实际触发。
- 确认标签是有效的键/值对,并在计划限制内。
后续步骤