Studium przypadku dotyczące Wake Lock API: wzrost wskaźników zamiaru zakupu o 300% w witrynie BettyCrocker.com

Od niemal wieku Betty Crocker jest w Ameryce źródłem nowoczesnych instrukcji gotowania i sprawdzonych przepisów. Uruchomiona w 1997 r. strona BettyCrocker.com odnotowuje obecnie ponad 12 mln wizyt miesięcznie. Po wdrożeniu interfejsu Wake Lock API wskaźniki zamiaru zakupu były o około 300% wyższe w przypadku użytkowników korzystających z tego interfejsu niż w przypadku wszystkich użytkowników.

Wycofane aplikacje na iOS i Androida

W 2014 r. aplikacje Betty Crocker zostały wydane z wielkim rozmachem. Niedawno zostały usunięte z Apple App Store i Google Play Store, ponieważ przestały być priorytetem. Od dłuższego czasu zespół Betty Crocker woli dodawać nowe funkcje do strony mobilnej zamiast do aplikacji na iOS i Androida. Platforma techniczna, na której utworzono aplikacje na iOS i Androida, była przestarzała, a firma nie miała zasobów, aby aktualizować i utrzymywać te aplikacje w przyszłości. Aplikacja internetowa miała też obiektywnie większy ruch, była bardziej nowoczesna i łatwiejsza do ulepszenia.

Aplikacje na iOS i Androida miały jednak świetną funkcję, którą użytkownicy bardzo lubili:

Wskazówka dla młodych kucharzy: aplikacja mobilna @BettyCrocker nie przyciemnia się ani nie blokuje, gdy korzystasz z przepisu. –@AvaBeilke

80% osób gotuje z urządzeniem w kuchni, ale problemem jest przyciemnianie i blokowanie ekranu. Co zrobił/a @BettyCrocker? zaktualizowali aplikację, aby nie przyciemniała ekranu, gdy użytkownicy korzystają z przepisu. —@KatieTweedy

Wprowadzanie kluczowej funkcji do internetu za pomocą interfejsu Wake Lock API

Podczas gotowania z użyciem urządzenia nie ma nic bardziej frustrującego niż konieczność dotykania ekranu brudnymi rękami lub nawet nosem, gdy ekran się wyłączy. Zespół Betty Crocker zastanawiał się, jak przenieść kluczową funkcję aplikacji na iOS i Androida do aplikacji internetowej. Wtedy dowiedział się o Projekcie Fuguinterfejsie Wake Lock API.

Osoba ugniatająca ciasto na stole kuchennym pokrytym mąką

Interfejs Wake Lock API umożliwia zapobieganie przyciemnianiu lub blokowaniu ekranu urządzenia. Ta funkcja umożliwia korzystanie z nowych funkcji, które do tej pory wymagały aplikacji na iOS lub Androida. Interfejs Wake Lock API zmniejsza potrzebę stosowania nieeleganckich i potencjalnie energochłonnych obejść.

Wysyłanie prośby o blokadę uśpienia

Aby poprosić o blokadę wybudzania, musisz wywołać metodę navigator.wakeLock.request(), która zwraca obiekt WakeLockSentinel. Użyjesz tego obiektu jako wartości wartowniczej. Przeglądarka może odrzucić żądanie z różnych powodów (np. z powodu zbyt niskiego poziomu baterii), dlatego warto umieścić wywołanie w instrukcji try…catch.

Zwalnianie blokady uśpienia

Musisz też mieć możliwość zwalniania blokady wybudzania, co osiąga się przez wywołanie metody release() obiektu WakeLockSentinel. Jeśli chcesz automatycznie zwolnić blokadę wybudzania po upływie określonego czasu, możesz użyć window.setTimeout(), aby wywołać release(), jak pokazano w przykładzie poniżej.

// The wake lock sentinel.
let wakeLock = null;

// Function that attempts to request a wake lock.
const requestWakeLock = async () => {
  try {
    wakeLock = await navigator.wakeLock.request('screen');
    wakeLock.addEventListener('release', () => {
      console.log('Wake Lock was released');
    });
    console.log('Wake Lock is active');
  } catch (err) {
    console.error(`${err.name}, ${err.message}`);
  }
};

