Как добавить аналитику для Push-уведомлений

Я работаю над прогрессивным веб-приложением и хочу реализовать аналитику для push-уведомлений.

Как я могу добавить аналитику для push-уведомлений, чтобы я мог отслеживать и записывать, сколько людей нажали на уведомление и сколько людей закрыли это уведомление, не нажимая на него.




Ответы (3)


Я написал небольшой фрагмент кода для использования аналитики Google для аналитики, и он работает довольно хорошо.

Сброшенные заметки здесь: https://gauntface.com/blog/2016/05/01/push-debugging-analytics


То, как я это сделал, - это сообщение, упомянутое выше:

В сервис-воркере я импортирую файл javascript, который выполняет отслеживание за меня, устанавливаю идентификатор аналитики, а затем в соответствующих событиях вызываю отслеживание. Ищите self.analytics.trackEvent:

importScripts('./scripts/analytics.js');

self.analytics.trackingId = 'UA-77119321-2';

self.addEventListener('push', function(event) {
  let notificationTitle = 'Hello';
  const notificationOptions = {
    body: 'Thanks for sending this push msg.',
    icon: './images/icon-192x192.png',
    tag: 'simple-push-demo-notification'
  };

  // Important to trigger analytics asynchronously with logic
  // to show notification
  event.waitUntil(
    Promise.all([
      self.analytics.trackEvent('push-received'),
      self.registration.showNotification('Hello', notificationOptions)
    ])
  );
});

self.addEventListener('notificationclick', function(event) {
  event.notification.close();

  // Important to trigger analytics asynchronously with logic
  // to do other work (i.e. open window)
  event.waitUntil(
    Promise.all([
      self.analytics.trackEvent('notification-click'),
      clients.openWindow('https://gauntface.github.io/simple-push-demo/')
    ])
  );
});

Код для выполнения фактических вызовов отслеживания в протокол измерений Google Analytics показан ниже. API до боли упрощен, поэтому payloadData - это атрибуты, которых ожидает аналитика, и я генерирую строку этих параметров в формате, ожидаемом API, отфильтровывая пустые / нулевые значения:

class Analytics {
  trackEvent(eventAction, eventValue) {
    if (!this.trackingId) {
      console.error('You need to set a trackingId, for example:');
      console.error('self.analytics.trackingId = \'UA-XXXXXXXX-X\';');

      // We want this to be a safe method, so avoid throwing Unless
      // It's absolutely necessary.
      return Promise.resolve();
    }

    if (!eventAction && !eventValue) {
      console.warn('sendAnalyticsEvent() called with no eventAction or ' +
      'eventValue.');
      return Promise.resolve();
    }

    return self.registration.pushManager.getSubscription()
    .then(subscription => {
      if (subscription === null) {
        // The user has not subscribed yet.
        throw new Error('No subscription currently available.');
      }

      const payloadData = {
        // GA Version Number
        v: 1,
        // Client ID
        cid: subscription.endpoint,
        // Tracking ID
        tid: this.trackingId,
        // Hit Type
        t: 'event',
        // Data Source
        ds: 'serviceworker',
        // Event Category
        ec: 'serviceworker',
        // Event Action
        ea: eventAction,
        // Event Value
        ev: eventValue
      };

      const payloadString = Object.keys(payloadData)
      .filter(analyticsKey => {
        return payloadData[analyticsKey];
      })
      .map(analyticsKey => {
        return `${analyticsKey}=` +
          encodeURIComponent(payloadData[analyticsKey]);
      })
      .join('&');

      return fetch('https://www.google-analytics.com/collect', {
        method: 'post',
        body: payloadString
      });
    })
    .then(response => {
      if (!response.ok) {
        return response.text()
        .then(responseText => {
          throw new Error(
            `Bad response from Google Analytics ` +
            `[${response.status}] ${responseText}`);
        });
      }
    })
    .catch(err => {
      console.warn('Unable to send the analytics event', err);
    });
  }
}

if (typeof self !== 'undefined') {
  self.analytics = new Analytics();
}

