ה-API להעברת הודעות מאפשר לנו לשלוח התראות למשתמש גם כשהדפדפן סגור. הרבה מפתחים רוצים להשתמש בהודעות האלה כדי לעדכן ולסנכרן תוכן בלי לפתוח את הדפדפן, אבל יש ב-API הגבלה חשובה אחת: צריך תמיד להציג התראה על כל הודעת דחיפה שמתקבלת.
היכולת לשלוח הודעת Push כדי לסנכרן נתונים במכשיר של המשתמש או כדי להסתיר התראה שהוצגה בעבר יכולה להיות שימושית מאוד למשתמשים ולמפתחים, אבל היכולת של אפליקציית אינטרנט לפעול ברקע בלי שהמשתמש ידע זאת עלולה להוביל לניצול לרעה.
Budget API הוא ממשק API חדש שנועד לאפשר למפתחים לבצע פעולות מוגבלות ברקע בלי להודיע למשתמש על כך, כמו דחיפה שקטה או ביצוע שליפה ברקע. ב-Chrome 60 ואילך תוכלו להתחיל להשתמש ב-API הזה, וצוות Chrome מחכה לקבל משוב ממפתחים.
כדי לאפשר למפתחים לצרוך את המשאבים של המשתמש ברקע, בפלטפורמת האינטרנט אנחנו משיקים את המושג 'תקציב' באמצעות Budget API החדש. לכל אתר יוקצה כמות משאבים על סמך התעניינות המשתמשים, שאפשר לנצל לפעולות ברקע, כמו שליחת התראה שקטה. כל פעולה תוריד מהתקציב. אחרי ניצול התקציב, אי אפשר יותר לבצע פעולות ברקע בלי לראות את המשתמש. סוכן המשתמש יהיה אחראי לקביעת התקציב שיוקצה לאפליקציית אינטרנט על סמך היוריסטיקה שלה. לדוגמה, הקצאת התקציב יכולה להיות קשורה למעורבות המשתמשים. כל דפדפן יכול להחליט מהי ההיוריסטיקה שלו.
קיצור דרך: 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. לצערנו, אי אפשר להשתמש גם במצב פרטי לצורך כך, כי Budget API מחזיר תקציב של אפס במצב פרטי (אבל יש באג שמתבטא בשגיאה במהלך הבדיקה שלי).
צריך להפעיל את reserve()
רק אם אתם מתכוונים לבצע את הפעולה שאתם שומרים בשלב כלשהו בעתיד. חשוב לזכור שאם תפעילו את reserve בדוגמה שלמעלה ועדיין תוצג התראה, עדיין ייעשה שימוש בתקציב.
תרחיש לדוגמה נפוץ שלא ניתן להפעיל באמצעות reserve()
בלבד הוא היכולת לתזמן שליחת הודעה שקטה מקצה עורפי. ל-Budget API יש ממשקי API שמאפשרים לבצע את התרחיש לדוגמה הזה, אבל אנחנו עדיין עובדים עליהם ב-Chrome והם זמינים כרגע רק באמצעות דגלים ו / או גרסת מקור לניסיון.
Budget API וגרסאות מקור לניסיון
יש שתי שיטות, getBudget()
ו-getCost()
, שבהן אפליקציית אינטרנט יכולה להשתמש כדי לתכנן את השימוש בתקציב שלה.
ב-Chrome 60, שתי השיטות האלה זמינות אם נרשמים לגרסת המקור לניסיון, אבל אם לא, אפשר להשתמש בהן באופן מקומי לצורך בדיקה על ידי הפעלת הדגל Experimental Web Platform features (פותחים את chrome://flags/#enable-experimental-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.