Internet

Gør dine webapps offline-beredte

Google Gears er en browserplug'in, som kan gøre webapplikationer anvendelige, når browseren er offline. Det benytter Google selv i Gmail, Google Docs og Calendar, men teknologien kan anvendes af alle og bruges også af blandt andre Myspace og huskelistetjenesten Remember The Milk. Se her, hvordan du gør dine webapps offline-beredte.

Webapplikationer er herlige. De serverbaserede applikationer kan efterhånden bruges til en hel del, og pist væk er hæslige USB-nøgler og utallige krydsopdateringer mellem arbejds-pc'en, hjemme-pc'en, laptoppen og netbooken, der aldrig rigtig lykkes. Det er såre godt alt sammen, men hvad gør man, når pc'en er offline? Det er der råd for med browserplugin'en Google Gears, som findes til de største browsere på Windows, Mac og Linux.
Google Gears kan via Javascript tilbyde en relationsdatabase samt en 'LocalServer', der, som navnet siger, kan svare lokalt på forespørgsler, når der ikke er forbindelse til nettet, samt en WorkerPool, der gør det muligt at udføre opgaver asynkront, ved siden af web-GUI'ets tråde. Plugin'en er knyttet til den browser, den er installeret i, så lokale data på en pc ikke kan deles mellem browsere. Det ville være forkert at sige, at Gears' programmeringsmodel er lige ud ad landevejen. Der er tale om et komplekst miljø, hvor der er mange ting at holde styr på. Men med tungen lige i munden går det lige an.
Udgangspunktet for en Gears-applikation er en manifest-fil, som beskriver de ressourcer, HTML-dokumenter og Javascript-filer, der skal være tilgængelige, når applikationen er i offline-tilstand. Hvordan applikationen skal håndtere offline-tilstanden, skal man selv finde ud af. Den strategi, som Google anvender i sine egne applikationer, er at detektere, om der er netadgang. Hvis ikke, gemmes brugernes ressourcer, som for eksempel et tekstdokument, lokalt. Når der igen er netadgang, synkroniseres dokumentet i en baggrundsproces. Man skal også tænke over, hvad der skal ske i tilfælde af synkroniseringskonflikter. Google Gears har ikke nogen biblioteker til synkronisering, så her er udvikleren på egen hånd.

Ajax + Gears = Offline-himmel

Lad os kigge nærmere på et simpelt eksempel - en minimal web-notesblok. Først downloades Google Gears-plugin'en. En webapplikation, som benytter Google Gears, skal som nævnt indeholde en manifest.json-fil, som i JSON-formatet beskriver, hvilke ressourcer der skal kunne tilgås offline. Derudover indeholder manifest-filen en 'version'-attribut, som man kan sætte, som man vil. Vores ser ud som i eksempel 1. Det associative array 'entries' indeholder her blot filen index.html og Googles Javascript-bibliotek gears_init.js. For at gøre en html-side Gears-beredt indsættes Javascripten-stumpen i eksempel 2.
Nu kan Gears' offline-API'er bruges, som man lyster. Database-API'et er selvfølgelig det mest nyttige. Det bygger på den lille database SQLite, der opfører sig som de fleste andre relationsdatabaser. Eksempel 3 viser, hvordan databasen anvendes fra Javascript.
Der er én tilsyneladende mangel i Gears, og det er en facilitet, som kunne detektere, om browseren er online eller offline. Denne 'mangel' er bevidst, da Google skriver, at man ikke kan regne med, om et succesfuldt 'ping' via et Ajax-kald borger for, at forbindelsen er i orden.
I stedet opfordrer Googles udviklere til at sætte alle opdateringer i kø via Gears' database og dernæst forsøge at sende opdateringerne til serveren via et Ajax-kald, én efter én. Hvis opdateringen på serversiden glipper, prøves igen lidt senere. Når opdateringen er vel overstået, ved at serveren giver et bekræftende svar, kan opdateringerne slettes fra køen. Fremgangsmåden er for stor en mundfuld til denne artikel, men vi lader opfordringen gå videre til læseren.
Vi har samlet vore foreløbige erfaringer i en lille testapplikation, som kan downloades fra prosa.dk/link/331. Applikationen er som sagt en simpel web-notesblok. Når filen index.html kaldes, aktiveres et Ajax-kald til serveren, som henter den sidst gemte note. Hvis serveren ikke svarer, gætter vi på, at vi er offline-tilstand, og henter i stedet den sidst gemte note fra den lokale Gears-database. Serverfilerne er skrevet i PHP, men det er nu den mindste del af det. Når brugeren klikker på 'Gem'-knappen, gemmer vi først lokalt og så på serveren. Der er masser af dokumentation hos Google, men den kan godt forvirre lidt, så kig godt på eksemplerne, der som regel forklarer det meste.