当我的应用程序加载到跨域 iframe 中时,为什么 Google Analytics 不发送点击?

Why doesn't Google Analytics send hits when my app is loaded in a cross-domain iframe?

我有一个基本的静态/单页应用程序,我添加了 Google Analytics 4 (GA4) 以使用 gtag。当我通过 http://localhost:8080 在本地加载我的应用程序时,页面浏览量按预期进行跟踪。但是,当我在 iframe 中通过应用嵌入另一个网站时,没有发送任何点击。

为了对此进行调试,我查看了 Chrome 网络检查器中的网络请求。当我直接在 http://localhost:8080 打开我的应用程序时,我可以看到对 https://analytics.google.com/g/collect?.. 的请求。在网络请求中。但是,当我在 iframe 中加载我的应用程序时(例如,我将 <iframe src="http://localhost:8080"></iframe> 添加到另一个页面),我注意到没有发送此请求。我还确认在实时视图的 Google Analytics 中没有显示任何数据,即使我可以看到 gtag 加载的 JavaScript。

我还在 https://tagassistant.google.com/ 上使用 Tag Assistant 进行了调试。即使当我在 iframe 中连接到我的应用程序 运行 时,调试器也会显示所有事件都按预期注册,但在发送的点击数下,它会显示“此容器未发送任何点击数”。

为什么在 iframe 中加载应用程序时,相同跟踪代码的行为会有所不同?如何确保始终发送点击?

更新:这似乎与 cookie 在跨域 iframe 中不可用有关,但有解决方法吗?

默认情况下,由于SameSite cookie setting enforcement,跟踪失败。默认情况下,cookie 在第三方上下文中不可用,这包括来自不同域的 iframe。

通过使用 cookie_flags config (docs),您可以允许从第三方上下文读取 cookie。会有一些注意事项,这会因浏览器而异,因为隐私限制不断增加。

但是,目前,只要您的站点是安全的,在 gtag 配置中设置 cookie_flags 就可以解决问题:

gtag('config', '<MEASUREMENT_ID>', {
  cookie_flags: 'SameSite=None;Secure'
})

请注意,这实际上不适用于 http://localhost:8080,因为它不安全,但一旦站点部署到生产环境,希望您能使用 https。