Wake Lock API の事例紹介: BettyCrocker.com での購入意向インジケーターが 300% 増加

モバイル デバイスで料理するときに画面がオフになるほど悪いことはありません レシピステップの途中で発生しました 料理サイト BettyCrocker.com が Wake Lock API を使用してこの問題の発生を防いだ事例をご覧ください。

Betty Crocker は 100 年近くにわたりアメリカで現代の料理法を指導してきた 信頼性の高いレシピ開発です 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 アプリには、ユーザーに好評だった画期的な機能が 1 つありました。

ミレニアル世代向け料理の上級者向けヒント: @BettyCrocker モバイルアプリ レシピに従っていても、暗くなったり、ロックされたりしません。 - @AvaBeilke

80% の人がキッチンで調理器具を使って料理していますが、画面が暗くなり、ロックされることが問題になっています。 @BettyCrocker は何をしましたか? ユーザーがレシピを表示しているときに画面が暗くならないようにアプリを更新しました。 - @KatieTweedy

Wake Lock API でキラー機能をウェブに導入

デバイスを使った料理でストレスが軽減 画面がオフになったときに汚れた手や鼻で画面に触れる必要がなくなります Betty Crocker は、iOS/Android アプリのキラー機能を移植するにはどうすればよいかを自問しました。 ウェブアプリにデプロイできます その際に、 Project Fugu および Wake Lock API

小麦粉で覆われたキッチンテーブルの上で生地をこねている人

Wake Lock API は、Google Pixel への不正アクセスを 画面を暗くしたりロックしたりしないように設定できます。 この機能により、これまで iOS/Android アプリが必要だった新しいエクスペリエンスが実現します。 Wake Lock API は、ハッキングや電力を大量に消費する可能性のある回避策の必要性を減らします。

wake lock のリクエスト

wake lock をリクエストするには、navigator.wakeLock.request() メソッドを呼び出す必要があります WakeLockSentinel オブジェクトを返します。このオブジェクトは、Cloud Storage バケットを 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);

実装

新しいウェブアプリでは、ユーザーが簡単にレシピ内を移動できるようにする必要があります。 手順を完了したり、画面ロックなしで閉じたりすることもできます。 この目標を達成するため、チームはまず簡単なフロントエンドのプロトタイプを構築しました。 UX の意見を集めました

このプロトタイプが有用であることが証明された後、 Vue.js コンポーネント すべてのブランド(BettyCrockerPillsburyTablespoon など)。 iOS アプリと Android アプリを持っているのは Betty Crocker だけですが、 3 つのサイトは共通のコードベースを持ち コンポーネントを一度実装すれば どこにでもデプロイできます 次のスクリーンショットに示すとおりです

<ph type="x-smartling-placeholder">
</ph> BettyCrocker.com ウェイクロックの切り替え
BettyCrocker.com の wake lock の切り替え。
で確認できます。 <ph type="x-smartling-placeholder">
</ph> Pillsbury.com の wake lock の切り替え
Pillsbury.com の wake lock の切り替え
で確認できます。 <ph type="x-smartling-placeholder">
</ph> Tablespoon.com の wake lock の切り替え
Tablespoon.com の wake lock の切り替え

新しいサイトのモダナイズされたフレームワークに基づいてコンポーネントを開発する場合、 焦点を当てている MVVM パターンの ViewModel レイヤ。 チームは相互運用性も念頭に置いて サイトの新旧両方のフレームワークで機能を有効化します。

Betty Crocker は、視認性とユーザビリティを追跡するために、分析トラッキングを統合しました。 wake lock のライフサイクルのコアイベントに対しても効果的です。 チームは機能管理を利用して wake lock コンポーネントをデプロイ 1 つのサイトにまとめて公開したり、 そして、利用状況とページの状態をモニタリングした後、その機能を他のサイトにデプロイしました。 このコンポーネントの使用状況に基づいて、引き続き分析データをモニタリングします。

ユーザーのフェイルセーフとして、チームは強制タイムアウトを アクティブでない状態が 1 時間続くと 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 コンポーネントは 3 つのサイトすべてにデプロイされ、優れた成果をもたらしました。 2019 年 12 月 10 日から 2020 年 1 月 10 日まで、 BettyCrocker.com は、次の指標を報告しました。

  • Wake Lock API と互換性のあるブラウザを使用しているすべての Betty Crocker ユーザーのうち、 そのうち 3.5% が直ちにこの機能を有効にし、上位 5 項目となっています。
  • wake lock を有効にしたユーザーのセッション継続時間は 3.1 倍でした 向上します
  • wake lock を有効にしたユーザーの直帰率は 50% 低下 wake lock 機能を使用していないユーザーよりも高くなります。
  • wake lock を利用しているユーザーは、すべてのユーザーと比較して、購入意向の指標が約 300% 高くなっています。

3.1×

セッション継続時間が長い

50%

直帰率の低下

300%

購入意向の上昇を示す指標

まとめ

Betty Crocker は、Wake Lock API を使用して素晴らしい結果を出しました。 各サイトでお気に入りのレシピを検索して、自分で機能を試すことができます (BettyCrocker、 「Pillsbury」、「Tablespoon」など) また、[料理中に画面が暗くなるのを防ぐ] の切り替えボタンをオンにします。

wake lock のユースケースはレシピサイトにとどまりません。 他にも、画面をオンのままにする必要がある搭乗券やチケットアプリなどがあります。 バーコードのスキャンが完了するまでの間 画面が常にオンになっているキオスクスタイルのアプリ またはウェブベースのプレゼンテーション アプリを使用して、プレゼンテーション中に画面がスリープ状態にならないようにします。

Wake Lock API について知っておくべきことをすべてまとめました 詳しくはこちらのサイトをご覧ください 読書と料理をお楽しみください!

謝辞

生地をこねる人の写真提供: Julian Hochgesang Unsplash より