API Thông báo đẩy cho phép chúng ta gửi thông báo cho người dùng ngay cả khi trình duyệt bị đóng. Nhiều nhà phát triển muốn có thể sử dụng tính năng nhắn tin này để cập nhật và đồng bộ hoá nội dung mà không cần mở trình duyệt, nhưng API có một hạn chế quan trọng: bạn phải luôn hiển thị thông báo cho mọi thông báo đẩy nhận được.
Việc có thể gửi thông báo đẩy để đồng bộ hoá dữ liệu trên thiết bị của người dùng hoặc ẩn thông báo mà bạn đã hiển thị trước đó có thể cực kỳ hữu ích cho người dùng và nhà phát triển, nhưng việc cho phép ứng dụng web hoạt động ở chế độ nền mà người dùng không biết có thể bị lạm dụng.
Budget API là một API mới được thiết kế để cho phép nhà phát triển thực hiện công việc ở chế độ nền một cách hạn chế mà không cần thông báo cho người dùng, chẳng hạn như đẩy thầm hoặc tìm nạp ở chế độ nền. Trong Chrome 60 trở lên, bạn có thể bắt đầu sử dụng API này và nhóm Chrome rất mong nhận được ý kiến phản hồi của các nhà phát triển.
Để cho phép nhà phát triển sử dụng tài nguyên của người dùng ở chế độ nền, nền tảng web sẽ giới thiệu khái niệm về ngân sách bằng cách sử dụng API Ngân sách mới. Mỗi trang web sẽ được cấp một lượng tài nguyên dựa trên mức độ tương tác của người dùng mà họ có thể sử dụng cho các thao tác trong nền, chẳng hạn như một thao tác đẩy thầm, trong đó mỗi thao tác sẽ làm cạn ngân sách. Khi chi tiêu hết ngân sách, các thao tác trong nền sẽ không thể thực hiện được nếu người dùng không nhìn thấy. Tác nhân người dùng sẽ chịu trách nhiệm xác định ngân sách được chỉ định cho một ứng dụng web dựa trên phương pháp phỏng đoán của ứng dụng đó, ví dụ: mức ngân sách có thể được liên kết với mức độ tương tác của người dùng. Mỗi trình duyệt có thể tự quyết định phương pháp phỏng đoán của riêng mình.
Tóm tắt: Budget API cho phép bạn đặt trước ngân sách, sử dụng ngân sách, nhận danh sách ngân sách còn lại và hiểu chi phí của các hoạt động trong nền
Đặt trước ngân sách
Trong Chrome 60 trở lên, phương thức navigator.budget.reserve()
sẽ có sẵn mà không cần cờ nào.
Phương thức reserve()
cho phép bạn yêu cầu ngân sách cho một hoạt động cụ thể và phương thức này sẽ trả về một giá trị boolean cho biết liệu ngân sách có thể được đặt trước hay không. Nếu ngân sách đã được đặt trước, bạn không cần thông báo cho người dùng về tác vụ chạy nền.
Trong ví dụ về thông báo đẩy, bạn có thể cố gắng đặt trước ngân sách cho thao tác "đẩy thầm" và nếu reserve()
phân giải bằng true, thì thao tác này sẽ được cho phép. Nếu không, hàm này sẽ trả về giá trị false và bạn cần hiển thị thông báo
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);
});
Trong Chrome 60, "silent-push" là loại thao tác duy nhất có sẵn, nhưng bạn có thể tìm thấy danh sách đầy đủ các loại thao tác trong thông số kỹ thuật. Ngoài ra, không có cách dễ dàng nào để tăng ngân sách cho mục đích kiểm thử hoặc gỡ lỗi sau khi sử dụng, nhưng để khắc phục tạm thời, bạn có thể tạo một hồ sơ mới trong Chrome. Đáng tiếc là bạn cũng không thể sử dụng chế độ ẩn danh cho việc này vì API Ngân sách sẽ trả về ngân sách bằng 0 trong Chế độ ẩn danh (mặc dù có lỗi dẫn đến lỗi trong quá trình kiểm thử của tôi).
Bạn chỉ nên gọi reserve()
khi dự định thực hiện thao tác mà bạn đang đặt trước vào một thời điểm nào đó trong tương lai. Xin lưu ý rằng nếu bạn gọi reserve trong ví dụ trên nhưng vẫn hiển thị thông báo, thì ngân sách vẫn sẽ được sử dụng.
Một trường hợp sử dụng phổ biến mà chỉ reserve()
không thể bật được là khả năng lên lịch đẩy thầm từ phần phụ trợ. Budget API có các API để hỗ trợ trường hợp sử dụng này, nhưng các API này vẫn đang được phát triển trong Chrome và hiện chỉ có sẵn sau các cờ và / hoặc Bản dùng thử theo nguyên gốc.
Budget API và Bản dùng thử theo nguyên gốc
Ứng dụng web có thể sử dụng hai phương thức là getBudget()
và getCost()
để lập kế hoạch sử dụng ngân sách.
Trong Chrome 60, bạn có thể sử dụng cả hai phương thức này nếu đăng ký dùng thử theo nguyên gốc. Tuy nhiên, để kiểm thử, bạn có thể sử dụng các phương thức này trên máy bằng cách bật cờ tính năng Nền tảng web thử nghiệm (Mở chrome://flags/#enable-experimental-web-platform-features trong Chrome).
Hãy xem cách sử dụng các API này.
Nhận ngân sách
Bạn có thể tìm thấy ngân sách hiện có bằng phương thức getBudget()
. Một số trình duyệt (như Chrome) sẽ có ngân sách "giảm dần" theo thời gian, vì vậy, để cung cấp cho bạn chế độ hiển thị đầy đủ, phương thức này sẽ trả về một mảng BudgetStates
, cho biết ngân sách của bạn sẽ là bao nhiêu tại nhiều thời điểm trong tương lai.
Để liệt kê các mục nhập ngân sách mà chúng ta có thể chạy:
navigator.budget.getBudget()
.then((budgets) => {
budgets.forEach((element) => {
console.log(\`At '${new Date(element.time).toString()}' \` +
\`your budget will be '${element.budgetAt}'.\`);
});
});
Mục đầu tiên sẽ là ngân sách hiện tại của bạn và các giá trị bổ sung sẽ cho biết ngân sách của bạn tại nhiều thời điểm trong tương lai.
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'.
Một trong những lợi ích của việc đưa vào mức hao tổn ngân sách trong tương lai là nhà phát triển có thể chia sẻ thông tin này với phần phụ trợ để điều chỉnh hành vi phía máy chủ (tức là chỉ gửi thông báo đẩy để kích hoạt bản cập nhật khi ứng dụng có ngân sách cho một thông báo đẩy thầm).
Lấy chi phí của một phép toán
Để biết chi phí cho một hoạt động, việc gọi getCost()
sẽ trả về một số cho biết số tiền ngân sách tối đa sẽ được tiêu thụ nếu bạn gọi reserve()
cho toán tử đó.
Ví dụ: chúng ta có thể tìm hiểu chi phí không hiển thị thông báo khi bạn nhận được thông báo đẩy (tức là chi phí của thông báo đẩy không âm thanh) bằng mã sau:
navigator.budget.getCost('silent-push')
.then((cost) => {
console.log('Cost of silent push is:', cost);
})
.catch((err) => {
console.error('Unable to get cost:', err);
});
Tại thời điểm viết bài, Chrome 60 sẽ in:
Cost of silent push is: 2
Một điều cần lưu ý khi dùng phương thức reserve()
và getCost()
là chi phí thực tế của một hoạt động có thể thấp hơn chi phí mà getCost()
trả về.
Bạn vẫn có thể đặt trước một thao tác nếu ngân sách hiện tại của bạn thấp hơn chi phí được chỉ định. Thông tin chi tiết cụ thể trong quy cách như sau:
Đó là API hiện tại trong Chrome và khi web tiếp tục hỗ trợ các API mới yêu cầu khả năng thực hiện công việc trong nền, chẳng hạn như tìm nạp trong nền, bạn có thể sử dụng API Ngân sách để quản lý số lượng thao tác mà bạn có thể thực hiện mà không cần thông báo cho người dùng.
Khi bạn sử dụng API, vui lòng gửi ý kiến phản hồi trên Kho lưu trữ GitHub hoặc báo lỗi Chrome tại crbug.com.