Bu codelab'de, bildirimleri yönetmek için bir service worker kullanacaksınız. Buradaki talimatlarda, hizmet çalışanları ile bildirim izni isteme ve bildirim göndermenin temelleri hakkında bilgi sahibi olduğunuz varsayılmaktadır. Bildirimler hakkında bilgi edinmek için Bildirimler API'sini kullanmaya başlama başlıklı codelab'i inceleyin. Hizmet çalışanları hakkında daha fazla bilgi edinmek için Matt Gaunt'un Introduction to service workers (Hizmet çalışanlarına giriş) başlıklı makalesini inceleyin.
Örnek uygulama ve başlangıç kodu hakkında bilgi edinme
Yeni Chrome sekmesinde canlı uygulamaya bakarak başlayın:
- Geliştirici Araçları'nı açmak için `Control+Shift+J` (veya Mac'te `Command+Option+J`) tuşlarına basın.
Konsol sekmesini tıklayın.
Filtre kutusunun yanındaki Düzeyler açılır listesinde Bilgi seçeneğinin belirlendiğinden emin olun.
Canlı uygulamanızın Geliştirici Araçları konsolunda şu konsol mesajını görmeniz gerekir:
TODO: Implement getRegistration()
.Bu, bu codelab'de uygulayacağınız bir işlev saplamasından gelen bir mesajdır.
Şimdi örnek uygulamanın koduna göz atalım.
public/index.js
adresine göz atın:Uygulayacağınız işlevler için dört saplama vardır:
registerServiceWorker
,getRegistration
,unRegisterServiceWorker
vesendNotification
.requestPermission
işlevi, bildirim göndermek için kullanıcının iznini ister. Get started with the Notifications API codelab'i (Bildirimler API'si ile Başlarken codelab'i) tamamladıysanız buradakirequestPermission
işlevinin kullanıldığını fark edeceksiniz. Tek fark, artık izin isteği çözüldükten sonra kullanıcı arayüzünü de güncellemesidir.updateUI
işlevi, uygulamanın tüm düğmelerini ve mesajlarını yeniler.initializePage
işlevi, tarayıcıdaki hizmet çalışanı özelliği algılamasını gerçekleştirir ve uygulama kullanıcı arayüzünü günceller.Komut dosyası, sayfa yüklenene kadar bekler ve ardından sayfayı başlatır.
public/service-worker.js
adlı kişiyi aç.Adından da anlaşılacağı gibi, bu dosyayı service worker olarak kaydetmek için uygulamaya kod eklersiniz.
Dosya henüz uygulama tarafından kullanılmıyor olsa da, hizmet çalışanı etkinleştirildiğinde konsola bir mesaj yazdıracak bazı başlangıç kodları içeriyor.
Service worker bildirim aldığında bunları işlemek için
public/service-worker.js
dosyasına kod ekleyeceksiniz.
Hizmet çalışanını kaydetme
Bu adımda, kullanıcı uygulama kullanıcı arayüzünde Register service worker'ı tıkladığında çalışacak kodu yazacaksınız.
Bu kod, public/service-worker.js
hizmet çalışanını kaydeder.
public/index.js
adlı kişiyi aç.registerServiceWorker
işlevini aşağıdaki kodla değiştirin:// Use the Service Worker API to register a service worker. async function registerServiceWorker() { await navigator.serviceWorker.register('./service-worker.js') updateUI(); }
registerServiceWorker
, sözlerin işlenmesini daha kolay hale getirmek içinasync function
bildirimini kullanır. Bu sayedePromise
değerinin çözümlenmiş değeriniawait
. Örneğin, yukarıdaki işlev, kullanıcı arayüzünü güncellemeden önce bir hizmet çalışanını kaydetme işleminin sonucunu bekler. Daha fazla bilgi içinawait
başlıklı MDN makalesine bakın.Kullanıcı artık bir hizmet çalışanı kaydedebildiğine göre, hizmet çalışanı kayıt nesnesine referans alabilirsiniz.
public/index.js
içindegetRegistration
işlevini aşağıdaki kodla değiştirin:// Get the current service worker registration. function getRegistration() { return navigator.serviceWorker.getRegistration(); }
Yukarıdaki işlev, varsa mevcut Service Worker kaydını almak için Service Worker API'yi kullanır. Bu, hizmet çalışanı kaydına referans almayı biraz daha kolaylaştırır.
Hizmet çalışanı kaydı işlevini tamamlamak için hizmet çalışanının kaydını iptal edecek kodu ekleyin.
unRegisterServiceWorker
işlevini aşağıdaki kodla değiştirin:// 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(); }
Canlı uygulamayı görüntülediğiniz sekmede sayfayı yeniden yükleyin. Hizmet çalışanı kaydet ve Hizmet çalışanı kaydını iptal et düğmeleri artık çalışıyor olmalıdır.
Service worker'a bildirim gönderme
Bu adımda, kullanıcı uygulama kullanıcı arayüzünde Bildirim gönder'i tıkladığında çalışacak kodu yazacaksınız. Bu kod bir bildirim oluşturur, hizmet çalışanının kayıtlı olup olmadığını kontrol eder ve ardından postMessage
yöntemini kullanarak bildirimi hizmet çalışanına gönderir.
public/index.js
bağlantısını açın ve sendNotification
işlevini aşağıdaki kodla değiştirin:
// 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.');
}
}
}
Bu kodun yaptığı işlemler:
sendNotification
, eşzamansız bir işlev olduğundan hizmet çalışanı kaydına referans almak içinawait
işlevini kullanabilirsiniz.Service worker'ın
postMessage
yöntemi, uygulamadan service worker'a veri gönderir. Daha fazla bilgi için postMessage ile ilgili MDN dokümanlarına bakın.Kod,
postMessage
işlevine erişmeye çalışmadan öncenavigator.serviceWorker.controller
özelliğinin varlığını kontrol eder. Etkin bir hizmet çalışanı yoksa veya sayfa zorunlu olarak yenilenmişse (Shift+
Yeniden yükle)navigator.serviceWorker.controller
,null
olur. Daha fazla bilgi için MDN'deki ServiceWorker denetleyici dokümanlarına bakın.
Service worker'daki bildirimleri işleme
Bu adımda, hizmet çalışanında kendisine gönderilen iletileri işleyecek ve kullanıcıya bildirimler gösterecek kodu yazacaksınız.
public/service-worker.js
adlı kişiyi aç. Dosyanın sonuna aşağıdaki kodu ekleyin:
// Show notification when received
self.addEventListener('message', (event) => {
let notification = event.data;
self.registration.showNotification(
notification.title,
notification.options
).catch((error) => {
console.log(error);
});
});
Kısaca açıklayalım:
self
, hizmet çalışanın kendisini ifade eder.Bildirimlerin gösterilmesi artık hizmet çalışanı tarafından yapılsa da bildirim izninin kullanıcıdan alınması için ana uygulama kullanıcı arayüzü sorumludur. İzin verilmezse
showNotification
tarafından döndürülen söz reddedilir. Yukarıdaki kod, yakalanmamış birPromise
reddetme hatasını önlemek ve bu hatayı biraz daha zarif bir şekilde işlemek için bircatch
bloğu kullanır.
Bu serideki bir sonraki codelab olan Build a push notifications server (Push bildirimleri sunucusu oluşturma) başlıklı codelab'e geçin.