Web Audio وسياسة التشغيل التلقائي والألعاب

توم غرينواي
هونغ تشان تشوي

في أيلول (سبتمبر) 2017، أعلنّا عن تغيير قادم بشأن كيفية التعامل مع الصوت في سياسة سلوك التشغيل التلقائي في Chrome. تم إصدار تغيير السياسة على إصدار Chrome 66 الثابت في أيار (مايو) 2018.

بعد الحصول على ملاحظات وآراء من منتدى تطوير Web Audio، أجّلنا إصدار جزء Web Audio من سياسة التشغيل التلقائي لمنح المطوّرين وقتًا إضافيًا لتعديل مواقعهم الإلكترونية. لقد أجرينا أيضًا بعض التغييرات على تنفيذ سياسة Web Audio من شأنها تقليل عدد المواقع الإلكترونية التي تحتاج إلى تعديل الرموز، وخاصة ألعاب الويب، ومن ثمَّ توفير تجربة أفضل للمستخدمين.

من المقرر طرح هذا التغيير في السياسة الآن على Chrome 71 في كانون الأول (ديسمبر) 2018.

ما الوظيفة المحددة من تغيير السياسة؟

التشغيل التلقائي هو الاسم الذي يتم منحه لجزء من المحتوى يتم تشغيله مباشرةً عند تحميل صفحة ويب. بالنسبة إلى المواقع الإلكترونية التي يُفترض أن تتمكّن من تشغيل المحتوى الخاص بها تلقائيًا، سيؤدي هذا التغيير إلى منع التشغيل تلقائيًا. في معظم الحالات، سيتم استئناف التشغيل ولكن في حالات أخرى، يجب إجراء تعديل بسيط على الرمز. على وجه التحديد، على المطوّرين إضافة رمز برمجي يستأنف المحتوى الخاص بهم إذا تفاعل المستخدم مع صفحة الويب.

ومع ذلك، إذا وصل المستخدم إلى صفحة ذات محتوى تلقائي وانتقال إلى تلك الصفحة من الصفحة من المصدر نفسه، لن يتم حظر هذا المحتوى أبدًا. يمكنك قراءة مشاركة المدونة السابقة حول سياسة التشغيل التلقائي للحصول على أمثلة أكثر تفصيلاً.

بالإضافة إلى ذلك، أضفنا دليلاً للتعلم من السلوك السابق للمستخدمين في ما يتعلق بمواقع الويب التي تشغّل الصوت تلقائيًا. نرصد الحالات التي يسمح فيها المستخدمون بتشغيل الصوت بشكلٍ منتظم لأكثر من 7 ثوانٍ خلال معظم زياراتهم إلى أحد المواقع الإلكترونية، ونفعّل ميزة التشغيل التلقائي لهذا الموقع الإلكتروني.

ونفعل ذلك من خلال فهرس يتم تخزينه محليًا لكل ملف شخصي في Chrome على أحد الأجهزة، ولا تتم مزامنته على الأجهزة بل تتم مشاركته فقط كجزء من إحصاءات المستخدمين المخفية الهوية. ونُطلق على هذا الفهرس اسم "مؤشر التفاعل الإعلاني" (MEI)، ويمكنك الاطّلاع عليه من خلال chrome://media-engagement.

يتتبّع MEI عدد الزيارات إلى الموقع الإلكتروني التي تتضمّن تشغيل صوت تزيد مدته عن 7 ثوانٍ. بالاستناد إلى MEI الخاص بالمستخدم، يمكننا فهم ما إذا كان يتوقّع المستخدم سماع صوت من موقع إلكتروني معيّن أم لا، فضلاً عن توقّع نيّة المستخدم في المستقبل.

إذا كان المستخدم غالبًا ما يسمح لنطاق موقع الويب بتشغيل الصوت لأكثر من 7 ثوانٍ، في هذه الحالة نفترض في المستقبل أن المستخدم يتوقع أن يكون لهذا الموقع الإلكتروني الحق في تشغيل الصوت تلقائيًا. ولذلك، نمنح هذا الموقع الإلكتروني الحق في تشغيل الصوت تلقائيًا بدون اشتراط أن يتفاعل المستخدم مع علامة تبويب من هذا النطاق.

