Почему __tcfapi не может быть определен на CONSENT_DATA_READY?
У меня есть этот код в течение многих лет, когда я реализую согласие на использование файлов cookie TCFv2 с помощью Google Funding Choices.
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 все время работали хорошо.
Я сравнил вкладку «Источники» в DevTools между двумя профилями Chrome (на одной и той же веб-странице), и тот, который работал хорошо, имел еще несколько загруженных скриптов и загруженных фреймов (iframes, специфичные для TCF).
Только когда я очистил все файлы cookie (включая файлы cookie с областью действия «google.com»), эта проблема была исправлена.
--
Я только что выпустил временный фрагмент кода, который проверяет, не определено ли это место в этом месте, и сообщает об этом на сервер (эти пользовательские данные будут полностью удалены, как только этот тест будет завершен), и я вижу, что небольшое подмножество мои пользователи имеют эту проблему прямо сейчас.
РЕДАКТИРОВАТЬ 18 декабря - на данный момент сообщил 181 отдельный европейский пользователь.
--
Я не могу найти какое-либо решение, проведя некоторые исследования. Я нашел кого-то на Reddit (в комментариях), у которого была та же проблема, что и у меня, и они «решили», просто удалив событие. Другие места , которые сообщают о проблемах с__tcfapi
похоже, это немного другая ошибка, например__tcfapi is not a function
, это не проблема, с которой я сталкиваюсь.
--
Похоже, это ошибка Google Funding Choices, но есть ли у кого-нибудь идеи, как «автоматически исправить» это или что я могу сделать, чтобы эти пользователи перестали получать эту ошибку и продолжали действовать, как ожидалось?
1 ответ
NB: Это полная переработка, чтобы отразить дискуссию с автором вопроса.
Некоторые мысли.
Об ошибке 2.1а
Сначала я заподозрил, что ваша проблема может соответствовать ошибке 2.1a, на что также указывает обсуждение в на которую вы указали. Предлагаемое официальное решение состояло бы в том, чтобы проверить,getTCData
возвращаетсяTCData.eventStatus = 'tcloaded'
первый.
Это может работать в других случаях, однако вы указали и добавили соответствующий код, который вы уже проверили.tcloaded
но проблема с неопределенным, кажется, возникает еще до того, как этот флаг будет создан.
Другой взгляд на происхождение проблемы
Ветка ветке сообщества GFC,сообщества GFC от 2020 года, история стандартизации TCFv2 и тот факт, что ветка была закрыта, указывают на то, что проблема в основном существовала до окончательного внедрения TFCv2 в Google Funding Choices. Это соответствует тому факту, что описанное поведение нарушает Спецификацию TCFv2 в следующем:
Каждый диспетчер согласия ДОЛЖЕН предоставлять следующую функцию API:
__tcfapi(command, version, callback, parameter)
. Функция всегда должна быть функцией и не может быть любого другого типа, даже если только временно при инициализации — API должен иметь возможность обрабатывать вызовы в любое время.
Однако вполне разумно, что в дикой природе все еще существуют более старые реализации, которые могут вызывать эту проблему на некоторых клиентах.
Что интересно, вы заметили, что на вашей стороне один из ваших профилей Chrome "сломан" описанным способом и только очистка всех куков, в т.ч. с областью действия "google.com" проблема устранена.
И сейчас?
Сначала было бы интересно проверить
- в
tcfPolicyVersion
используемые проблемными клиентами, и - отличия временно «сломанного» профиля Chrome от других, рабочих.
Также не помешает заглянуть на официальный сайт, посвященный интеграции Publisher с IAB TCF v2.0, на случай, если спрятан какой-то полезный драгоценный камень, который мы в настоящее время упускаем из виду.
С другой стороны, вполне может быть, что эта — вероятно, редкая — проблема разрешится сама собой со временем, когда
- все клиенты обновлены и поддерживают окончательную реализацию TCFv2 и/или
- ваши затронутые пользователи либо когда-нибудь сами удалят все свои файлы cookie, принадлежащие домену Google, либо время ожидания истечет, и будут введены новые файлы cookie.
Кажется разумным предположить, что ваш текущий патч -- для проверки__tcfapi
is undefined - может быть действительно (справедливым) подходящим решением, по крайней мере, на данный момент.