Manifesti kuvailee sovelluksen
Nimi, kuvakkeet, aloitusosoite, värit ja avautumistapa kerrotaan selaimelle JSON-muotoisessa manifestitiedostossa.
Verkkosovelluksen käytännön opas
PWA on verkkosovellus, joka voidaan asentaa laitteelle, avata omassa ikkunassaan ja rakentaa toimimaan myös heikolla tai puuttuvalla verkkoyhteydellä. Se on silti pohjimmiltaan verkkosivu: linkitettävä, päivitettävä ja selaimella saavutettava.
Perusajatus
PWA ei ole oma ohjelmointikielensä eikä yksittäinen kirjasto. Sillä tarkoitetaan verkkosovellusta, johon lisätään selaimen tarjoamia sovellusmaisia ominaisuuksia. Ominaisuudet otetaan käyttöön asteittain: jos selain ei tue jotakin toimintoa, perussivuston pitää silti toimia.
Progressive viittaa asteittaiseen parantamiseen. Kokemus mukautuu selaimen ja laitteen kykyihin sen sijaan, että sivu vaatisi jokaiselta käyttäjältä täsmälleen saman ympäristön.
Nimi, kuvakkeet, aloitusosoite, värit ja avautumistapa kerrotaan selaimelle JSON-muotoisessa manifestitiedostossa.
Selaimesta erillinen JavaScript-prosessi voi siepata verkkopyyntöjä, käyttää välimuistia ja vastaanottaa esimerkiksi push-viestejä.
Service worker saa paljon valtaa verkkopyyntöihin, joten se toimii tuotannossa vain suojatussa HTTPS-yhteydessä. Paikallinen localhost on kehityspoikkeus.
Sama sovellus toimii tavallisessa selaimen välilehdessä. Käyttäjä voi asentaa sen, jos selain ja käyttöjärjestelmä tarjoavat asennuksen.
Tausta
Asennettavan verkkosovelluksen historia ei ala yhdestä julkaisusta. Se kasvoi vaiheittain selainten, mobiililaitteiden ja avoimien web-standardien kehittyessä.
Ensimmäisen iPhonen yhteydessä Apple korosti selaimessa toimivia sovelluksia. Sivustoja pystyi lisäämään kotinäytölle, mutta nykyinen service worker -pohjainen offline-malli puuttui.
Selain sai ohjelmoitavan kerroksen sovelluksen ja verkon väliin. Tämä mahdollisti hallitun välimuistin ja verkkoyhteydestä riippumattoman käynnistyksen.
Suunnittelija Frances Berriman ja Chrome-insinööri Alex Russell nimesivät mallin Progressive Web Appiksi. Ajatus yhdisti webin saavutettavuuden ja linkitettävyyden asennettavan sovelluksen kokemukseen.
Service worker -tuki oli saatavilla Chromessa, Firefoxissa, Edgessä ja Safarissa. Toteutusten yksityiskohdissa oli silti eroja.
iOS ja iPadOS 16.4 toivat standardiin perustuvat push-ilmoitukset kotinäytölle lisättyihin web-sovelluksiin sekä tuen kolmansien osapuolten selainten Lisää kotinäytölle -toiminnolle.
Asennus, offline-käyttö ja monet laiterajapinnat toimivat laajasti. Ominaisuuksien saatavuus riippuu kuitenkin edelleen selaimesta, käyttöjärjestelmästä ja sovelluksen asennustavasta.
Toiminta käytössä
Käyttäjä näkee sivun, mahdollisen asennuksen ja päivitykset. Taustalla service worker käy läpi oman tarkasti määritellyn elinkaarensa.
Mihin se sopii?
Sama verkkoversio palvelee puhelinta, tablettia ja työpöytää. Päivitys julkaistaan palvelimelle, eikä jokaista pientä korjausta tarvitse kierrättää sovelluskaupan tarkastuksen kautta.
Välimuistiin voidaan tallentaa käyttöliittymä, aiemmin avattu sisältö tai kokonainen paikallinen työskentelytila. Verkon palattua muutokset voidaan synkronoida palvelimelle.
Kuvake, erillinen ikkuna ja käyttöjärjestelmän sovellusluettelo tekevät usein käytetystä palvelusta helpommin saavutettavan ilman natiivisovelluksen pakollisuutta.
Sovellukseen voi tulla linkillä, eikä kokeileminen vaadi ensin kauppaa, latausta ja tilaa vievää asennuspakettia. Hakukoneet voivat indeksoida julkista sisältöä.
Selaimen tuesta riippuen sovellus voi käyttää ilmoituksia, kameraa, sijaintia, jakamista, leikepöytää ja tiedostoja. Oikeudet pyydetään silloin, kun käyttäjä ymmärtää niiden tarpeen.
Varaus- ja asiointipalvelut, uutis- ja sisältösovellukset, kenttätyön lomakkeet, tapahtumaoppaat sekä kevyet tuottavuustyökalut hyötyvät usein PWA-mallista.
Reunaehdot
Tekninen mahdollisuus ei vielä tarkoita, että ominaisuus toimii samalla tavalla kaikkialla. Selain on sekä PWA:n vahvuus että sen raja.
Kaikki laiteominaisuudet eivät ole saatavilla kaikissa selaimissa. Esimerkiksi taustatoiminnot, tiedostojen käsittely ja Bluetooth-yhteydet voivat toimia eri tavoin tai puuttua kokonaan.
Asennuspainikkeen paikka ja ehdot riippuvat selaimesta. iPhonessa käyttäjä lisää sovelluksen yleensä jakovalikon kautta kotinäytölle; työpöytäselainten tuki vaihtelee.
Välimuisti ei itsestään ratkaise kirjautumista, muuttuvan tiedon ajantasaisuutta tai ristiriitoja. Vanhentunut tieto voi olla pahempi kuin selkeä ilmoitus verkkoyhteyden tarpeesta.
Jatkuva taustaseuranta, tiukka Bluetooth- tai anturiyhteys, vaativa grafiikka ja syvä käyttöjärjestelmäintegraatio voivat olla luotettavampia natiivisovelluksessa.
Verkosta asennettava PWA ei automaattisesti näy sovelluskaupoissa. Kauppajulkaisu on mahdollinen joillakin alustoilla, mutta sillä on omat paketointi- ja hyväksymisvaatimuksensa.
Valitse PWA, kun linkillä saavutettava ja usealla laitteella toimiva palvelu on tärkeämpi kuin täydellinen pääsy yhden käyttöjärjestelmän kaikkiin ominaisuuksiin. Valitse natiivi, kun laitteen syvä integraatio on tuotteen ydin. Moni palvelu käyttää myös molempia.
Rakennusohje
Alla on pienin järkevä toteutus ilman sovelluskehystä. Tiedostot voi liittää myös React-, Vue- tai muuhun verkkosovellukseen samalla periaatteella.
Tee ensin responsiivinen ja saavutettava verkkosovellus. PWA-ominaisuudet parantavat sitä; ne eivät korjaa huonoa peruskokemusta.
Tallenna esimerkiksi manifest.json ja viittaa siihen jokaisen sivun <head>-osassa.
{
"name": "Oma sovellus",
"short_name": "Sovellus",
"start_url": "./",
"scope": "./",
"display": "standalone",
"theme_color": "#17324d",
"background_color": "#f4f0e8",
"icons": [
{ "src": "icons/icon-192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "icons/icon-512.png", "sizes": "512x512", "type": "image/png" }
]
}
Esimerkki tallentaa sovelluksen rungon asennusvaiheessa ja käyttää verkkopyynnöissä ensin verkkoa, sitten välimuistia.
const CACHE = "oma-sovellus-v1";
const FILES = ["./", "./styles.css", "./app.js"];
self.addEventListener("install", event => {
event.waitUntil(caches.open(CACHE).then(cache => cache.addAll(FILES)));
});
self.addEventListener("fetch", event => {
event.respondWith(
fetch(event.request).catch(() => caches.match(event.request))
);
});
Rekisteröinti tehdään sivun JavaScriptissä. Tuen tarkistus estää virheen vanhemmissa selaimissa.
if ("serviceWorker" in navigator) {
window.addEventListener("load", () => {
navigator.serviceWorker.register("./sw.js");
});
}
Käyttöliittymän staattiset tiedostot voi hakea välimuistista ensin. Ajantasainen data kannattaa hakea verkosta ensin tai päivittää taustalla. Älä tallenna arkaluonteista käyttäjätietoa välimuistiin ilman harkintaa.
Aja sivu localhostissa tai HTTPS-palvelimella. Tarkista selaimen kehittäjätyökaluista manifesti ja service worker, kokeile Offline-tilaa ja testaa oikealla puhelimella.
Ennen julkaisua
Valinnat tallentuvat tälle laitteelle.
Selaintuki muuttuu ajan myötä. Tarkista tuotantoon vietävien ominaisuuksien ajantasainen yhteensopivuus ennen toteutusta.