در این لبه کد، از یک سرویسکار برای مدیریت اعلانها استفاده میکنید. دستورالعملهای اینجا فرض میکنند که شما قبلاً با سرویسکاران و اصول اولیه درخواست مجوز اعلان و ارسال اعلانها آشنا هستید. اگر به بازخوانی در اعلانها نیاز دارید، به « شروع با کدنویسی Notifications API» مراجعه کنید. برای کسب اطلاعات بیشتر در مورد کارگران خدماتی، به مقدمه مت گانت برای کارگران خدماتی مراجعه کنید.
با نمونه برنامه و کد شروع آشنا شوید
با نگاه کردن به برنامه زنده در برگه جدید Chrome شروع کنید:
- «Control+Shift+J» (یا «Command+Option+J» در Mac) را فشار دهید تا DevTools باز شود.
روی تب Console کلیک کنید.
مطمئن شوید که گزینه Info در منوی Levels در کنار کادر فیلتر انتخاب شده باشد.
در کنسول DevTools برای برنامه زنده خود، باید یک پیام کنسول را مشاهده کنید:
TODO: Implement getRegistration().این پیامی از یک تابع خرد است که در این کد لبه پیادهسازی خواهید کرد.
حالا بیایید نگاهی به کد برنامه نمونه بیندازیم.
نگاهی به
public/index.jsبیندازید:برای توابعی که پیاده سازی خواهید کرد، چهار خرد وجود دارد:
registerServiceWorker،getRegistration،unRegisterServiceWorker، وsendNotification.تابع
requestPermissionاز کاربر برای ارسال اعلانها اجازه میخواهد. اگر شروع به کار با Codelab Notifications API را انجام داده باشید، متوجه خواهید شد که تابعrequestPermissionآن در اینجا استفاده می شود. تنها تفاوت این است که اکنون پس از رفع درخواست مجوز، رابط کاربری را نیز به روز می کند.عملکرد
updateUIهمه دکمه ها و پیام های برنامه را تازه می کند.تابع
initializePageتشخیص ویژگی را برای قابلیت سرویس کار در مرورگر انجام می دهد و رابط کاربری برنامه را به روز می کند.اسکریپت منتظر می ماند تا صفحه بارگیری شود و سپس آن را مقداردهی اولیه می کند.
public/service-worker.jsباز کنید.همانطور که از نام پیداست، کدی را به برنامه اضافه میکنید تا این فایل را بهعنوان یک سرویسدهنده ثبت کنید.
اگرچه این فایل هنوز توسط برنامه استفاده نمیشود، اما حاوی مقداری کد شروع است که وقتی سرویسکار فعال شود، پیامی را به کنسول چاپ میکند.
کدی را به
public/service-worker.jsاضافه میکنید تا اعلانها را زمانی که کارمند خدمات دریافت میکند، مدیریت کند.
کارگر خدماتی را ثبت کنید
در این مرحله، کدی را می نویسید که وقتی کاربر روی Register service worker در رابط کاربری برنامه کلیک می کند، اجرا می شود. این کد public/service-worker.js به عنوان یک سرویس دهنده ثبت می کند.
public/index.jsرا باز کنید. تابعregisterServiceWorkerبا کد زیر جایگزین کنید:// Use the Service Worker API to register a service worker. async function registerServiceWorker() { await navigator.serviceWorker.register('./service-worker.js') updateUI(); }توجه داشته باشید که
registerServiceWorkerاز اعلانasync functionبرای راحتتر کردن رسیدگی به وعدهها استفاده میکند. این به شما امکان می دهدawaitارزش حل شده یکPromiseباشید. به عنوان مثال، عملکرد بالا قبل از بهروزرسانی UI منتظر نتیجه ثبت یک سرویسکار است. برای اطلاعات بیشترawaitدر MDN مراجعه کنید.اکنون که کاربر میتواند یک سرویسکار ثبت کند، میتوانید به شیء ثبت سرویسگر مراجعه کنید. در
public/index.jsتابعgetRegistrationبا کد زیر جایگزین کنید:// Get the current service worker registration. function getRegistration() { return navigator.serviceWorker.getRegistration(); }تابع بالا از Service Worker API برای دریافت ثبت نام سرویس کارگر فعلی، در صورت وجود، استفاده می کند. دریافت ارجاع به ثبت نام کارگر خدماتی را کمی راحت تر می کند.
برای تکمیل عملکرد ثبت نام کارگر سرویس، کدی را برای لغو ثبت نام کارگر سرویس اضافه کنید. تابع
unRegisterServiceWorkerرا با کد زیر جایگزین کنید:// Unregister a service worker, then update the UI. async function unRegisterServiceWorker() { // Get a reference to the service worker registration. let registration = await getRegistration(); // Await the outcome of the unregistration attempt // so that the UI update is not superceded by a // returning Promise. await registration.unregister(); updateUI(); }
در برگه ای که در آن برنامه زنده را مشاهده می کنید، صفحه را دوباره بارگیری کنید. دکمههای Register service worker و Unregister service worker اکنون باید کار کنند.
اعلان ها را برای کارگر خدمات ارسال کنید
در این مرحله، کدی را می نویسید که وقتی کاربر روی Send a notification در رابط کاربری برنامه کلیک می کند، اجرا می شود. این کد یک اعلان ایجاد می کند، بررسی می کند که یک سرویس دهنده ثبت شده است، و سپس اعلان را با استفاده از روش postMessage خود برای سرویس دهنده ارسال می کند.
public/index.js را باز کنید و تابع sendNotification با کد زیر جایگزین کنید:
// Create and send a test notification to the service worker.
async function sendNotification() {
// Use a random number as part of the notification data
// (so you can tell the notifications apart during testing!)
let randy = Math.floor(Math.random() * 100);
let notification = {
title: 'Test ' + randy,
options: { body: 'Test body ' + randy }
};
// Get a reference to the service worker registration.
let registration = await getRegistration();
// Check that the service worker registration exists.
if (registration) {
// Check that a service worker controller exists before
// trying to access the postMessage method.
if (navigator.serviceWorker.controller) {
navigator.serviceWorker.controller.postMessage(notification);
} else {
console.log('No service worker controller found. Try a soft reload.');
}
}
}
در اینجا چیزی است که آن کد انجام می دهد:
sendNotificationیک تابع ناهمزمان است، بنابراین می توانید ازawaitبرای دریافت ارجاع به ثبت نام کارگر سرویس استفاده کنید.روش
postMessageکارمند سرویس داده ها را از برنامه به کارمند سرویس ارسال می کند. برای اطلاعات بیشتر به مستندات MDN در postMessage مراجعه کنید.قبل از تلاش برای دسترسی به تابع
postMessageکد وجود ویژگیnavigator.serviceWorker.controllerرا بررسی می کند. اگر سرویسکار فعالی وجود نداشته باشد، یا اگر صفحه به اجبار رفرش شده باشد (Shift+Reload )navigator.serviceWorker.controllernullخواهد بود. برای اطلاعات بیشتر به مستندات کنترلر ServiceWorker در MDN مراجعه کنید.
رسیدگی به اعلانها در سرویسکار
در این مرحله، کدی را در سرویسکار مینویسید که پیامهای ارسال شده به آن را مدیریت کرده و اعلانها را به کاربر نمایش میدهد.
public/service-worker.js باز کنید. کد زیر را به انتهای فایل اضافه کنید:
// Show notification when received
self.addEventListener('message', (event) => {
let notification = event.data;
self.registration.showNotification(
notification.title,
notification.options
).catch((error) => {
console.log(error);
});
});
در اینجا یک توضیح سریع است:
selfاشاره ای به خود کارگر خدماتی است.در حالی که کارگر سرویس اکنون نمایش اعلانها را کنترل میکند، رابط کاربری اصلی برنامه همچنان مسئول دریافت مجوز اعلان از کاربر است. اگر مجوز داده نشود، قولی که توسط
showNotificationبازگردانده شده است رد می شود. کد بالا از یک بلوکcatchبرای جلوگیری از خطای ردPromiseاستفاده میکند و این خطا را کمی ظریفتر مدیریت میکند.
به سراغ کدهای بعدی در این سری بروید: سرور اعلانهای فشاری بسازید .