Google Analytics из файла://url
У нас есть ajaxy тип html-приложения для платформы приложений и вы хотите, чтобы Google Analytics работал с ним. И я считаю, что мы правильно настроили все, чтобы вручную вызвать _trackPageview
там, где это необходимо.
Как бы то ни было, сообщения о них не сообщаются. Теперь либо у меня нет права работать, либо отслеживания GA с javascript с протоколом file://
на url, который молча нарушает некоторые правила междоменной политики, о которых я не знаю.
Так работает ли GA с локальным html через file://
? Или что-то не так с моим использованием ГА?
Обратите внимание, что используемая нами область фактически не существует. Мы хотим использовать что-то вроде отслеживания мобильных приложений, а скорее из JavaScript, а не из родной библиотеки. И для этого вам кажется, что вы настраиваете поддельный домен и сообщаете трекеру, какой домен он должен отчитываться как.
В конце моего <head>
:
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXACCOUNTID-XX']);
_gaq.push(['_setDomainName', 'myfake.domain.com']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = 'http://www.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
И в нашей структуре JS мы вызываем:
_gaq.push(['_trackPageview', '/some/path/here']);
Ответы
Ответ 1
Теперь Google поддерживает отключение проверки протокола, установив его в null, позволяя отслеживать аналитику с file://
url:
ga('create', 'UA-XXXXX-Y', 'auto');
ga('set', 'checkProtocolTask', null); // Disable file protocol checking.
ga('set', 'checkStorageTask', null); // Disable cookie storage checking.
ga('set', 'historyImportTask', null); // Disable history checking (requires reading from cookies).
ga('send', 'pageview');
Ответ 2
Хорошо, я думаю, что я решил это. Меня это устраивало на несколько дней.
Согласно Справочный центр Google Analytics,
Посетители должны иметь в своих браузерах JavaScript, изображения и файлы cookie, чтобы Google Analytics сообщала о своем посещении.
Здесь моя теория: в моих тестах на Mac OS X Snow Leopard документы, запускаемые из файла://не могут устанавливать файлы cookie. Это связано с тем, что файлы cookie являются собственностью HTTP, а когда вы запускаете что-то из файла://, вы не используете протокол HTTP.
Поскольку вы не можете устанавливать файлы cookie, ga.js отказывается отправлять запрос _utm.gif на серверы Google. Печеньки не устанавливаются; в Google не отправляется запрос, поэтому в GA ничего не регистрируется.
Решение. Используйте среду разработки, в которой вы можете установить свой домен как http://localhost (что-то вроде MAMP, если вы находитесь на Mac и нужен стек LAMP)
(Странная сноска: я заметил какое-то странное поведение, когда cookie GA установил сторонние файлы cookie домена несвязанного импортированного script из стороннего домена, отличного от CDN. Это может быть потому, что, поскольку сервер отправляет HTTP файлы cookie с файлом ga.js присоединяются к этому домену. Однако это не будет работать как бэкдор, поскольку он все равно не отправит клик _utm.gif на серверы Google).
========
EDIT:
Вы можете попробовать одну из различных работ, которые люди создали для отслеживания GA без файлов cookie.
Вы можете получить некоторый успех из этого инструмента: http://code.google.com/p/google-analytics-js/downloads/list, объясненный здесь: http://remysharp.com/2009/02/27/analytics-for-bookmarklets-injected-scripts/
Вместо всего этого кода GA вы должны включить script, а затем вызвать его, используя следующий код:
gaTrack('UA-XXXACCOUNTID-XX', 'myfake.domain.com', '/some/path/here');
Он предназначен для отслеживания букмарклетов/инъекций script, но если я вложу в файл://тип setup, его можно успешно отправить __utm.gif, что означает, что он ДОЛЖЕН успешно отслеживать в GA.
Недостатком является то, что cookieless означает, что он не сможет отслеживать посещения точно, просто данные уровня просмотра страницы.
Ответ 3
Завершается сложный отскок через iframe через механизм передачи сообщений с изменением размера.
Локальный файл включает iframe на нашем сервере. Когда мы хотим отслеживать вызов GA, мы меняем его URL-адрес с информацией, которую нам нужно #_trackEvent,foo,bar
, а затем изменяем ширину iframe. В iframe функция onresize()
запускается и позволяет нам отправлять вызовы GA, проверяя хэш.
Насколько я ненавижу этот хак, он работает безупречно!
Ответ 4
Необходима пара настроек:
Отключить хранилище файлов cookie
Cookies не могут использоваться, поскольку в домене нет домена, поэтому нам нужно предотвратить попытку использования GA.
Это делается установкой 'storage': 'none'
в конфигурации создания (документации).
Отключить проверку протокола файлов
По умолчанию GA прерывается, если протокол (в нашем случае file
) не http
или https
.
Отключите эту проверку, используя соответствующий task: ga('set', 'checkProtocolTask', null)
Установить активную страницу вручную
Поскольку домена нет, GA не может получить путь, обозначающий активную страницу.
Его можно настроить вручную, используя функцию изменения URL страницы: ga('set', 'page', 'foobar')
Затем ga('send', 'pageview')
будет отображаться в виде данных в виде посещения /foobar
.
Отслеживать идентификацию пользователя с помощью localStorage (необязательно)
Если отключены файлы cookie, пользователи не отслеживают загрузки страниц, поэтому каждое обновление будет инициировать обнаружение другого уникального посетителя.
Однако мы можем предоставить пользовательские идентификаторы клиентов для создания, установив 'clientId': localStorage.getItem(someKey)
, который ищет ранее сохраненные идентификаторы клиентов.
Сохранение идентификаторов выполняется с помощью
ga(function(tracker) {
localStorage.setItem(someKey, tracker.get('clientId'));
})
Все вместе
Объединяя все вышеописанные шаги, мы получим что-то вроде следующего:
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-XXXXXXXX-Y', {
'storage': 'none',
'clientId': localStorage.getItem('ga:clientId')
});
ga(function(tracker) {
localStorage.setItem('ga:clientId', tracker.get('clientId'));
});
ga('set', 'checkProtocolTask', null);
ga('set', 'page', 'myPage');
ga('send', 'pageview');
Ответ 5
Вместо изменения размера Iframe вы можете использовать событие onHashChange JS.
Единственным недостатком является то, что такой метод работает на IE8+. (без IE6, IE7). Он работает в остальных браузерах, включая iOS и Android.