ومع ذلك، لا يمكن ضمان هذا الحق إلى أجل غير مسمى. في حال تغيّر سلوك المستخدم، مثل إيقاف تشغيل الصوت أو إغلاق علامة التبويب في حدود 7 ثوانٍ على مدار عدّة زيارات، ستتم إزالة حق الموقع الإلكتروني في التشغيل التلقائي.

سيساهم استخدام عناصر HTML الخاصة بالوسائط (الفيديو والصوت) وWeb Audio (كائنات AudioContext في JavaScript) في MEI. في إطار الاستعداد لطرح سلوك المستخدم في ما يتعلق بسياسة Web Audio، سنبدأ في المساهمة في MEI بدءًا من الإصدار 70 من Chrome والإصدارات الأحدث. سيضمن ذلك قدرتنا على توقّع النية التي يريدها المستخدم في ما يتعلّق بالتشغيل التلقائي والمواقع الإلكترونية التي يزورها عادةً.

تجدر الإشارة إلى أنّ إطارات iframe لا يمكنها الحصول على الحق في التشغيل التلقائي بدون تفاعل المستخدم إلا إذا كانت صفحة الويب الرئيسية التي تضمّن إطار iframe تعمل على توسيع ذلك مباشرةً إلى إطار iframe المعنيّ.

تأخير التغيير لدعم المجتمع

لقد لاحظ منتدى مطورّي برامج Web Audio، خاصةً مطوّر ألعاب الويب ومطوّري برامج WebRTC، أنّ هذا التغيير قد ظهر في قناة Chrome الثابتة.

كانت ملاحظات المنتدى أنّ العديد من ألعاب الويب والتجارب الصوتية على الويب ستتأثر سلبًا بهذا التغيير، وبشكل خاص العديد من المواقع الإلكترونية التي لم يتم تحديثها لن يعود بإمكان المستخدمين تشغيل الصوت. نتيجةً لذلك، قرّر فريقنا تأجيل إجراء هذا التغيير لمنح مطوّري البرامج الصوتية على الويب مزيدًا من الوقت لتحديث مواقعهم الإلكترونية.

علاوةً على ذلك، أخذنا هذا الوقت في:

  • عليك التفكير مليًا في ما إذا كان تغيير السياسة هذا هو أفضل إجراء يجب اتخاذه أم لا.
  • يُرجى الاطّلاع على الطرق التي يمكننا من خلالها تقليل عدد المواقع الإلكترونية التي تعرض محتوًى صوتيًا سيتأثر بذلك.

بالنسبة إلى الإصدار السابق، قرّرنا في النهاية أن تغيير السياسة ضروري فعلاً لتحسين تجربة المستخدم لمعظم المستخدمين. يمكن قراءة المزيد من التفاصيل حول المشكلة التي يحلها تغيير السياسة في القسم التالي من هذه المقالة.

في ما يتعلق بالخيار الثاني، أجرينا تعديلاً على تطبيق Web Audio، ما سيؤدي إلى تقليل عدد المواقع الإلكترونية التي تأثرت في الأصل. ومن بين المواقع التي كنا نعرف أنها تعطلت بسبب هذا التغيير، وقد تم تقديم العديد منها كأمثلة من قِبل منتدى تطوير ألعاب الويب، وكان هذا التعديل يعني أن أكثر من 80% منها سيعمل تلقائيًا. يمكن الاطّلاع على تحليل واختبار لأمثلة المواقع الإلكترونية هذه هنا. في ما يلي شرح أكثر تفصيلاً لهذه التسوية الجديدة.

أجرينا أيضًا تغييرًا لإتاحة تطبيقات WebRTC، وسيُسمح باستخدام ميزة التشغيل التلقائي في حال كانت هناك جلسة تسجيل نشطة.