// Request a wake lock…
await requestWakeLock();
// …and release it again after 5s.
window.setTimeout(() => {
  wakeLock.release();
  wakeLock = null;
}, 5000);

Wdrożenie

Nowa aplikacja internetowa powinna umożliwiać użytkownikom łatwe poruszanie się po przepisie, wykonywanie poszczególnych kroków, a nawet odejście od urządzenia bez blokowania ekranu. Aby osiągnąć ten cel, zespół najpierw stworzył szybki prototyp interfejsu jako model koncepcyjny i aby zebrać opinie na temat UX.

Po tym, jak prototyp okazał się przydatny, zespół zaprojektował komponent Vue.js, który można było udostępniać wszystkim markom (BettyCrocker, PillsburyTablespoon). Mimo że tylko Betty Crocker miała aplikacje na iOS i Androida, wszystkie 3 witryny miały wspólną bazę kodu, dzięki czemu mogły wdrożyć komponent raz i rozmieścić go wszędzie, jak pokazano na zrzutach ekranu poniżej.

Przełącznik blokady uśpienia witryny BettyCrocker.com
Przełącznik blokady uśpienia BettyCrocker.com.
Przełącznik blokady uśpienia Pillsbury.com
Przełącznik blokady uśpienia na stronie Pillsbury.com.
Przełącznik blokady uśpienia Tablespoon.com
Przełącznik blokady uśpienia Tablespoon.com.

Podczas tworzenia komponentu na podstawie zmodernizowanych ram nowej witryny duży nacisk położono na ViewModel warstwę wzorca MVVM. Zespół programistów zadbał też o interoperacyjność, aby umożliwić działanie funkcji w starszych i nowych strukturach witryny.

Aby śledzić widoczność i użyteczność, Betty Crocker zintegrowała śledzenie analityczne podstawowych zdarzeń w cyklu życia blokady wybudzania. Zespół wykorzystał zarządzanie funkcjami, aby wdrożyć komponent blokady wybudzania w jednej witrynie na potrzeby wstępnego wdrożenia produkcyjnego, a następnie wdrożył tę funkcję w pozostałych witrynach po monitorowaniu wykorzystania i stanu strony. Nadal monitorują dane analityczne na podstawie korzystania z tego komponentu.

Aby zapewnić bezpieczeństwo użytkownikom, zespół utworzył wymuszone przekroczenie limitu czasu, które wyłącza blokadę wybudzania po godzinie bezczynności. Ostatecznie zdecydowali się na krótkoterminowe rozwiązanie w postaci przełącznika na wszystkich stronach z przepisami w swoich witrynach. W dłuższej perspektywie planują wprowadzić nowy widok strony z przepisem.

Kontener blokady wybudzania

var wakeLockControl = () => {
  return import(/* webpackChunkName: 'wakeLock' */ './wakeLock');
};

export default {
  components: {
    wakeLockControl: wakeLockControl,
  },
  data() {
    return {
      config: {},
      wakeLockComponent: '',
    };
  },
  methods: {
    init: function(config) {
      this.config = config || {};
      if ('wakeLock' in navigator && 'request' in navigator.wakeLock) {
        this.wakeLockComponent = 'wakeLockControl';
      } else {
        console.log('Browser not supported');
      }
    },
  },
};

Komponent blokady wybudzania

<template>
  <div class="wakeLock">
    <div class="textAbove"></div>
    <label class="switch" :aria-label="settingsInternal.textAbove">
      <input type="checkbox" @change="onChange()" v-model="isChecked">
      <span class="slider round"></span>
    </label>
  </div>
</template>

