为什么__tcfapi不能在CONSENT_DATA_READY上定义?

Why would __tcfapi not be defined on CONSENT_DATA_READY?

提问人:Nuno 提问时间:12/16/2022 最后编辑:Nuno 更新时间:12/26/2022 访问量:1778

问:

我拥有此代码多年,使用 Google Funding Choices 实施 TCFv2 cookie 同意。

    window.googlefc.callbackQueue.push({
        'CONSENT_DATA_READY': function () {
            /* __tcfapi is undefined!! */
            return __tcfapi('addEventListener', 2, function (tcData, success) {
                if (success
                    && tcData.gdprApplies
                    && (tcData.eventStatus === 'tcloaded' || tcData.eventStatus === 'useractioncomplete')
                    && tcData.purpose.consents[1]) {
                    ...
                }
            });
        }
    });

它在 99.99% 的时间内都有效,它看起来是这样。

但是,今天,我的一个 Chrome 配置文件似乎已经“损坏”了,因为每当触发此事件时,.CONSENT_DATA_READY__tcfapi is not defined

我尝试了很多事情,比如确保所有扩展程序都被禁用,关闭 Chrome 并重新打开它,只清除我域的 cookie 等,但没有任何效果。所有其他 Chrome 配置文件一直运行良好。

error in DevTools

我比较了两个 Chrome 配置文件(在同一网页上)之间的 DevTools 中的“源”选项卡,并且运行良好的配置文件加载了更多脚本并加载了 iframe(特定于 TCF 的 iframe)。

只有当我清除了所有 cookie(包括“google.com”范围的 cookie)时,这个问题才得到解决。

--

我刚刚发布了一段临时代码,用于检查该位置是否未定义并将其报告给服务器(此测试完成后,此用户数据将被完全删除),并且我看到我的一小部分用户现在遇到了这个问题。__tcfapi

编辑 12 月 18 日 - 到目前为止,报告了 181 个不同的欧洲用户。

--

我无法通过做一些研究找到任何解决方案。我在 Reddit 上发现有人(在评论中)遇到了与我相同的问题,他们通过删除事件来“解决”。报告问题的其他地方似乎是一个略有不同的错误,例如 ,这不是我遇到的问题。__tcfapi__tcfapi is not a function

--

这看起来像是 Google Funding Choices 的一个错误,但是有没有人知道如何“自动修复”这个问题,或者我能做些什么才能让这些用户停止收到此错误并按预期进行?

Cookies GDPR同意表单 Cookie同意 资金选择

评论


答:

0赞 Krokomot 12/23/2022 #1

铌:这是一次完整的重新编辑,以反映与提问者的讨论。


一些想法。

在错误 2.1a 上

我首先怀疑您的问题可能与错误 2.1a 相对应,您指出的 GFC 社区线程中的讨论也表明了这一点。建议的官方解决方案是先检查是否返回。getTCDataTCData.eventStatus = 'tcloaded'

这在其他情况下可能有效,但是您指出 - 并添加了相应的代码 - 您已经检查过,但是似乎甚至在创建该标志之前就发生了未定义的问题。tcloaded__tcfapi

再看看问题的根源

2020 年的 GFC 社区线程、TCFv2 标准化历史以及线程已被关闭的情况表明,该问题主要存在于 Google Funding Choices 中最终实现 TFCv2 之前。这与所描述的行为在以下方面违反 TCFv2 规范的事实相对应:

每个同意管理器都必须提供以下 API 函数:.该函数必须始终是一个函数,不能是任何其他类型,即使只是在初始化时暂时 - API 必须能够始终处理调用。__tcfapi(command, version, callback, parameter)__tcfapi

但是,仍然有一些较旧的实现在野外,这可能会在某些客户端上导致此问题,这并非没有道理。

有趣的是,您观察到您的一个 Chrome 配置文件以所述方式“损坏”,只有清除所有 cookie(包括“google.com”范围的 cookie)才能解决问题。

现在?

首先,检查一下会很有趣

  • 由有问题的客户端使用,以及tcfPolicyVersion
  • 暂时“损坏”的 Chrome 配置文件与其他工作配置文件之间的差异。

在官方网站上查看有关Publisher与IAB TCF v2.0集成的信息也没有什么坏处,以防隐藏一些我们目前忽略的有用宝石。

另一方面,随着时间的流逝,这个问题(可能很少见)很可能会自行解决

  • 所有客户端都已更新并支持 TCFv2 的最终实现,和/或
  • 受影响的用户要么有一天会自行删除所有 Google 域 Cookie,要么超时后会引入新的 Cookie。

似乎可以合理地假设,您当前的补丁 - 检查是否未定义 - 可能确实是一个(公平的)合适的修复程序,至少目前是这样。__tcfapi

评论

0赞 Nuno 12/23/2022
感谢您的回复。真的很感激。我已经检查了 ,但它是在用 创建的事件侦听器内部,因为 里面未定义,因此无法创建。因此,问题在于甚至可以检查该标志之前。tcData.eventStatus === 'tcloaded'__tcfapi('addEventListener', 2, function (tcData, success) {__tcfapi'CONSENT_DATA_READY': function () {
0赞 Krokomot 12/23/2022
也许您可以重写该函数,以便在有问题的行之前进行测试。线条多一点,但也许值得一试。当然,2号仍然存在,尽管在这种情况下你无能为力。tcloaded
0赞 Krokomot 12/23/2022
OKOK,我明白你的最后一点了。不得不考虑一下。如果我发现有用的东西,我会尝试更新。
0赞 Nuno 12/23/2022
我在上面的原始帖子中更新了代码。你会看到它只能在里面访问。我只是在做任何未定义的事情之前无法访问它。谢谢!日安。tcData__tcfapi
0赞 Krokomot 12/23/2022
奇怪的是,您的代码类似于官方 developers.google.com/funding-choices/ 上的方法......。出于调试原因,请尝试将添加事件侦听器的代码替换为引用中给出的代码。