این آزمایشگاه کد، گام به گام، نحوه ساخت یک کلاینت اعلان فشاری را به شما نشان میدهد. در پایان این آزمایشگاه کد، کلاینتی خواهید داشت که:
- کاربر را برای دریافت اعلانهای فوری (Push Notifications) مشترک میکند.
- پیامهای فوری را دریافت میکند و آنها را به عنوان اعلان نمایش میدهد.
- کاربر را از دریافت اعلانهای فوری (push notifications) لغو اشتراک میکند.
این آزمایشگاه کد بر کمک به شما در یادگیری از طریق عمل متمرکز است و زیاد در مورد مفاهیم صحبت نمیکند. برای آشنایی با مفاهیم اعلانهای پوش نوتیفیکیشن ، بخش «نحوه کار پوش نوتیفیکیشن» را مطالعه کنید.
کد سرور این آزمایشگاه کد از قبل کامل شده است. شما فقط کلاینت را در این آزمایشگاه کد پیادهسازی خواهید کرد. برای یادگیری نحوه پیادهسازی یک سرور اعلان فشار، به Codelab: Build a push notification server مراجعه کنید.
سازگاری با مرورگرها
این codelab با سیستم عاملها و مرورگرهای ترکیبی زیر کار میکند:
- ویندوز: کروم، اج
- macOS: کروم، فایرفاکس
- اندروید: کروم، فایرفاکس
این codelab با سیستم عاملهای زیر (یا ترکیب سیستم عامل و مرورگر) کار نمیکند :
- macOS: بریو، اج، سافاری
- آیاواس
راهاندازی
برای قابل ویرایش کردن پروژه، روی «Remix to Edit» کلیک کنید.
تنظیم احراز هویت
قبل از اینکه بتوانید اعلانهای پوش نوتیفیکیشن را فعال کنید، باید سرور و کلاینت خود را با کلیدهای احراز هویت تنظیم کنید. برای اطلاع از دلیل آن، به بخش «امضای درخواستهای پروتکل وب پوش» مراجعه کنید. معمولاً، شما اطلاعات محرمانه را در یک فایل .env ، مشابه این، ذخیره میکنید.
VAPID_PUBLIC_KEY="BKiwTvD9HA…" VAPID_PRIVATE_KEY="4mXG9jBUaU…" VAPID_SUBJECT="mailto:[email protected]" -
public/index.jsرا باز کنید. - به جای
VAPID_PUBLIC_KEY_VALUE_HERE، مقدار کلید عمومی خود را وارد کنید.
ثبت نام یک کارگر خدماتی
کلاینت شما برای دریافت و نمایش اعلانها به یک سرویس ورکر نیاز دارد. بهتر است سرویس ورکر را در اسرع وقت ثبت کنید. برای اطلاعات بیشتر به بخش «دریافت و نمایش پیامهای ارسالی به عنوان اعلان» مراجعه کنید.
کد زیر را جایگزین کامنت
// TODO add startup logic hereکنید:if ('serviceWorker' in navigator && 'PushManager' in window) { navigator.serviceWorker.register('./service-worker.js').then(serviceWorkerRegistration => { console.info('Service worker was registered.'); console.info({serviceWorkerRegistration}); }).catch(error => { console.error('An error occurred while registering the service worker.'); console.error(error); }); subscribeButton.disabled = false; } else { console.error('Browser does not support service workers or push messages.'); } subscribeButton.addEventListener('click', subscribeButtonHandler); unsubscribeButton.addEventListener('click', unsubscribeButtonHandler);در Chrome، DevTools Console را باز کنید .
شما باید پیام
Service worker was registered.logged to the Console» را ببینید.
درخواست مجوز اعلانهای فوری
شما هرگز نباید هنگام بارگذاری صفحه، درخواست مجوز برای ارسال اعلانهای فوری (push notification) کنید. در عوض، رابط کاربری شما باید از کاربر بپرسد که آیا میخواهد اعلانهای فوری دریافت کند یا خیر. پس از تأیید صریح آنها (مثلاً با کلیک روی یک دکمه)، میتوانید فرآیند رسمی دریافت مجوز اعلان فوری از مرورگر را آغاز کنید.
در
public/index.jsکد زیر را جایگزین کامنت// TODOدرsubscribeButtonHandler()کنید:// Prevent the user from clicking the subscribe button multiple times. subscribeButton.disabled = true; const result = await Notification.requestPermission(); if (result === 'denied') { console.error('The user explicitly denied the permission request.'); return; } if (result === 'granted') { console.info('The user accepted the permission request.'); }به برگه برنامه برگردید و روی «اشتراک برای ارسال» کلیک کنید. مرورگر یا سیستم عامل شما از شما میپرسد که آیا میخواهید به وبسایت اجازه دهید اعلانهای فوری برای شما ارسال کند یا خیر.
گزینه Allow (یا عبارت معادل آن که توسط مرورگر یا سیستم عامل شما استفاده میشود) را انتخاب کنید. در کنسول باید پیامی مبنی بر پذیرفته شدن یا رد شدن درخواست مشاهده کنید.
برای دریافت اعلانهای فوری مشترک شوید
فرآیند اشتراک شامل تعامل با یک سرویس وب است که توسط فروشنده مرورگر کنترل میشود و سرویس پوش (push service) نام دارد. پس از دریافت اطلاعات اشتراک پوش نوتیفیکیشن، باید آن را به یک سرور ارسال کنید و سرور آن را در یک پایگاه داده برای مدت طولانی ذخیره کند.
کد هایلایت شده زیر را به
subscribeButtonHandler()اضافه کنید:subscribeButton.disabled = true; const result = await Notification.requestPermission(); if (result === 'denied') { console.error('The user explicitly denied the permission request.'); return; } if (result === 'granted') { console.info('The user accepted the permission request.'); } const registration = await navigator.serviceWorker.getRegistration(); const subscribed = await registration.pushManager.getSubscription(); if (subscribed) { console.info('User is already subscribed.'); notifyMeButton.disabled = false; unsubscribeButton.disabled = false; return; } const subscription = await registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: urlB64ToUint8Array(VAPID_PUBLIC_KEY) }); notifyMeButton.disabled = false; fetch('/add-subscription', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(subscription) });
گزینه userVisibleOnly باید true باشد. ممکن است روزی بتوان پیامها را بدون نمایش اعلانهای قابل مشاهده برای کاربر ( پوششهای بیصدا ) ارسال کرد، اما مرورگرها به دلیل نگرانیهای مربوط به حریم خصوصی، این قابلیت را اجازه نمیدهند.
مقدار applicationServerKey به یک تابع کاربردی متکی است که یک رشته base64 را به Uint8Array تبدیل میکند. این مقدار برای احراز هویت بین سرور شما و سرویس push استفاده میشود.
لغو اشتراک از اعلانهای فوری
بعد از اینکه کاربر در دریافت اعلانهای فوری مشترک شد، رابط کاربری شما باید راهی برای لغو اشتراک ارائه دهد تا در صورتی که کاربر نظر خود را تغییر داد و دیگر نمیخواهد اعلانهای فوری دریافت کند، بتواند آن را لغو کند.
- کد زیر را جایگزین کامنت
// TODOدرunsubscribeButtonHandler()کنید:
const registration = await navigator.serviceWorker.getRegistration(); const subscription = await registration.pushManager.getSubscription(); fetch('/remove-subscription', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({endpoint: subscription.endpoint}) }); const unsubscribed = await subscription.unsubscribe(); if (unsubscribed) { console.info('Successfully unsubscribed from push notifications.'); unsubscribeButton.disabled = true; subscribeButton.disabled = false; notifyMeButton.disabled = true; } دریافت پیام فوری و نمایش آن به عنوان اعلان
همانطور که قبلاً ذکر شد، شما به یک سرویس ورکر نیاز دارید تا دریافت و نمایش پیامهایی که از سرور شما به کلاینت ارسال شدهاند را مدیریت کند. برای جزئیات بیشتر به بخش «دریافت و نمایش پیامهای ارسال شده به عنوان اعلان» مراجعه کنید.
public/service-worker.jsرا باز کنید و کد زیر را جایگزین کامنت// TODOدر رویدادpushمربوط به service worker کنید:let data = event.data.json(); const image = 'logo.png'; const options = { body: data.options.body, icon: image } self.registration.showNotification( data.title, options );به برگه برنامه برگردید.
روی «به من اطلاع بده » کلیک کنید. باید یک اعلان فوری دریافت کنید.
آدرس اینترنتی (URL) تب برنامه خود را در سایر مرورگرهای پشتیبانیشده باز کنید. از طریق گردش کار اشتراک، روی «اطلاعرسانی به همه» کلیک کنید. باید در همه آنها اعلان فشاری یکسانی دریافت کنید.
شما میتوانید اعلان را به روشهای زیادی سفارشی کنید. برای کسب اطلاعات بیشتر، به پارامترهای ServiceWorkerRegistration.showNotification() مراجعه کنید.
باز کردن یک URL وقتی کاربر روی یک اعلان کلیک میکند
در دنیای واقعی، احتمالاً از اعلان به عنوان راهی برای جذب مجدد کاربر و ترغیب او به بازدید از سایت خود استفاده خواهید کرد. برای انجام این کار، باید سرویس ورکر خود را کمی بیشتر پیکربندی کنید.
کد زیر را جایگزین کامنت
// TODOدر هندلر رویدادnotificationclickسرویس ورکر کنید:event.notification.close(); event.waitUntil(self.clients.openWindow('https://web.dev'));به برگه برنامه برگردید، یک اعلان دیگر برای خودتان ارسال کنید و سپس روی اعلان کلیک کنید. مرورگر شما باید یک برگه جدید باز کند و
https://web.devبارگذاری کند.
مراحل بعدی
- برای آشنایی با روشهای مختلف سفارشیسازی اعلانها، به
ServiceWorkerRegistration.showNotification()نگاهی بیندازید. - برای درک مفهومی عمیقتر از نحوه عملکرد اعلانهای فشاری ، مرور کلی اعلانهای فشاری را مطالعه کنید.
- برای یادگیری نحوه ساخت سروری که اشتراکها را مدیریت میکند و درخواستهای پروتکل web push را ارسال میکند، Codelab: Build a push notification server را بررسی کنید.
- برای آزمایش تمام روشهای سفارشیسازی اعلانها، از Notification Generator استفاده کنید.