<script type="text/javascript">
  import debounce from 'lodash.debounce';

  const scrollDebounceMs = 1000;

  export default {
    props: {
      settings: { type: Object },
    },
    data() {
      return {
        settingsInternal: this.settings || {},
        isChecked: false,
        wakeLock: null,
        timerId: 0,
      };
    },
    created() {
      this.$_raiseAnalyticsEvent('Wake Lock Toggle Available');
    },
    methods: {
      onChange: function() {
        if (this.isChecked) {
          this.$_requestWakeLock();
        } else {
          this.$_releaseWakeLock();
        }
      },
      $_requestWakeLock: async function() {
        try {
          this.wakeLock = await navigator.wakeLock.request('screen');
          //Start new timer
          this.$_handleAbortTimer();
          //Only add event listeners after wake lock is successfully enabled
          document.addEventListener(
            'visibilitychange',
            this.$_handleVisibilityChange,
          );
          window.addEventListener(
            'scroll',
            debounce(this.$_handleAbortTimer, scrollDebounceMs),
          );
          this.$_raiseAnalyticsEvent('Wake Lock Toggle Enabled');
        } catch (e) {
          this.isChecked = false;
        }
      },
      $_releaseWakeLock: function() {
        try {
          this.wakeLock.release();
          this.wakeLock = null;
          //Clear timer
          this.$_handleAbortTimer();
          //Clean up event listeners
          document.removeEventListener(
            'visibilitychange',
            this.$_handleVisibilityChange,
          );
          window.removeEventListener(
            'scroll',
            debounce(this.$_handleAbortTimer, scrollDebounceMs),
          );
        } catch (e) {
          console.log(`Wake Lock Release Error: ${e.name}, ${e.message}`);
        }
      },
      $_handleAbortTimer: function() {
        //If there is an existing timer then clear it and set to zero
        if (this.timerId !== 0) {
          clearTimeout(this.timerId);
          this.timerId = 0;
        }
        //Start new timer; Will be triggered from toggle enabled or scroll event
        if (this.isChecked) {
          this.timerId = setTimeout(
            this.$_releaseWakeLock,
            this.settingsInternal.timeoutDurationMs,
          );
        }
      },
      $_handleVisibilityChange: function() {
        //Handle navigating away from page/tab
        if (this.isChecked) {
          this.$_releaseWakeLock();
          this.isChecked = false;
        }
      },
      $_raiseAnalyticsEvent: function(eventType) {
        let eventParams = {
          EventType: eventType,
          Position: window.location.pathname || '',
        };
        Analytics.raiseEvent(eventParams);
      },
    },
  };
</script>

Wyniki

Komponent Vue.js został wdrożony we wszystkich 3 witrynach i przyniósł świetne wyniki. W okresie od 10 grudnia 2019 r. do 10 stycznia 2020 r. witryna BettyCrocker.com odnotowała te dane:

  • Spośród wszystkich użytkowników Betty Crocker, którzy korzystali z przeglądarki zgodnej z interfejsem Wake Lock API, 3,5% osób od razu włączyło tę funkcję, co sprawiło, że znalazła się ona w pierwszej piątce najczęściej wykonywanych działań.
  • Sesja użytkowników, którzy włączyli blokadę wybudzania, była 3,1 raza dłuższa niż sesja użytkowników, którzy tego nie zrobili.
  • Współczynnik odrzuceń w przypadku użytkowników, którzy włączyli blokadę wybudzania, był o 50% niższy niż w przypadku użytkowników, którzy nie korzystali z tej funkcji.
  • Wskaźniki zamiaru zakupu były o około 300% wyższe w przypadku użytkowników blokady wybudzania niż w przypadku wszystkich użytkowników.

3,1×

Dłuższy czas trwania sesji

50%

Obniżanie współczynnika odrzuceń

300%

Wskaźniki większego zamiaru zakupu

Podsumowanie

Firma Betty Crocker osiągnęła fantastyczne wyniki dzięki interfejsowi Wake Lock API. Możesz przetestować tę funkcję, wyszukując ulubiony przepis w dowolnej z tych witryn (BettyCrocker, Pillsbury lub Tablespoon) i włączając przełącznik Zapobiegaj wygaszaniu ekranu podczas gotowania.

Przypadki użycia blokad wybudzania nie ograniczają się do witryn z przepisami. Inne przykłady to aplikacje z kartami pokładowymi lub biletami, które muszą utrzymywać włączony ekran, dopóki nie zostanie zeskanowany kod kreskowy, aplikacje w stylu kiosku, które utrzymują włączony ekran przez cały czas, lub aplikacje do prezentacji internetowych, które zapobiegają uśpieniu ekranu podczas prezentacji.

W tym artykule znajdziesz wszystko, co musisz wiedzieć o interfejsie Wake Lock API. Miłej lektury i udanego gotowania!