Tag Archives: paikannus

Sijaintipalvelut iOS-applikaatioissa

Nykyaikaisista älypuhelimista ja tableteista löytyy välineet käyttäjän sijainnin selvittämiseen. Sijaintia voi käyttää mobiiliapplikaatioissa monella tavalla: käyttäjälle voidaan esimerkiksi tarjota lähiympäristöön liittyvää tietoa – esimerkiksi paikallisuutisia, tai käyttäjää voi muistuttaa hänen saapuessaan tärkeään paikkaan. Liikuntasuorituksia kirjaava applikaatio voi muodostaa juoksureitistä kartan tallennettujen GPS-päivitysten perusteella.
iOS SDK tarjoaa monipuolisen paikannuskirjaston nimeltään CoreLocation. Kirjasto toimii rajapintana koodin ja mobiililaitteen fyysisten mittalaitteiden välillä mahdollistaen mm. seuraavat asiat:
  • laitteen sijainnin paikantaminen, parhaimmillaan alle kymmenen metrin tarkkuudella
  • viestittäminen laitteen sijainnin muuttumisesta
  • määritellyille alueille liikkumisen tarkkailu
  • sijainnin tarkkailu ja siitä tiedottaminen applikaation ollessa taustalla
  • applikaation käynnistäminen sijainnin muuttuessa merkittävästi
Paikannuksen musta laatikko
Mobiililaitteet hoitavat laitteen paikannuksen monella tavalla: GPS-paikantimella, Wifi-tukiasemien avulla ja kolmiomittaamalla puhelinmastoja. CoreLocation valitsee automaattisesti sopivimman paikannusmenetelmän, ja tarvittaessa yhdistelmää useasta menetelmästä. Syy automaattiseen paikannusmenetelmän valintaan on laitteen virrankulutuksen minimointi ja paikannusnopeuden maksimointi.
Vaikka paikannusmenetelmän valinnan läpinäkymättömyys kuulostaa kehittämistä rajoittavalta, helpottaa se kehittäjän työtä. Käytännössä kehittäjän tarvitsee valita haluttu sijainnin tarkkuus ja kirjasto hoitaa kaiken muun.
Paikannusprosessi tapahtuu kahden luokan avulla jotka ovat CLLocationManager ja CLLocation.
  • CLLocationManager paikantaa sijiannin ja lähettää tietoa sijainnin muutoksista CLLocationManagerDelegate-protokollan kautta päivityksiä kuuntelevalle delegaatille. Kaikki paikannukseen liittyvät muutettavat asetukset löytyy tästä luokasta
  • CLLocation kuvaa yhtä paikkatietopäivitystä. Olio sisältää aikaleiman, koordinaatit ja päivityksen tarkkuuden metreinä. Mukana on myös tieto liikkeen suunnasta ja nopeudesta.
Kertakäyttöinen vai jatkuva paikannus?
Moni applikaatio tarvitsee sijaintitietoa vain kerran, esimerkiksi käynnistyessään. Yleensä kerran haettu paikkatieto riittää useimpiin tarpeisin. Silloin on järkevää että CLLocationManager hakee käyttäjän sijaintia vain kun paikkatietoa ei ole haettu, tai viimeisin paikkatietopäivitys on liian vanha tai epätarkka. Yleensä applikaatioihin riittää yksi jaettu CLLocationManager-olio jonka location-propertyä muu applikaatio käyttää. Jaettu CLLocationManager laitetaan silloin hakemaan käyttäjän sijaintia, ja haku päätetään kun tarpeeksi tarkka sijainti on löydetty. Tämän jälkeen jaetussa CLLocationManager-oliossa on tallessa viimeisin haettu sijainti tallennettuna location-propertyyn josta sijaintia tarvitsevat applikaation osat sitä voivat kysyä. On syytä tarkastaa location-propertyn aikaleima, sillä applikaation käynnistyessä tai palatessa taustalta viimeisin sijaintipäivitys voi olla liian vanha kertomaan käyttäjän nykyisen sijainnin.