ما المشكلة التي يهدف هذا التغيير السلوكي إلى حلها؟

سابقًا، كانت المتصفحات ضعيفًا في مساعدة المستخدم في إدارة الصوت. عندما يفتح المستخدمون صفحة ويب ويتلقىون صوتًا لم يتوقعوه أو لا يريدونه، فإنهم يتركون انطباعًا سيئًا لدى المستخدم. وتمثّل تجربة المستخدم السيئة هذه المشكلة التي نحاول حلها. الضوضاء غير المرغوب فيها هي السبب الرئيسي الذي يجعل المستخدمين لا يريدون تشغيل المتصفح تلقائيًا للمحتوى.

ومع ذلك، قد يرغب المستخدمون أحيانًا في تشغيل المحتوى تلقائيًا، وبعد ذلك يشغّل المستخدم عددًا كبيرًا من عمليات التشغيل التلقائي المحظورة في Chrome.

لذلك، نعتقد أنّه من خلال التعلّم من المستخدم وتوقُّع هدفه على أساس كل موقع إلكتروني، يمكننا تقديم أفضل تجربة للمستخدم. إذا كان المستخدمون يميلون إلى السماح بتشغيل محتوى من موقع إلكتروني، سنُشغّل محتوى هذا الموقع تلقائيًا في المستقبل. وبالعكس، إذا كان المستخدمون يميلون إلى إيقاف التشغيل التلقائي للمحتوى من موقع إلكتروني معيّن، سنمنع تلقائيًا هذا المحتوى.

من بين الاقتراحات التي قدّمها المنتدى، كتم صوت علامة تبويب بدلاً من إيقاف التشغيل التلقائي مؤقتًا. ومع ذلك، نرى أنّه من الأفضل إيقاف تجربة التشغيل التلقائي حتى يدرك الموقع الإلكتروني أنّه قد تم حظر هذه الميزة، ما يسمح لمطوِّر الموقع الإلكتروني بالتفاعل مع هذه المشكلة. على سبيل المثال، قد يرغب بعض المطوّرين في كتم الصوت ببساطة، في حين قد يفضّل البعض الآخر إيقاف المحتوى الصوتي مؤقتًا إلى أن يتفاعل المستخدم بشكل نشط مع المحتوى، وإلا قد يفوت المستخدم جزءًا من تجربة الصوت.

تعديلات جديدة لمساعدة مطوّري ألعاب الويب

تتمثل الطريقة الأكثر شيوعًا لاستخدام واجهة برمجة تطبيقات Web Audio API في إنشاء نوعين من الكائنات لتشغيل الصوت:

سيقوم مطوّرو البرامج الصوتية على الويب بإنشاء AudioContext لتشغيل الصوت. لاستئناف الصوت بعد أن تقوم سياسة التشغيل التلقائي بتعليق AudioContext تلقائيًا، يجب عليه استدعاء الدالة resume() في هذا الكائن بعد تفاعل المستخدم مع علامة التبويب:

    const context = new AudioContext();

    // Setup an audio graph with AudioNodes and schedule playback.
    ...

    // Resume AudioContext playback when user clicks a button on the page.
    document.querySelector('button').addEventListener('click', function() {
      context.resume().then(() => {
        console.log('AudioContext playback resumed successfully');
      });
    });

هناك العديد من الواجهات التي تكتسبها من AudioNode، وإحدى هذه الواجهات هي واجهة AudioScheduledSourceNode. يُشار عادةً إلى العُقد التي تنفِّذ واجهة AudioVODSourceNode باسم عُقد المصدر (مثل AudioBufferSourceNode وConstantSourceNode وOscillatorNode). تنفِّذ العُقد المصدر طريقة start().

