تتيح لنا واجهة برمجة التطبيقات Push Messaging API إرسال إشعارات إلى المستخدم حتى عندما يكون المتصفّح مغلقًا. يريد العديد من المطوّرين استخدام هذه الرسائل لتعديل المحتوى ومزامنته بدون فتح المتصفّح، ولكن تفرض واجهة برمجة التطبيقات قيدًا مهمًا واحدًا: يجب دائمًا عرض إشعار لكل رسالة دفع واحدة يتم استلامها.
إنّ إمكانية إرسال رسالة فورية لمزامنة البيانات على جهاز المستخدم أو إخفاء إعلام سبق أن عرضته قد تكون مفيدة جدًا للمستخدمين والمطوّرين، ولكن السماح لتطبيق الويب بتنفيذ مهام في الخلفية بدون علم المستخدم قد يؤدي إلى إساءة الاستخدام.
Budget API: هي واجهة برمجة تطبيقات جديدة مصمّمة للسماح للمطوّرين بتنفيذ عمل محدود في الخلفية بدون إرسال إشعار إلى المستخدم، مثل الإشعارات الصامتة أو تنفيذ عملية استرجاع في background. في الإصدار 60 من Chrome والإصدارات الأحدث، ستتمكّن من بدء استخدام واجهة برمجة التطبيقات هذه، ويتطلّع فريق Chrome إلى تلقّي ملاحظات من المطوّرين.
للسماح للمطوّرين باستخدام موارد المستخدم في الخلفية، تقدّم منصّة الويب مفهوم الميزانية باستخدام واجهة برمجة التطبيقات الجديدة Budget API. سيتم منح كل موقع إلكتروني قدرًا من الموارد استنادًا إلى تفاعل المستخدم الذي يمكنه استهلاكه عند تنفيذ إجراءات في الخلفية، مثل الدفع بدون صوت، حيث سيتم استنفاد الميزانية من خلال كل عملية. عند إنفاق الميزانية، لا يمكن تنفيذ الإجراءات في الخلفية بدون إعلام المستخدم. سيكون وكيل المستخدم مسؤولاً عن تحديد الميزانية المخصّصة لتطبيق ويب استنادًا إلى الأساليب الاستقرائية، على سبيل المثال، يمكن ربط الميزانية المسموح بها بالتفاعل مع المستخدم. يمكن لكل متصفح تحديد استدلاله الخاص.
الملخّص: تتيح لك Budget API حجز الميزانية واستخدامها والحصول على قائمة بالميزانية المتبقية ومعرفة تكلفة العمليات التي تعمل في الخلفية.
حجز الميزانية
في الإصدار 60 من Chrome والإصدارات الأحدث، ستتوفّر الطريقة navigator.budget.reserve()
بدون أي علامات.
تسمح لك طريقة reserve()
بطلب ميزانية لعملية معيّنة، و
ستُرجع قيمة منطقية للإشارة إلى ما إذا كان يمكن حجز الميزانية. إذا تم حجز الميزانية، فلا داعي لإبلاغ المستخدم بعملك في الخلفية.
في مثال الإشعارات الفورية، يمكنك محاولة الاحتفاظ بالميزانية
لعملية "صامت" وإذا تم حلّ reserve()
مع ضبط القيمة "صحيح"،
يُسمح بالعملية. وإلا ستظهر القيمة "false" وستحتاج إلى عرض إشعار
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);
});
في الإصدار 60 من Chrome، يكون "الدفع الصامت" هو نوع العملية الوحيد المتاح، ولكن يمكنك العثور على قائمة كاملة بأنواع العمليات في المواصفات. ولا تتوفّر أيضًا طريقة سهلة لزيادة ميزانيتك لأغراض الاختبار أو تصحيح الأخطاء بعد استخدامها، ولكن كحل مؤقت، يمكنك إنشاء ملف شخصي جديد في Chrome. لا يمكنك استخدام وضع التصفّح المتخفي لإجراء ذلك أيضًا لأنّ Budget API سيعرض ميزانية صفرية في وضع التصفّح المتخفي (على الرغم من أنّ هناك خطأ يؤدي إلى ظهور خطأ أثناء الاختبار).
يجب عدم الاتصال بالرقم reserve()
إلا عندما تريد تنفيذ العملية التي يتم
حجزها في وقت لاحق. يُرجى العلم أنّه إذا استدعيت reserve في المثال
أعلاه ولكنك أظهرت إشعارًا، سيستمر استخدام الميزانية.
من حالات الاستخدام الشائعة التي لا توفّرها reserve()
وحدها هي إمكانية
جدولة إرسال دفعة صامتة من الخلفية. تتضمّن Budget API واجهات برمجة تطبيقات لتفعيل
هذه الحالة الاستخدام، ولكن لا تزال هذه الواجهات قيد التطوير في Chrome، ولا تتوفّر حاليًا إلا من خلال مرحلة التجربة والتقييم و / أو علامات.
Budget API وعمليات التجربة والتقييم
هناك طريقتان، getBudget()
وgetCost()
، يمكن لأحد تطبيقات الويب استخدامهما
لتخطيط استخدام ميزانيته.
في الإصدار 60 من Chrome، تتوفّر كلتا الطريقتَين إذا اشتركت في مرحلة تقييم وتجربة، ولكن يمكنك استخدامهما على الجهاز فقط من خلال تفعيل العلامة ميزات Web Platform التجريبية (افتح 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);
});
في وقت كتابة هذه المقالة، سيطبع الإصدار 60 من Chrome ما يلي:
Cost of silent push is: 2
يُرجى العِلم أنّه باستخدام الطريقتَين reserve()
وgetCost()
، يجب أن تكون التكلفة الفعلية للعملية أقل من التكلفة التي يعرضها getCost()
.
وقد يظل بإمكانك حجز عملية إذا كانت ميزانيتك الحالية أقل من
التكلفة المشار إليها. في ما يلي التفاصيل المحدّدة من المواصفات:
على النحو التالي:
هذه هي واجهة برمجة التطبيقات الحالية في Chrome، ومع استمرار الويب في إتاحة واجهات برمجة تطبيقات جديدة تتطلّب إمكانية تنفيذ مهام في الخلفية، مثل الاسترداد في الخلفية، يمكن استخدام Budget API لمحاولة إدارة عدد العمليات التي يمكنك تنفيذها بدون إرسال إشعار إلى المستخدم.
أثناء استخدام واجهة برمجة التطبيقات، يُرجى تقديم ملاحظات على مستودع GitHub أو الإبلاغ عن أخطاء Chrome على crbug.com.