مقدمة عن واجهة برمجة التطبيقات (API) للميزانية

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

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

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

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

النص المختصر (TL;DR) تسمح لك واجهة برمجة تطبيقات الميزانية بحجز الميزانية واستخدام الميزانية والحصول على قائمة بالميزانية المتبقية وفهم تكلفة العمليات التي يتم إجراؤها في الخلفية

حجز الميزانية

في الإصدار 60 من Chrome والإصدارات الأحدث، ستتوفّر طريقة navigator.budget.reserve() بدون أي علامات.

تسمح لك الطريقة reserve() بطلب ميزانية لعملية معيّنة، وستعرض قيمة منطقية للإشارة إلى ما إذا كان من الممكن حجز الميزانية. إذا تم حجز الميزانية، فلن تكون هناك حاجة لإعلام المستخدم بعملك الخلفي.

في مثال الإشعارات الفورية، يمكنك محاولة حجز ميزانية من أجل عملية "صامتة"، وإذا تم ضبط reserve() على "صحيح"، يُسمَح بالعملية. وفي حال عدم تلقّيها، ستظهر رسالة خطأ وسيكون عليك عرض إشعار.

self.addEventListener('push', event => {
 const promiseChain = navigator.budget.reserve('silent-push')
   .then((reserved) => {
     if (reserved) {
       // No need to show a notification.
       return;
     }

     // Not enough budget is available, must show a notification.
     return registration.showNotification(...);
   });
 event.waitUntil(promiseChain);
});

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

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

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

واجهة برمجة التطبيقات للميزانية وفترات التجربة والتقييم

هناك طريقتان، getBudget() وgetCost()، يمكن استخدامهما بواسطة تطبيق ويب للتخطيط لاستخدام ميزانيتهما.

في إصدار Chrome 60، تتوفّر هاتان الطريقتان في حال الاشتراك في تجربة المصدر، ولكن يمكنك استخدامها محليًا من خلال تفعيل علامة ميزات "نظام التشغيل التجريبي التجريبي" (Open chrome://flags/#enable-experimental-web-platform-features في Chrome).

لنلقِ نظرة على كيفية استخدام واجهات برمجة التطبيقات هذه.

الحصول على ميزانيتك

يمكنك العثور على ميزانيتك المتاحة باستخدام طريقة getBudget(). تتضمّن بعض المتصفِّحات (مثل Chrome) "تناقصًا" للميزانية بمرور الوقت، لذا لعرض مصفوفة من القيمة الكاملة، يتم عرض مصفوفة BudgetStates، ما يشير إلى حجم ميزانيتك في أوقات مختلفة في المستقبل.

لسرد إدخالات الميزانية التي يمكننا تشغيلها:

navigator.budget.getBudget()
.then((budgets) => {
  budgets.forEach((element) => {
    console.log(\`At '${new Date(element.time).toString()}' \` +
      \`your budget will be '${element.budgetAt}'.\`);
  });
});

سيكون الإدخال الأول هو ميزانيتك الحالية، وستوضّح القيم الإضافية ما ستكون عليه ميزانيتك في مراحل مختلفة في المستقبل.

At 'Mon Jun 05 2017 12:47:20' you will have a budget of '3'.
At 'Fri Jun 09 2017 10:42:57' you will have a budget of '2'.
At 'Fri Jun 09 2017 12:31:09' you will have a budget of '1'.

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

الحصول على تكلفة عملية معيّنة

لمعرفة تكلفة العملية، سيؤدي الاتصال برقم getCost() إلى عرض رقم يشير إلى الحدّ الأقصى لمبلغ الميزانية الذي سيتم استهلاكه في حال الاتصال بـ reserve() لإجراء تلك العملية.

على سبيل المثال، يمكننا معرفة تكلفة عدم عرض إشعار عند تلقّي رسالة فورية (أي تكلفة الإرسال الصامت)، باستخدام الرمز التالي:

navigator.budget.getCost('silent-push')
.then((cost) => {
  console.log('Cost of silent push is:', cost);
})
.catch((err) => {
  console.error('Unable to get cost:', err);
});

في وقت كتابة هذا التقرير، سيطبع Chrome 60 ما يلي:

Cost of silent push is: 2

أحد الأشياء التي يجب التركيز عليها باستخدام الطريقتين reserve() وgetCost() هو أن التكلفة الفعلية للعملية يمكن أن تكون أقل من التكلفة التي تعرضها getCost(). قد يظل بإمكانك حجز عملية إذا كانت ميزانيتك الحالية أقل من التكلفة المُشار إليها. التفاصيل المحددة من المواصفات هي على النحو التالي:

هذه هي واجهة برمجة التطبيقات الحالية في Chrome وبما أن الويب لا يزال يتيح استخدام واجهات برمجة التطبيقات الجديدة التي تتطلب إمكانية تنفيذ العمل في الخلفية، مثل الجلب في الخلفية، يمكن استخدام واجهة برمجة تطبيقات الميزانية لإدارة عدد العمليات التي يمكنك تنفيذها بدون إشعار المستخدم.

عند استخدام واجهة برمجة التطبيقات، يُرجى تقديم ملاحظاتك وآرائك حول GitHub Repo أو الإبلاغ عن أخطاء Chrome على crbug.com.