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

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

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

من المقرّر الآن طرح هذا التغيير في السياسة مع الإصدار 71 من Chrome في كانون الأول (ديسمبر) 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. يُشار عادةً إلى عناصر AudioNode التي تنفِّذ واجهة AudioScheduledSourceNode باسم عناصر المصدر (مثل 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 من خلال التعديلات التي أجريناها على تنفيذ السياسة والوقت الإضافي الذي منحناه لمطوّري محتوى الصوت على الويب لتعديل رموزهم البرمجية.

ملاحظات