Cookie 和用户识别

为让 Google Analytics(分析)能够确定两个不同命中是否属于同一用户,必须将与特定用户关联的唯一标识符和每个命中一同发送。

analytics.js 库通过 Client-ID 字段来完成此任务,Client-ID 是随机生成的独一无二的字符串,生成后的 ID 存储在浏览器的 Cookie 中,这样用户再次访问同一网站时即可被识别。

默认情况下,analytics.js 使用一个名为 _ga 的第一方 Cookie 来存储该 Client-ID,但该 Cookie 的名称、网域和有效期均可自定义。analytics.js 创建的其他 Cookie 包括 _gidAMP_TOKEN_gac_<property-id>。这些 Cookie 存储用户的其他随机生成 ID 和广告系列信息。

analytics.js 能够借助 Cookie 跨浏览会话识别唯一身份用户,但无法跨浏览器或跨设备识别唯一身份用户。如果您的网站拥有自己的身份验证系统,则除了 Client-ID 之外,您还可以使用 User ID 功能,从而更准确地在用户用于访问您网站的所有设备上跨设备识别用户。

本指南介绍了如何自定义 Cookie 设置和如何设置 User ID 字段,以便更准确地跨会话衡量用户活动。

下表显示了 analytics.js 使用的默认 Cookie 字段值:

字段名称 值类型 默认值
cookieName text _ga
cookieDomain text 以下 JavaScript 表达式的结果:
document.location.hostname
cookieExpires integer 63072000(两年,以秒为单位)

要修改上述任何值,您可以在传递 create 命令的 fieldObject 中进行指定。例如:

ga('create', 'UA-XXXXX-Y', {
  'cookieName': 'gaCookie',
  'cookieDomain': 'blog.example.co.uk',
  'cookieExpires': 60 * 60 * 24 * 28  // Time in seconds.
});

由于 cookieDomain 是最常需要设置的 Cookie 字段,为方便起见,create 命令接受 字段作为可选的第三个参数:

ga('create', 'UA-XXXXX-Y', 'blog.example.co.uk');

推荐使用 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'

每次向 Google Analytics(分析)发送命中时,Cookie 有效期都会更新为当前时间加上 cookieExpires 字段的值。这意味着,如果您使用默认的 cookieExpires 时间(两年),而用户每个月都会访问您的网站,那么他们的 Cookie 永远都不会过期。

如果您将 cookieExpires 时间设置为 0(零)秒,Cookie 将变成基于会话的 Cookie,并在当前浏览器会话结束后马上过期:

您不应该直接访问 analytics.js 设置的 Cookie,因为 Cookie 格式以后可能会变更。正确做法是,开发者应该使用 readyCallback 等待 analytics.js 加载完成,然后获取存储在跟踪器上的 clientId 值。

ga(function(tracker) {
  var clientId = tracker.get('clientId');
});

停用 Cookie

在某些情况下,您可能希望使用自己的存储机制(例如 localStorageService 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,请按以下步骤操作:

  1. 提供您自己的用来代表每个已登录用户的永久性非个人身份字符串 ID,该 ID 必须是独一无二的。此 ID 通常由身份验证系统提供。
  2. 在跟踪器上设置 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(分析)可以在处理过程中将这些命中与正确的用户关联起来。