Вы можете найти все это на: https://github.com/gauntface/simple-push-demo

person Matt Gaunt    schedule 26.05.2016
comment
очень полезные заметки .......... Спасибо, @gaunt face. еще одна вещь, которую я получаю активных пользователей по событию notification_click. могу ли я также получить отчет о том, сколько пользователей получили уведомление - person R C; 27.05.2016
comment
Да, просто добавьте еще одно событие в событие push - дополнит ответ некоторым образцом кода. - person Matt Gaunt; 27.05.2016
comment
@MattGaunt Есть ли способ отправлять аналитику для разных этапов для push-уведомлений mac safari .. заранее спасибо за любую помощь - person Mohamed Hussain; 07.07.2019
comment
Извините, что вы подразумеваете под разными этапами? Я также не в курсе событий safari push - вы имеете в виду веб-push работника службы или настраиваемые push-уведомления сафари? - person Matt Gaunt; 24.07.2019
comment
@MattGaunt: мы столкнулись с одной проблемой в GA, когда реализовали аналитику для push-уведомлений. Проблема в том, что ::: события регистрируются в GA через API-интерфейс сбора для получения, нажатия, закрытия событий push, notificationclick, notificationclosein sw.js ... затем на панели инструментов GA мы получили предупреждающее сообщение о том, что проверьте этот код отслеживания для свойства example.com отправляет обращение к просмотру страницы перед отправкой каких-либо событий, и мы перестали получать события push в GA через некоторое время ... связано ли это с предупреждением, которое мы получили на панели инструментов GA, как упомянуто здесь, или без попадания в сборку api - person Mohamed Hussain; 28.08.2019

Вариант, который я использую в моем плагине веб-push WordPress, заключается в добавлении аргумент запроса для URL-адресов, открытых с помощью уведомлений (см. этот код). Таким образом, вы можете узнать, сколько раз люди нажимают на уведомления.

О количестве людей, закрывающих уведомления, узнать, к сожалению, невозможно. Есть notificationclose событие, но оно запускается только для постоянных уведомлений.

person Marco Castelluccio    schedule 26.05.2016

На Pushpad URL-адрес уведомления представляет собой страницу перенаправления, которая отслеживает открытие, а затем перенаправляет на целевой URL-адрес. .

Например, если целевой URL-адрес http://example.com/target, ваш URL-адрес уведомления, который открывается при нажатии, должен быть http://example.com/redirect?url=/target.

На данный момент нет возможности отследить, когда уведомление закрыто.

Обновление (июнь 2016 г.): другие отмечали, что в спецификациях есть _ 3_ событие. Однако я не тестировал поддержку браузера (например, в настоящее время этого события нет в списке MDN). Кроме того, я опасаюсь, что это событие также может быть вызвано, когда пользователь щелкает уведомление (поскольку уведомление закрывается) - в спецификации об этом не говорится.

person collimarco    schedule 26.05.2016
comment
событие notificationclose (как упомянул Марко) позволяет отслеживать увольнение. - person Matt Gaunt; 10.06.2016
comment
@GauntFace Нет, посмотрите документацию MDN для Push API, например: в настоящее время (июнь 2016 г.) такого события нет. - person collimarco; 10.06.2016
comment
@GauntFace Вы правы! Однако я не знаю, поддерживается ли это браузерами прямо сейчас: вы пробовали это? - person collimarco; 10.06.2016
comment
@GauntFace Кроме того, я не знаю, означает ли событие close, что уведомление отклонено: возможно, оно также вызывается, когда пользователь щелкает уведомление и уведомление закрывается. Например, для совместимости с первыми версиями Chrome вы явно вызываете event.notification.close();, когда пользователь щелкает уведомление (и, возможно, это вызывает событие закрытия). - person collimarco; 10.06.2016
comment
Я приступил к тестированию, он работает в Chrome 51+, но я не верю, что какие-либо другие браузеры поддерживают это на данный момент. - person Matt Gaunt; 23.06.2016