Wake Lock API 個案研究:BettyCrocker.com 上的購買意願指標提升了 300%

如果用行動裝置做菜,沒有什麼事比關閉螢幕更糟了 找到方案中的具體選項 瞭解烹飪網站 BettyCrocker.com 如何使用 Wake Lock API,避免發生這種情況。

近百年來,Betty Crocker 一直是美國的現代烹飪教學來源 以及可靠的食譜開發流程 1997 年上線,他們的網站 BettyCrocker.com 目前每月獲得超過 1,200 萬訪客。 實作 Wake Lock API 後, 指標 購買意願 相較於所有使用者,Wake Lock 使用者的比率大約高出 300%

已淘汰的 iOS 和 Android 應用程式

2014 年發行給龐大的粉絲群, Betty Crocker 最近將應用程式從 Apple App Store 和 Google Play 商店下架 降低優先順序後 長久以來,Betty Crocker 團隊一直都偏好在行動網站中加入新功能 而不是 iOS/Android 應用程式 建立 iOS/Android 應用程式時使用的技術平台過舊 而商家也沒有資源 ,方便日後更新及維護應用程式。 網路應用程式也逐漸擴大了流量 更現代、更容易強化

不過 iOS/Android 應用程式提供一項使用者喜愛的終止功能

千禧世代料理專家秘訣:@BettyCrocker 行動應用程式 閱讀食譜時不會變暗或鎖定 —@AvaBeilke

80% 的人在廚房使用裝置烹飪,但螢幕調暗及鎖定是一件問題。 @BettyCrocker 執行了什麼動作? 在使用者閱讀食譜時,將應用程式更新為「不要」調暗。 —@KatieTweedy

使用 Wake Lock API 透過網路使用終止功能

使用裝置做菜時再也不怕麻煩 螢幕關閉時,您就不必用弄髒的手或鼻子碰到螢幕。 Betty Crocker 思考如何導入 iOS/Android 應用程式的殺手功能 或前往網頁應用程式 也就是他們學到 Project Fugu Wake Lock API

一個人在掛滿麵粉的廚房餐桌上跪著沾麵

Wake Lock API 可讓您 例如變暗或鎖定螢幕 這項功能可提供全新體驗,但目前仍須使用 iOS/Android 應用程式才能使用。 Wake Lock API 可以減少重擊和可能飢餓的應對措施。

要求 Wake Lock

如要要求 Wake Lock,請呼叫 navigator.wakeLock.request() 方法 回應會傳回 WakeLockSentinel 物件的您將將此物件做為 sentinel value。 瀏覽器基於各種原因而拒絕要求 (例如因為電量過低), 因此,建議您將呼叫納入 try…catch 陳述式中。

釋出 Wake Lock

另外,您也需設法釋放 Wake Lock 方法是呼叫 WakeLockSentinel 物件的 release() 方法。 若您想要在特定時間過後自動解除 Wake Lock, 您可以使用 window.setTimeout() 呼叫 release(),如下方範例所示。

// 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);

實作方式

有了新的網頁應用程式,使用者應能輕鬆瀏覽食譜 完成步驟,甚至離開螢幕即可離開。 為達成這個目標,團隊首先建構了一個簡短的前端原型 做為概念驗證,並收集使用者體驗意見。

原型經證實有用後,他們設計了 Vue.js 元件 協助所有品牌分享 (BettyCrocker PillsburyTablespoon。 雖然只有 Betty Crocker 才有 iOS 和 Android 應用程式 三個網站都有共用程式碼集 因此他們只要實作一次元件 就能在任何地方部署元件 如下方螢幕截圖所示

BettyCrocker.com Wake Lock 切換按鈕
BettyCrocker.com Wake Lock 切換鈕。
,瞭解如何調查及移除這項存取權。
Pillsbury.com Wake Lock 切換鈕
Pillsbury.com Wake Lock 切換鈕。
,瞭解如何調查及移除這項存取權。
Tablespoon.com Wake Lock 切換鈕
Tablespoon.com Wake Lock 切換鈕。

根據新網站的現代化架構開發元件時, 都很注重 MVVM 模式的 ViewModel。 開發團隊也考量到互通性 以啟用網站的舊版和新架構功能。

為了追蹤可視度和可用性,Betty Crocker 整合 Analytics 追蹤功能 針對 Wake Lock 生命週期中的核心事件 團隊利用功能管理功能部署 Wake Lock 元件 一開始先將新版本發布至單一網站 並在監控使用情況和網頁健康狀態後,將這項功能部署至其餘網站。 並根據這個元件的使用情形,持續監控數據分析資料。

為了保護使用者,為確保使用者的安全,該團隊建立了強制逾時 以在閒置一小時後停用 Wake Lock。 最終實作 ,他們很快就要將網站上所有食譜頁面的切換按鈕設為開啟。 長期來看,他們希望能看到修改食譜的頁面檢視。

Wake Lock 容器

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');
      }
    },
  },
};

Wake Lock 元件

<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>

結果

Vue.js 元件已部署於所有三個網站,並帶來出色的結果。 從 2019 年 12 月 10 日到 2020 年 1 月 10 日的期間 BettyCrocker.com 回報的指標如下:

  • 在 Betty Crocker 中,擁有與 Wake Lock API 相容的瀏覽器的使用者中, 3.5% 的客戶立即啟用這項功能,是前 5 名的使用者。
  • 啟用 Wake Lock 的使用者工作階段持續時間為 3.1 倍 較沒有
  • 啟用 Wake Lock 的使用者跳出率降低 50% 而不是使用 Wake Lock 功能的使用者
  • 與所有使用者相比,Wake Lock 使用者的購買意願指標高出約 300%。

3.1 倍×

工作階段持續時間較長

50%

跳出率降低

300%

購買意願升幅指標

結論

Betty Crocker 使用 Wake Lock API 就獲得出色的成果。 你可以在網站上搜尋喜愛的食譜,自行測試這項功能 (BettyCrockerPillsburyTablespoon) ,然後啟用「防止螢幕關閉時螢幕切換」切換鈕。

食譜網站不會停止 Wake Lock 的用途。 其他例子包括需要保持螢幕開啟的登機證或票券應用程式 直到掃描條碼、持續顯示螢幕的資訊站應用程式 或網頁式簡報應用程式,可防止螢幕在簡報期間進入休眠狀態。

我們彙整了 Wake Lock API 的所有須知事項。 請參閱這個非常完整的文章 預祝閱讀愉快,愉快!

特別銘謝

人物踩著油、相片由 Julian Hochgesang Unsplash 頁面。