مقدمه ای بر Budget API

Push Messaging API ما را قادر می سازد حتی زمانی که مرورگر بسته است، اعلان ها را برای کاربر ارسال کنیم. بسیاری از توسعه‌دهندگان می‌خواهند بتوانند از این پیام‌رسانی برای به‌روزرسانی و همگام‌سازی محتوا بدون باز بودن مرورگر استفاده کنند، اما API یک محدودیت مهم دارد: همیشه باید برای هر پیام فشار دریافتی یک اعلان نمایش دهید.

ارسال پیام فشار برای همگام سازی داده ها در دستگاه کاربر یا مخفی کردن اعلانی که قبلاً نشان داده بودید می تواند برای کاربران و توسعه دهندگان بسیار مفید باشد، اما اجازه دادن به یک برنامه وب برای انجام کار در پس زمینه بدون اینکه کاربر بداند قابل سوء استفاده است. .

Budget API یک API جدید است که به توسعه‌دهندگان اجازه می‌دهد کارهای پس‌زمینه محدودی را بدون اطلاع کاربر انجام دهند، مانند فشار بی‌صدا یا انجام واکشی پس‌زمینه. در Chrome 60 و بالاتر، می‌توانید استفاده از این API را شروع کنید و تیم Chrome مشتاق دریافت بازخورد از توسعه‌دهندگان است.

برای اینکه توسعه دهندگان بتوانند منابع کاربر را در پس زمینه مصرف کنند، پلتفرم وب در حال معرفی مفهوم بودجه با استفاده از Budget API جدید است. به هر سایت مقداری منبع بر اساس تعامل کاربر تعلق می‌گیرد که می‌تواند برای اقدامات پس‌زمینه مصرف کند، مانند فشار بی‌صدا، که در آن هر عملیات باعث کاهش بودجه می‌شود. وقتی بودجه خرج می شود، دیگر نمی توان اقدامات پس زمینه را بدون مشاهده کاربر انجام داد. عامل کاربر مسئول تعیین بودجه اختصاص داده شده به یک برنامه وب بر اساس اکتشافات آن خواهد بود، برای مثال کمک هزینه بودجه می تواند به تعامل کاربر مرتبط شود. هر مرورگر می تواند تصمیم بگیرد که اکتشافی خودش باشد.

TL;DR بودجه API به شما امکان می دهد بودجه را رزرو کنید، از بودجه استفاده کنید، لیستی از بودجه باقی مانده را دریافت کنید و هزینه عملیات پس زمینه را درک کنید.

رزرو بودجه

در Chrome 60 و بالاتر، روش navigator.budget.reserve() بدون هیچ پرچمی در دسترس خواهد بود.

متد reserve() به شما امکان می‌دهد برای یک عملیات خاص بودجه درخواست کنید و یک Boolean برمی‌گرداند تا نشان دهد آیا می‌توان بودجه را رزرو کرد. اگر بودجه رزرو شده بود، نیازی به اطلاع کاربر از کار پس زمینه شما نیست.

در مثال اعلان‌های فشاری، می‌توانید سعی کنید بودجه را برای عملیات "فشار بی‌صدا" ذخیره کنید و اگر reserve() با true حل شود، عملیات مجاز است. در غیر این صورت 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);
});

در Chrome 60، «فشار بی‌صدا» تنها نوع عملیات موجود است، اما می‌توانید فهرست کاملی از انواع عملیات را در مشخصات پیدا کنید. همچنین هیچ راه آسانی برای افزایش بودجه برای اهداف آزمایش یا اشکال زدایی پس از استفاده وجود ندارد، اما به عنوان یک راه حل موقت می توانید یک نمایه جدید در Chrome ایجاد کنید. متأسفانه نمی‌توانید از حالت ناشناس برای این کار استفاده کنید، زیرا Budget API بودجه صفر را در حالت ناشناس برمی‌گرداند (اگرچه اشکالی وجود دارد که منجر به خطا در طول آزمایش من می‌شود).

شما باید فقط زمانی که قصد دارید عملیاتی را که رزرو می کنید در آینده انجام دهید reserve() را فراخوانی کنید. توجه داشته باشید که اگر در مثال بالا با رزرو تماس گرفته‌اید، اما همچنان یک اعلان نشان داده‌اید، بودجه همچنان استفاده خواهد شد.

یکی از موارد استفاده متداول که به تنهایی توسط reserve() فعال نمی‌شود، توانایی برنامه‌ریزی یک فشار بی‌صدا از یک backend است. Budget API دارای APIهایی برای فعال کردن این مورد است، اما هنوز در Chrome در حال کار بر روی آنها هستند و در حال حاضر فقط پشت پرچم‌ها و/یا نسخه آزمایشی اصلی در دسترس هستند.

Budget API و Origin Trials

دو روش وجود دارد، getBudget() و getCost() که می تواند توسط یک برنامه وب برای برنامه ریزی استفاده از بودجه خود استفاده شود.

در Chrome 60، هر دوی این روش‌ها در صورت ثبت‌نام در نسخه آزمایشی اصلی در دسترس هستند، اما در غیر این صورت برای آزمایش، می‌توانید با فعال کردن پرچم ویژگی‌های پلتفرم وب آزمایشی از آنها به صورت محلی استفاده کنید (باز کردن chrome://flags/#enable-experimental-web- ویژگی های پلتفرم در کروم).

بیایید نحوه استفاده از این APIها را بررسی کنیم.

بودجه خود را دریافت کنید

با متد getBudget() می توانید بودجه موجود خود را پیدا کنید. برخی از مرورگرها (مانند کروم) در طول زمان «تجزیه» بودجه خواهند داشت، بنابراین برای اینکه دید کاملی داشته باشید، آرایه‌ای از 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() بازگردانده می شود. اگر بودجه فعلی شما کمتر از هزینه ذکر شده باشد، ممکن است همچنان بتوانید عملیاتی را رزرو کنید. جزئیات خاص از مشخصات به شرح زیر است:

این API فعلی در Chrome است و از آنجایی که وب همچنان از API های جدیدی پشتیبانی می کند که به توانایی انجام کارهای پس زمینه مانند واکشی پس زمینه نیاز دارند، می توان از Budget API برای مدیریت تعداد عملیاتی که می توانید بدون اطلاع کاربر انجام دهید استفاده کرد.

همانطور که از API استفاده می کنید، لطفاً بازخورد خود را در مورد GitHub Repo ارائه دهید یا اشکالات Chrome را در crbug.com ثبت کنید.