Paikannus applikaation ollessa taustalla
Sijainnin paikantamista voi jättää päälle kun applikaatio siirtyy taustalle ajoon. Paikannusmenetelmiä on kolme erilaista:
  1. startUpdatingLocation – jatkuva ja tarkka sijainnin päivitys
  2. startMonitoringSignificantLocationChanges – epätarkka ja harvoin päivittyvä sijainnin seuraaminen
  3. startMonitoringForRegion: – tarkkailee liikkuuko laite määritellyn alueen sisälle tai pois alueelta. Alueita voi olla seurannassa yhtäaikaisesti 20 kappaletta.

Kolmesta edellämainitusta menetelmästä ensimmäinen on tarkin, ja sen ollessa käynnissä applikaatio pysyy koko ajan taustalla ajossa. Tämä on paras vaihtoehto jos paikannusta käyttää esimerkiksi liikuntasovellukseen tai reittioppaaseen. Haittapuolena on jatkuva akun kuluminen.

Kaksi jälkimmäistä seurantatapaa kuluttaa vähemmän akkua kuin ensimmäinen, eikä applikaatio jää päälle taustalle. Nämä menetelmät kuitenkin käynnistävät applikaation, ja sijaintipaikannus pysyy päällä vaikka laitteen sammuttaisi ja käynnistäisi uudestaan.

Sijaintipalveluiden käyttö taustalla XCode-projektiss
a
  1. lisää CoreLocation.framework projektiin.
  2. Ota käyttöön Background modes Capabilities-näkymästä. Se löytyy projektin targetista.
  3. Valitse Location updates. Applikaatio saa nyt päivityksiä sijainnista ollessaan taustalla.
CoreLocationin haasteet ja ongelmat
Laitteen sijainnin hakeminen yksittäistä käyttökertaa varten ei ole niin suoraviivaista kuin se voisi olla. Sijainti toimitetaan asynkronisesti CLLocationManagerDelegate-protokollan kautta asynkronisesti. Ei siis ole olemassa suoraa myLocation = getLocation() -tyylistä tapaa hakea sijaintia. Helpoin tapa hakea laitteen sijainti kerra on kutsua CLLocationManager-luokan startUpdatingLocation-metodia. Kutsu käynnistää paikannuksen, ja lähettää normaalisti 3-4 locationManager:didUpdateLocations: -kutsua delegaatille sijainnin päivittymisestä. Paikannus kannattaa lopettaa silloin kun kutsujen mukana tulevien CLLocation-olioiden horizontalAccuracy-attribuutti on tarpeeksi pieni, eli paikannettu sijainti on riittävän tarkka applikaation tarpeisiin.
Haettavan sijainnin halutun tarkkuuden voi määritellä CLLocationManager-olioon, desiredAccuracy-propertyyn. Halutulla sijainnin tarkkuudella on suuri merkitys paikannuksen nopeuteen ja laitteen virran kulutukseen, joten on suositeltavaa että haettavan sijainnin tarkkuus on niin pieni kuin se on välttämätöntä applikaatiolle. Esimerkiksi paikallissäätä tai paikallisuutisia näyttävä applikaatio voi hyvin käyttää kCLLocationAccuracyThreeKilometers-tarkkuutta, kun taas juoksureittiä tallentava applikaatio vaatii tarkimman mahdollisen tarkkuuden, eli kCLLocationAccuracyBest-tarkkuuden.

Lopuksi
Tämä kirjoitus esitteli pintapuolisesti CoreLocation-kirjaston mahdollisuuksia. Moni mielenkiintoinen ja hyödyllinen kirjaston osa, kuten iBeacon-majakat ja CLGeocoder-geokoodauspalvelu, jäivät tässä kirjoituksessa esittelemättä.

Sijaintipalveluiden hyödyntäminen tekee applikaatiosta tilannetietoisen, mutta sijaintipalveluita käyttäessä pitää punnita sijainnista saadut hyödyt ja nopeammin tyhjenevän akun haitat tarkkaan.