112 Suomi -sovellus sai päivityksen, jonka myötä alueelliset vaaratiedotteet lähetetään myös sovelluksen kautta. Juhana Leinonen avaa blogissa, miten sovelluksen vaaratiedoteominaisuus käytännössä toteutettin.
Digia julkaisi tammikuussa päivityksen 112 Suomi -mobiilisovellukseen. Qt-pohjainen sovellus kirjoitettiin alusta asti täysin uudelleen React Native -teknologialla. React Nativessa sovelluksen toimintalogiikka ohjelmoidaan JavaScript-koodilla, jonka React Native yhdistää natiiviin koodiin. Sama koodi toimii yhtäläisesti sekä Android- että iOS-laitteissa.
Kuten Qt:n, myös React Nativen käyttö voi lähes puolittaa sovelluksen kehitysajan, sillä samaa koodia ei tarvitse kirjoittaa erikseen kahdelle eri alustalle. Se myös sopii hyvin Digian nykyiseen teknologiapohjaan, sillä suuri osa Digian uusista mobiiliratkaisuista toteutetaan jo React Native -pohjaisina.
Uutena ominaisuutena 112 Suomi -sovellukseen tuotiin paikallisten vaaratiedotteiden vastaanottaminen suoraan puhelimeen siten, että vain vaara-alueella olevat laitteet näyttävät tiedotteen. Vaaratiedotteet toteutettiin Googlen Firebase Cloud Messaging (FCM) -palvelun avulla. Alueelliset vaaratiedotteet on paljon toivottu viranomaistiedottamisen lisäpalvelu, jonka ansiosta vain ne henkilöt, joita asia koskee saavat tiedotteen eikä vaara-alueen ulkopuolella olevia tarvitse häiritä.
Kun Hätäkeskuslaitos lähettää 112 Suomi -sovellukseen vaaratiedotteen, sen ensimmäinen etappi on Digian 112 Suomi -pilvipalvelu. Tiedotteet lähtevät sieltä FCM-palveluun, joka hoitaa niiden edelleen välittämisen sekä iOS- että Android-puhelimiin. Samanaikaisesti pilvipalvelu tallentaa tiedotteet omaan tietokantaansa, josta 112 Suomi -mobiilisovellus voi hakea ne silloin kun käyttäjä avaa sovelluksessa olevan tiedotelistauksen.
Koska tiedotteet ovat paikkakohtaisia, sovelluksen pitää tarkistaa käyttäjän sijainti ennen tiedotteen näyttämistä, jotta vain tiedotteessa määritetyllä alueella olevat saavat ilmoituksen tiedotteesta. FCM ei voi lähettää tavallista notifikaatiota suoraan puhelimiin, koska FCM tai 112 Suomi -pilvipalvelu eivät tiedä laitteiden sijaintia, jolloin notifikaation kohdentaminen vain tiettyihin laitteisiin ei ole mahdollista. Tiedotteet pitää siksi lähettää kaikkiin laitteisiin “hiljaisina” datanotifikaatioina. Nämä datapaketit eivät suoraan näytä notifikaatiota, vaan ne herättävät suljetun tai taustalla pyörivän 112 Suomi -sovelluksen siksi aikaa, että laitteen sijainti voidaan hetkellisesti tarkistaa. Havaitsemansa sijainnin perusteella sovellus itse päättää näytetäänkö tiedote käyttäjälle.
Jos puhelin ei ole tiedotteessa määritellyllä alueella, sovellus asettaa geofencen, joka näyttää tiedotteen vasta kun laite siirtyy alueen sisälle. Geofence on käyttöjärjestelmätason toiminto, joka seuraa ajoittain laitteen sijaintia ja laukaisee määritellyn toiminnon, kun laite siirtyy tietyn alueen rajojen yli. Tässä tapauksessa toiminto on tiedotteen näyttäminen notifikaationa ja äänimerkin antaminen.
112 Suomi -sovelluksen perustoiminnot mukaan lukien tarvitsimme siis geopaikannusjärjestelmän, joka toimisi luotettavasti kaikissa tilanteissa: aktiivisesti sovelluksen ollessa käynnissä ja taustalla tiedotteiden saapuessa puhelimeen. Sovelluksen pitää lisäksi seurata paikkatietoa aktiivisesti taustalla silloin, kun sen kautta soitetaan hätäkeskukseen. Paikkatietotoimintojen lähes kaikki mahdolliset variaatiot ovat siis käytössä.
Valmista ratkaisua, joka olisi suoraan toiminut tähän käyttötarkoitukseen ei luonnollisesti löytynyt. Lopullinen toteutus on yhdistelmä valmiita kirjastoja ja tarkoitusta varten tehtyä natiivikoodia. Räätälöityä natiivikoodia käytetään mm. geofence-alueiden asettamiseen ja ilmoitusten näyttämiseen silloin kun sovellus on taustalla tai kokonaan suljettuna.
Natiivikoodin yhdistäminen JavaScript-moottoriin on yksinkertaista. Java- tai Objective-C-koodissa merkitään halutut metodit JavaScript-puolen käytettäväksi. Tämän jälkeen niitä voidaan kutsua JavaScript-koodista samalla tavoin kuin muitakin React Nativen metodeja. Menetelmä on itse asiassa täysin sama kuin mitä React Native itse käyttää omissa rajapinnoissaan.
Joustavuus natiivin koodin ja JavaScriptin välillä mahdollistaa nopean sovelluskehityksen ja riittävästi ratkaisuvaihtoehtoja, jos React Nativen omat toiminnallisuudet eivät riitä kaikkien ominaisuuksien toteuttamiseen. Haittapuolena voidaan pitää sitä, että natiivikoodia käytettäessä koodipohja on eri Android- ja iOS alustoille. Oikein modularisoituna räätälöity natiivikoodi ei kuitenkaan riko “yksi koodi kahdelle alustalle”-periaatetta JavaScriptin puolella, vaan se näyttäytyy yhtenäisenä rajapintana, joka eriytyy alustakohtaisiin moduuleihin näkymättömissä pinnan alla.
Useimmissa React Native -projekteissa kehittäjien ei kuitenkaan koskaan tarvitse koskea natiivikoodiin. Lähes kaikkiin puhelimissa saatavilla oleviin toimintoihin löytyy joko valmis rajapinta suoraan React Nativessa tai saatavilla on kirjasto, joka sisältää tarvittavan natiivikoodin. 112 Suomi -projekti oli luonteeltaan erilainen, sillä vaaratiedoteominaisuus on määrittelyiltään ja vaatimuksiltaan ainutlaatuinen. Mobiililaitteiden paikannus- ja ilmoitustoiminnot on suunniteltu hyvin toisenlaisiin käyttötarkoituksiin ja pääsimme toteuttamaan uusia ratkaisuja, jotta tiedotetoiminto saatiin toimimaan määritysten mukaisesti.