自定义模板政策

政策的实现是在网页上进行的。代码执行时,系统会将相关政策应用于跟踪代码管理器的自定义模板定义,以控制如何使用某些功能。在实现政策时,可使用 gtag('policy', ...) API。

gtag('policy', ...) API 需要 dataLayer 和 gtag() 的定义。所以,请确保先在您的代码中定义 dataLayergtag(),然后才能在脚本中调用 gtag('policy', ...)

window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}

使用网页上的 gtag('policy', ...) API 为自定义模板权限设置政策:

gtag('policy', <policy_type>, <function>)

<policy_type> 参数可以是任何一种获得支持的权限类型,例如 inject_script。只要容器希望检查是否允许该权限,就会调用该政策。

gtag('policy', 'inject_script', ...)

指定为 'all' 时,会响应所有的政策检查。

gtag('policy', 'all', ...)

第三个参数 <function> 是一个函数,它会使用如下签名实现所示的政策:

function(container, policy, data){...}
  • container 是跟踪代码管理器的容器 ID,例如 'GTM-1234'
  • policy 字符串用于指定要检查的政策的类型。
  • data 对象包含了所示政策类型的所有相关信息,例如 'url' 权限的 'send_pixel'

政策函数在返回 false 或引发异常时会拒绝权限请求。启用预览模式时,会在调试窗格的错误部分中显示任何 stringError 类型的异常。如果注册了多个政策检查,系统会调用每个检查,而每个检查均可拒绝政策请求。

下面的示例创建了一个检查 'inject_script' 权限的政策:

gtag('policy', 'inject_script', function (container, policy, data) {

  // reference the url of the script to be injected
  let url = data.url || '';

  // if the url of the injected script exactly matches, allow it.
  // otherwise throw an error
  if (url === 'https://scripts.example.com/analytics.js') {
    return true;
  } else {
    throw 'Only permitted to inject https://scripts.example.com/analytics.js';
  }
});

此示例使用 'all' 关键字检查多个政策方案:

gtag('policy', 'all', function(container, policy, data) {

  // Only set policy for 1 specific container.
  // This enables other containers loaded on the page to
  // operate without restrictions on permissions.
  if (container != 'GTM-4321') return true;

  // Since the policy is ‘all’, adjust permissions conditionally
  switch(policy) {

    case 'send_pixel':
      return true;

    case 'write_globals':
      return data.key && data.key == '_gaq';

    case 'inject_script':
      let url = data.url || '';
      if (url.indexOf('https://example.com') != 0)
        throw 'Only example.com scripts are permitted';

    default:
      // IT staff decides that all unknown permissions
      // are rejected.
      return false;
  }
});