تمثّل عُقد المصدر عادةً مقتطفات صوتية فردية يتم تشغيلها في الألعاب، على سبيل المثال، الصوت الذي يتم تشغيله عندما يجمع اللاعب عملة معدنية أو الموسيقى الخلفية التي يتم تشغيلها في المرحلة الحالية. من المرجح جدًا أن يستدعي مطورو الألعاب الدالة start() في عقد المصدر عندما يكون أي من هذه الأصوات ضروريًا للعبة.

بعد أن تعرفنا على هذا النمط الشائع في ألعاب الويب، قرّرنا تعديل طريقة التنفيذ وفقًا لما يلي:

سيتم استئناف AudioContext تلقائيًا عند استيفاء شرطين:

  • تفاعَل المستخدِم مع إحدى الصفحات.
  • يتم استدعاء طريقة start() لعقدة المصدر.

ونتيجةً لهذا التغيير، ستستأنف معظم ألعاب الويب الآن تشغيل الصوت عندما يبدأ المستخدم تشغيل اللعبة.

تطوير الويب

من الضروري أحيانًا إجراء تغييرات قد تؤدي إلى توقُّف التوافق مع النظام الأساسي للويب. للأسف، إنّ التشغيل التلقائي للصوت معقّد وتندرج ضمن هذه الفئة من التغيير. إلا أنّ إجراء هذا التحول أمر بالغ الأهمية لضمان عدم حدوث ركود على الويب أو فقدان قدرته الإبداعية.

ومع ذلك، ندرك أنّ تطبيق إصلاحات للمواقع الإلكترونية ليس ممكنًا دائمًا على المدى القصير لأسباب مختلفة:

  • قد يركز مطورو الويب على مشروع جديد ولا يمكن صيانة موقع ويب قديم على الفور.
  • قد لا تتحكّم بوابات ألعاب الويب في تنفيذ الألعاب في كتالوجها، وأنّ تحديث مئات الألعاب، إن لم يكن الآلاف، يمكن أن يستغرِق وقتًا طويلاً ومكلفًا بالنسبة إلى الناشرين.
  • قد تكون بعض المواقع الإلكترونية قديمة جدًا ولم تعد تتم صيانتها، لسبب أو آخر، ولكنها لا تزال مستضافة لأغراض تاريخية.

إليك مقتطف رمز JavaScript قصير يعترض طريق إنشاء كائنات AudioContext الجديدة، وسيشغِّل تلقائيًا وظيفة السيرة الذاتية لهذه العناصر عندما يُجري المستخدِم تفاعلات مختلفة مع المستخدم. يجب تنفيذ هذا الرمز قبل إنشاء أي كائنات AudioContext في صفحة الويب الخاصة بك - على سبيل المثال، يمكنك إضافة هذا الرمز إلى علامة صفحتك على الويب:

(function () {
  // An array of all contexts to resume on the page
  const audioContextList = [];

  // An array of various user interaction events we should listen for
  const userInputEventNames = [
    'click',
    'contextmenu',
    'auxclick',
    'dblclick',
    'mousedown',
    'mouseup',
    'pointerup',
    'touchend',
    'keydown',
    'keyup',
  ];

  // A proxy object to intercept AudioContexts and
  // add them to the array for tracking and resuming later
  self.AudioContext = new Proxy(self.AudioContext, {
    construct(target, args) {
      const result = new target(...args);
      audioContextList.push(result);
      return result;
    },
  });

  // To resume all AudioContexts being tracked
  function resumeAllContexts(event) {
    let count = 0;

    audioContextList.forEach(context => {
      if (context.state !== 'running') {
        context.resume();
      } else {
        count++;
      }
    });

    // If all the AudioContexts have now resumed then we
    // unbind all the event listeners from the page to prevent
    // unnecessary resume attempts
    if (count == audioContextList.length) {
      userInputEventNames.forEach(eventName => {
        document.removeEventListener(eventName, resumeAllContexts);
      });
    }
  }

  // We bind the resume function for each user interaction
  // event on the page
  userInputEventNames.forEach(eventName => {
    document.addEventListener(eventName, resumeAllContexts);
  });
})();

