מבוא ל-Budget API

ה-Push Messaging API מאפשר לנו לשלוח התראות למשתמש גם כשהדפדפן סגור. מפתחים רבים רוצים להשתמש בהודעות האלה כדי לעדכן ולסנכרן את התוכן מבלי לפתוח את הדפדפן, אבל ל-API יש מגבלה חשובה אחת: צריך תמיד להציג התראה לכל הודעה שנשלחת בדחיפה.

היכולת לשלוח הודעות דחיפה כדי לסנכרן נתונים במכשיר של משתמש או להסתיר הודעה שהוצגה לך בעבר יכולה להיות שימושית מאוד למשתמשים ולמפתחים, אבל מתן אפשרות לאפליקציית אינטרנט לפעול ברקע מבלי שהמשתמש ידע על ההתנהלות הפוגעת שלה.

Budget API הוא ממשק API חדש שמאפשר למפתחים לבצע עבודה מוגבלת ברקע בלי להודיע למשתמש, כמו דחיפה שקטה או אחזור נתונים ברקע. בגרסה Chrome 60 ומעלה תוכלו להתחיל להשתמש בממשק API, והצוות של Chrome ישמח לקבל משוב ממפתחים.

כדי לאפשר למפתחים לצרוך משאבים של המשתמשים ברקע, בפלטפורמה החדשה השקנו את הקונספט של תקציב באמצעות Budget API החדש. כל אתר יקבל כמות מסוימת של משאבים על סמך מעורבות המשתמשים, שהוא יכול לצרוך לביצוע פעולות ברקע, כמו דחיפה שקטה, שבה כל פעולה ממצה את התקציב. אחרי ניצול התקציב, אי אפשר יותר לבצע פעולות ברקע בלי לחשוף את המשתמשים. סוכן המשתמש יהיה אחראי לקבוע את התקציב שהוקצה לאפליקציית האינטרנט על סמך ההיוריסטיקה שלה. לדוגמה, ניתן לקשר את הקצאת התקציב להתעניינות המשתמשים. כל דפדפן יכול להחליט אם הוא מתאים לו.

TL;DR Budget API מאפשר לכם לשריין תקציב, להשתמש בתקציב, לקבל רשימה של התקציב שנותר ולהבין את העלות של פעולות ברקע

שמירת התקציב

ב-Chrome 60 ואילך, השיטה navigator.budget.reserve() תהיה זמינה ללא דגלים.

השיטה reserve() מאפשרת לבקש תקציב לפעולה ספציפית, והיא מחזירה ערך בוליאני כדי לציין אם אפשר לשמור את התקציב. אם התקציב שמור, אין צורך ליידע אותם לגבי העבודה ברקע.

בדוגמה של ההתראות, אפשר לנסות לשמור תקציב לפעולה של 'דחיפה שקטה', ואם הפרמטר 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, 'silent-push' הוא סוג הפעולה היחיד שזמין, אבל אפשר למצוא רשימה מלאה של סוגי פעולות במפרט. כמו כן, אין דרך קלה להגדיל את התקציב למטרות בדיקה או ניפוי באגים אחרי שמשתמשים בו, אבל כפתרון זמני, אפשר ליצור פרופיל חדש ב-Chrome. לצערי, לא ניתן להשתמש במצב פרטי כי התקציב API יחזיר תקציב אפס במצב פרטי (אף על פי שיש באג שגורם לשגיאה במהלך הבדיקה).

יש לבצע קריאה אל reserve() רק כאשר אתם מתכוונים לבצע את הפעולה שביצעתם בשלב כלשהו בעתיד. שימו לב שאם קראתם ל-Reserve בדוגמה שלמעלה אבל עדיין הצגתם הודעה, המערכת תמשיך להשתמש בתקציב.

אחד מהתרחישים הנפוצים לדוגמה ש-reserve() לא מפעיל לבד הוא האפשרות לתזמן דחיפה שקטה מקצה העורפי. ל-Budget API יש ממשקי API שמאפשרים את התרחיש לדוגמה הזה, אבל אנחנו עדיין עובדים עליהם ב-Chrome וזמינים כרגע רק מאחורי דגלים ו / או גרסת מקור לניסיון.

Budget API וגרסאות מקור לניסיון

אפליקציית אינטרנט יכולה להשתמש בשתי שיטות, getBudget() ו-getCost(), כדי לתכנן את השימוש בתקציב.

ב-Chrome 60, שתי השיטות האלה זמינות אם נרשמים לגרסת המקור לניסיון, אבל לצורך בדיקה, אפשר להשתמש בהן באופן מקומי על ידי הפעלת הדגל הניסיוני של תכונות פלטפורמת האינטרנט (Open chrome://flags/#enable-activateal-web-platform-features ב-Chrome).

בואו נראה איך משתמשים בממשקי ה-API האלה.

קבל את התקציב שלך

אפשר למצוא את התקציב הזמין באמצעות השיטה 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(). אם התקציב הנוכחי שלכם נמוך מהעלות שצוינה, יכול להיות שעדיין תוכלו לשריין פעולה. הפרטים הספציפיים שבמפרט הם כמפורט:

זה ה-API הקיים ב-Chrome, וככל שהאינטרנט ממשיך לתמוך בממשקי API חדשים שדורשים יכולת לבצע פעולות ברקע כמו אחזור רקע, ניתן להשתמש ב-Budget API כדי לנהל את מספר הפעולות שאפשר לבצע בלי להודיע למשתמש.

במהלך השימוש ב-API, תוכלו לשלוח משוב על ה-GitHub Repo או לדווח על הבאגים ב-Chrome בכתובת crbug.com.