为了让 Google Analytics(分析)能够判断两项不同的命中是否属于同一用户,必须将与该用户关联的唯一标识符与每项命中一同发送。
analytics.js 库通过 Client-ID 字段来完成此任务,Client-ID 是随机生成的独一无二的字符串,生成后即存储在浏览器的 Cookie 中,这样用户再次访问同一网站时即可被识别。
默认情况下,analytics.js 使用一个名为 _ga
的第一方 Cookie 来存储该 Client-ID,但该 Cookie 的名称、网域和有效期均可自定义。analytics.js 创建的其他 Cookie 包括 _gid
、AMP_TOKEN
和 _gac_<property-id>
。这些 Cookie 会存储为用户随机生成的其他 ID 以及与用户相关的广告系列信息。
analytics.js 能够借助 Cookie 跨浏览会话识别唯一身份用户,但无法跨浏览器或跨设备识别唯一身份用户。如果您的网站拥有自己的身份验证系统,则除了 Client-ID 之外,您还可以使用 User ID 功能,从而更准确地在用户用于访问您网站的所有设备上跨设备识别用户。
本指南介绍了如何自定义 Cookie 设置和如何设置 User ID 字段,以便更准确地跨会话衡量用户活动。
配置 Cookie 字段的设置
下表显示了 analytics.js 使用的默认 Cookie 字段值:
字段名称 | 值类型 | 默认值 |
---|---|---|
cookieName |
text | _ga |
cookieDomain |
text |
以下 JavaScript 表达式的结果:document.location.hostname
|
cookieExpires |
integer | 63072000 (两年,以秒为单位) |
cookieUpdate |
boolean |
true
|
cookieFlags |
text |
|
要修改上述任何值,您可以在向 create
命令传递的 fieldObject
中指定具体的值。例如:
ga('create', 'UA-XXXXX-Y', {
'cookieName': 'gaCookie',
'cookieDomain': 'blog.example.co.uk',
'cookieExpires': 60 * 60 * 24 * 28 // Time in seconds.
'cookieUpdate': 'false',
'cookieFlags': 'SameSite=None; Secure',
});
由于 cookieDomain
是最常需要设置的 Cookie 字段,为方便起见,create
命令接受 cookieDomain
字段作为可选的第三个参数:
ga('create', 'UA-XXXXX-Y', 'blog.example.co.uk');
Cookie 网域自动配置
推荐使用的 Google Analytics(分析)代码将 cookieDomain
字段设置为字符串 'auto'
:
ga('create', 'UA-XXXXX-Y', 'auto');
指定 'auto'
作为 cookieDomain
会启用 Cookie 网域自动配置,也就是指示 analytics.js 自动确定要使用的最佳 Cookie 网域。
启用 Cookie 网域自动配置后,analytics.js 会在它能够设置的最高一级网域上设置 _ga
Cookie。例如,如果您网站的网址为 blog.example.co.uk
,analytics.js 会将 Cookie 网域设置为 .example.co.uk
。此外,如果 analytics.js 检测到您在本地运行服务器(例如 localhost
),则会自动将 cookieDomain
设置为 'none'
。
Cookie 有效期
每次向 Google Analytics(分析)发送命中时,Cookie 有效期都会更新为当前时间加上 cookieExpires
字段的值。这意味着,如果您使用默认的 cookieExpires
时间(两年),而用户每个月都会访问您的网站,那么该用户的 Cookie 永远都不会过期。
如果您将 cookieExpires
时间设置为 0
(零)秒,Cookie 将变成基于会话的 Cookie,并在当前浏览器会话结束后马上过期:
Cookie 更新
当 cookieUpdate
设置为 true
(默认值)时,analytics.js 会在每次网页加载时更新 Cookie。这样一来,系统就会将 Cookie 有效期更新为以最近一次访问网站的时间为起点。例如,如果将 Cookie 有效期设置为 1 周,假使某位用户每 5 天使用同一浏览器访问一次网站,那么 Cookie 有效期在用户每次访问时都会更新,实际上将永远不会过期。
设置为 false
时,Cookie 不会在每次网页加载时更新。这样一来,Cookie 有效期会以用户首次访问网站的时间为起点。
Cookie 标记
如果设置了“Cookie 标记”值,则会在 Cookie 后追加额外的标记。各标记间必须用英文分号分隔。
从 Cookie 中获取 Client-ID
您不应该直接访问 analytics.js 设置的 Cookie,因为 Cookie 格式以后可能会变更。正确做法是,开发者应该使用 readyCallback
等待 analytics.js 加载完成,然后获取存储在跟踪器上的 clientId
值。
ga(function(tracker) { var clientId = tracker.get('clientId'); });
停用 Cookie
在某些情况下,您可能希望使用自己的存储机制(例如 localStorage
或 Service Worker)来跨会话存储 Client-ID,而不是使用 Cookie。为此,您可以将 storage
字段设置为 'none'
来禁止 analytics.js 设置 Cookie。
ga('create', 'UA-XXXXX-Y', { 'storage': 'none' });
如果您以自己的方式存储 clientId
字段,则需要确保在创建跟踪器时对 cliendId
字段进行设置。
ga('create', 'UA-XXXXX-Y', { 'storage': 'none', 'clientId': '76c24efd-ec42-492a-92df-c62cfd4540a3' });
要停用 _gac_<property-id>
Cookie,请在 create
命令中将 storeGac
字段设置为 false
:
ga('create', 'UA-XXXXX-Y', {
storeGac: false,
});
使用 localStorage 来存储 Client-ID
以下代码示例展示了如何修改 JavaScript 代码以便使用 localStorage
(而非 Cookie)来存储 Client-ID:
var GA_LOCAL_STORAGE_KEY = 'ga:clientId';
if (window.localStorage) {
ga('create', 'UA-XXXXX-Y', {
'storage': 'none',
'clientId': localStorage.getItem(GA_LOCAL_STORAGE_KEY)
});
ga(function(tracker) {
localStorage.setItem(GA_LOCAL_STORAGE_KEY, tracker.get('clientId'));
});
}
else {
ga('create', 'UA-XXXXX-Y', 'auto');
}
ga('send', 'pageview');
User-ID
借助 User-ID,您可以使用一个代表用户的持久性非个人身份 ID 字符串(该 ID 必须是独一无二的)来跨设备分析会话组。要了解为何应实现 User-ID,请参阅使用 User-ID 功能的优势。
要通过 analytics.js 实现 User-ID,请按以下步骤操作:
- 自行提供持久性的非个人身份字符串 ID 来表示每个已登录的用户,此 ID 必须是独一无二的。此 ID 通常由身份验证系统提供。
- 在跟踪器中设置 User-ID:
ga('create', 'UA-XXXXX-Y', 'auto', { userId: USER_ID }); ga('send', 'pageview');
网页加载后处理身份验证
如果构建的单页应用或其他动态网站会在初始网页加载后处理用户登录,那么在跟踪器上设置 User-ID 值的过程就不能发生在创建时。
在这种情况下,您可以使用 set
命令在获知该值后立即在跟踪器上进行设置。
// Creates the tracker and sends a pageview as normal // since the `userId` value is not yet known. ga('create', 'UA-XXXXX-Y', 'auto'); ga('send', 'pageview'); // At a later time, once the `userId` value is known, // sets the value on the tracker. ga('set', 'userId', USER_ID); // Setting the userId doesn't send data to Google Analytics. // You must also use a pageview or event to send the data. ga('send', 'event', 'authentication', 'user-id available');
如果使用此方法,在设置 userId
字段前发送的命中不会包含 User-ID 值。不过,通过会话统一过程,Google Analytics(分析)可以在处理时将这些命中与正确的用户关联起来。