3. Innhold
1. Hva er progressive web applications?
2. Web app manifest
3. Service Workers
4. Offline
5. Web push
4. Hva er Progressive Web Applications?
Webapplikasjoner som n脱rmer seg native applikasjoner i funksjonalitet
Samlebetegnelse for et sett med APIer og praksiser
5. PWA sjekkliste
Kj淡rer p奪 kryptert forbindelse (https)
Responsivt design
Virker i alle nettlesere
Gir respons n奪r nettleser er offline
Laste raskt ogs奪 p奪 treigt nett
Web app manifest
Mulighet for server push
7. Caniuse?
God st淡tte i Firefox, Chrome og Opera
St淡tte bak konfig-flagg i Edge
St淡tte p奪 vei i Safari
8. Web app manifest
Startpunkt for app
Lar deg kj淡re fullscreen p奪 mobil
Framst奪r som native app for det utrente 淡ye
10. Service workers
Fundamentet for mye av PWA
En spesialisering av web workers
Kj淡rer i bakgrunnen
Har ikke direkte tilgang til DOM
Bruker meldinger for 奪 kommunisere med webside
11. Livsl淡pet til en service worker
Installeres ved f淡rste lasting
Aktiv ved neste lasting
Reinstalleres n奪r service worker script har endret seg
Gammel versjon aktiv s奪 lenge den har 奪pne sider
12. Begrensninger p奪 service workers
Kun 辿n service worker per kontekst
M奪 serves fra rot-katalogen til det den skal kontrollere
Kun HTTPS
Ikke tilgang til dokument (DOM)
Kun et subset av navigator API
13. Service workers som cache
Har egen API for 奪 cache requests
Service workers kan fange opp alle requests
Kan svare med lagret ressurs eller annen side
束Som en proxy-server i applikasjonen din損
14. Demo for offline
Demo p奪 https://opensites.kantega.no/tdc/
Pr淡v navigering med og uten nettkobling (束flight mode損 e.l.)
16. Kode for 奪 bruke cache
self.addEventListener("fetch", function(event) {
if (event.request.method !== "GET") {
return;
}
event.respondWith(
caches.match(event.request)
.then(function(response) {
if (response) {
return response;
} else {
return fetch(event.request);
}
}
)
.catch(function(error) {
return caches.match('./pages/offline.html');
})
);
});
17. Web Push
Meldinger fra server til nettleser, ogs奪 n奪r side ikke er aktiv
Mottas som event av service worker
Hver nettleser har sin meldingsserver
Mer komplisert enn de fleste JavaScript-APIer
18. Flyt for web push
Applikasjon
2
3
6
5
4
1. Nettleser f奪r servers offentlige
krypteringsn淡kkel
2. Nettleser registrerer n淡kkel hos
meldingsserver
3. Nettleser varsler
applikasjonsserver om
abonnement
4. Ny hendelse i applikasjonsserver
5. Varsel fra applikasjonsserver til
meldingsserver
6. Verifisert varsel til nettleser
1
19. nei, sa han 束kryptering損?
L脱r deg grunnprinsippene
... og bruk et bibliotek!
20. Web push og sikkerhet
Kan du stole p奪 Google (eller Mozilla)?
Asymmetrisk kryptering / offentlig n淡kkelkryptering brukes for 奪 bevare sikkerhet
Meldinger signeres med applikasjonsservers n淡kkel for 奪 bekrefte opprinnelse
Nettleser lager eget n淡kkelpar
Meldinger krypteres med nettlesers offentlige n淡kkel s奪 den kun kan leses av
nettleser
21. Kode for registrering av abonnement
navigator.serviceWorker.getRegistration().then(function(serviceWorkerRegistration) {
var options = {
userVisibleOnly: true,
applicationServerKey: base64ToArrayBuffer(SERVER_PUBLIC_KEY)
};
serviceWorkerRegistration.pushManager.subscribe(options).then(function(pushSubscription) {
var params = new URLSearchParams();
params.append("endpoint", pushSubscription.endpoint);
params.append("clientKey", arrayBufferToBase64(pushSubscription.getKey("p256dh")));
params.append("sharedSecret", arrayBufferToBase64(pushSubscription.getKey("auth")));
fetch("../api/subscribe", {
method: "POST",
body: params
}).then(function(response) {
if (response.ok) {
console.log("Subscription sent to server");
}
});
});
});
22. Kode for 奪 sende melding til meldingsserver
private void notifyClients(String message) {
byte[] encodedMessage = message.getBytes(Charset.forName("UTF-8"));
for (Subscription subscription : SubscriptionStore.getSubscriptions()) {
Notification notification = new Notification(subscription.getEndpoint(),
subscription.getClientKey(),
subscription.getSharedSecret(),
encodedMessage);
executorService.execute(() -> {
try {
HttpResponse response = pushService.send(notification);
} catch (Exception e) {
log.warn("Notify for {} threw execption {}: {}",
subscription.getEndpoint(), e.getClass().getName(), e.getMessage());
}
});
}
}
23. Demo for push
Ta opp demo p奪 https://opensites.kantega.no/tdc/ og g奪 til 束Meldinger損
Huk av sjekkboks for 奪 starte abonnement p奪 push-meldinger