تجدر الإشارة إلى أنّ مقتطف الرمز هذا لن يساعد في استئناف AudioContexts التي يتم إنشاؤها في إطار iframe، ما لم يتم تضمين مقتطف الرمز هذا ضمن نطاق محتوى iframe نفسه.

تقديم خدمة أفضل للمستخدمين

بالإضافة إلى هذا التغيير في السياسة، سنطرح أيضًا آلية تتيح للمستخدمين إيقاف سياسة التشغيل التلقائي لتغطية الحالات التي لا يعمل فيها نظام التعلّم التلقائي على النحو المتوقّع أو المواقع الإلكترونية التي لا يمكن استخدامها بسبب هذا التغيير. سيتم طرح هذا التغيير مع السياسة الجديدة في الإصدار 71 من Chrome ويمكن العثور عليه في "إعدادات الصوت". ويمكن إضافة المواقع الإلكترونية التي يريد المستخدم السماح بتشغيل ميزة التشغيل التلقائي إلى قائمة "السماح بها".

كيف يتم إنشاء MEI للمستخدمين الجدد؟

كما ذكرنا سابقًا، نحن ننشئ MEI تلقائيًا بمرور الوقت استنادًا إلى سلوك المستخدم من أجل توقُّع النية التي يريدها في ما يتعلق بموقع إلكتروني معيّن يتضمّن محتوى يتم تشغيله تلقائيًا. ولكل موقع إلكتروني نتيجته بين صفر وواحد في هذا الفهرس. تشير الدرجات الأعلى إلى أن المستخدم يتوقع تشغيل المحتوى من موقع الويب هذا.

ومع ذلك، بالنسبة إلى الملفات الشخصية الجديدة للمستخدمين أو في حال محو المستخدم لبيانات التصفّح، بدلاً من حظر التشغيل التلقائي في كل مكان، يتم استخدام قائمة أولية تستند إلى نتائج MEI المجمّعة والمجمعة للمستخدمين الذين تم إخفاء هويتهم لتحديد المواقع الإلكترونية التي يمكن تشغيلها تلقائيًا. لا تحدِّد هذه البيانات سوى الحالة الأولية لـ MEI عند إنشاء الملف الشخصي للمستخدم. عندما يتصفّح المستخدم الويب ويتفاعل مع المواقع الإلكترونية التي تعرض محتوى يتم تشغيله تلقائيًا، تُلغي ميزة MEI الشخصية الإعدادات التلقائية.

يتم إنشاء قائمة المواقع الأولية الأولية خوارزميًا، بدلاً من تنظيمها يدويًا، ويمكن تضمين أي موقع إلكتروني في القائمة. تتم إضافة المواقع الإلكترونية إلى القائمة إذا سمح عدد كافٍ من المستخدمين الذين يزورون هذا الموقع بالتشغيل التلقائي على ذلك الموقع. ويستند هذا الحد الأدنى إلى النسبة المئوية حتى لا يفضِّل المواقع الأكبر حجمًا.

جارٍ تحقيق التوازن

لقد نشرنا مستندات جديدة لتوفير مزيد من المعلومات حول عملية اتخاذ القرار والأساس المنطقي للتصميم التي تستند إليها هذه السياسة. بالإضافة إلى مستندات جديدة حول آلية عمل قائمة المواقع الإلكترونية الأولية الأولية.

نحن دائمًا نضع مستخدمينا في المقام الأول، ولكننا لا نريد أيضًا أن يأسقطوا مجتمع تطوير الويب. وفي بعض الأحيان، يعني استخدام المتصفّح أنّه يجب تحقيق التوازن بين الهدفَين بعناية. نعتقد أنّه من خلال التعديلات التي أجريناها على تنفيذ السياسة والوقت الإضافي الذي وفّرناه لمطوّري البرامج الصوتية على الويب لتعديل رموزهم، سنحقّق هذا التوازن باستخدام الإصدار 71 من Chrome.

إضافة ملاحظات