All posts by arttu

Sijaintipalvelut iOS-applikaatioissa 2 – Geokoodaus

Edellinen kirjoitukseni oli pintaraapaisu iOS SDK:n CoreLocation-kirjastoon. Kävin läpi kuinka laitteen sijainti saatiin haettua CLLocationManager-luokan avulla leveys- ja pituuspiirin koordinaatit sisältävän CLLocation-olion muodossa. Kuitenkaan pelkät koordinaatit eivät sellaisenaan ole kovin kiinnostavaa tai hyödynnettävää tietoa ja sen takia  koordinaatteihin liittyy usein kysymyksiä kuten “missä tämä paikka on?” ja “mitä täällä paikassa on?”. Vastauksen näihin tarjoaa geokoodaus.

Geokoodaus on osoitteen muuttamista koordinaateiksi, ja käänteinen geokoodaus koordinaattien muuttamista osoitteeksi. CoreLocation tarjoaa kummankin palvelun CLGeocoder-luokassa. Geokoodauksen käyttö ei edellytä paikkatietojen käytön hyväksyntää käyttäjältä. Luokka sisältää kolme metodia geokoodaukseen ja yhden metodin käänteiseen geokoodaukseen.

  • geocodeAddressString:completionHandler: Ottaa parametrinä vapaamuotoisen osoitteen, esimerkiksi “Urho Kekkosen katu 5, 00100 Helsinki”
  • geocodeAddressString:inRegion:completionHandler: Tekee samaa kuin edellinen, mutta toisena parametrina voi antaa aluetta kuvaavan CLRegion-olion jonka sisällä olevia kohteita suositaan tuloksia järjestellessä.
  • geocodeAddressDictionary:completionHandler: Parametrina annetaan NSDictionary johon voi määritellä tarkemmin haettavan alueen esim. kaupungin tai maan perusteella. Esimerkiksi parametrinä annettu NSDictionary @{(id)kABPersonAddressCityKey : @”St. Petersburg”, (id)kABPersonAddressCountryKey : @”United States”} palauttaisi Floridassa olevan St. Petersburgin kaupungin. Dictionaryn kABPersonAddressCountryKey-avaimen arvon ollessa @”Russia“, palauttaa geokoodaaja itänaapurin entistä pääkaupunkia kuvaavan vastauksen.
  • reverseGeocodeLocation:completionHandler: palauttaa listan koordinaatteja vastaavia CLPlacemark-olioita. Parametrina metodi ottaa CLLocation-olion. CLLocation-olion voi luoda ja alustaa CLLocation-oliolla.
Kaikilla neljällä metodilla on samanlainen completion handler. Se sisältää listan CLPlacemark-olioita (joita normaalisti on yksi kappale listassa) ja NSError-olion. CLGeocoding-oliolla on myös metodit isGeocoding ja cancelGeocode. Geokoodauksen kumoaminen saa aikaan kCLErrorGeocodeCanceled-tyyppisen virheilmoituksen.

Mitä täällä on?
CLPlacemark on luokka paikkatietojen esitystä varten. Oliosta löytyy alueesta riippuen mm. seuraavia tietoja:
  • paikan koordinaatit (CLLocation-olion muodossa)
  • Listan alueen maamerkeistä (esim. Golden Gate -silta San Franciscossa), listana NSString-olioita
  • paikan osoitetiodot Address Book -yhteensopivina avain-arvopareina
  • paikan nimi
  • kaupunki ja kaupunginosa
  • mahdollistet läänit ja maakunnat joiden osa paikka on
  • maa, johon paikka kuuluu, sekä maakoodi
  • vesistö tai valtameri jossa paikka sijaitsee

 Vaihtoehto Applen geokoodauspalvelulle
Applen tarjoaman geokoodauspalvelun lisäksi Googlella on Geokoodaus-API. Googlen paikkatietokanta on epäilemättä paljon kattavampi ja tarkempi kuin Applen oma, mutta Applen valmiit CLGeocoding-luokat tarjoavat hyvin nopean tavan muuttaa koordinaatteja informaatioksi ja toisin päin. Yleensä Applen palvelu riittää katuosoitteiden ja kaupunkien nimien muuttamisen koordinaateiksi ja toisin päin. Googlen palvelussa kehittäjä joutuisi itse parsimaan JSON- tai XML-muotoisen vastauksen itse. Mielestäni Applen geokoodauspalvelun suurin puute on maamerkkien, kauppojen, ravintoloiden yms. kiinnostavien kohteiden täydellinen puute. Siitä huolimatta CLGeocoder on riittänyt useimpiin kehittämiini applikaatioihin.

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.

Näin aloitat iOS-kehityksen

Tämän artikkelin tarkoituksena on esitellä iOS-kehittämiseen liittyviä perusasioita ja työkaluja pintapuolisesti. Seuraavissa artikeleissa käydään läpi ympäristöä ja työkaluja ja kielen syntaksia syvemmin esimerkkien avulla.

Miksi kehittää ohjelmia iOS-alustalle?

  • Hyvät kehitystyökalut. Xcode ja Interface Builder
  • Vain kaksi erilaista laitetta huomioitavana. Toisin kuin muilla alustoilla, on iOS-alustalla vain kaksi eri huomioitavaa laitetyyppiä: iPhone ja iPad.
  • Ohjelmien julkaisukanava. App Store on tällä hetkellä maailman suurin mobiiliohjelmien kauppa.
  • Hyvät valmiit UI-komponentit. Hyvältä näyttävien ja toimivien käyttöliittymien teko on helppoa. Valmiiden UI-komponenttien muokkaaminen ei olekaan sitten ihan niin helppoa…
  • Hyvin dokumentoitu ympäristö. Apple on kirjoittanut kattavan dokumentaation iOS-ympäristön rajapinnoista ja luokista.

Tekniset vaatimukset

iOS-ohjelmien kehityksen aloittaminen on vaivatonta ja osittain ilmaista. Osittain ilmaista siksi, että kehitystyökalut on ilmaisia, mutta ilman $99/vuosi maksavaa kehittäjälisenssiä ohjelmia ei voi ajaa laitteella, eikä julkaista App Storessa. Lisäksi aivan kaikki Applen tekemät esimerkit ja oppaat eivät ole esillä muille kuin maksaneille. Ilmaiseksi pääsee kuitenkin lukemaan suurta määrää oppaita ja itse tekemiä ohjelmia voi ajaa simulaattorissa, joten perusteita opetellessa ei tarvitse, eikä välttämättä kannata maksaa mitään.

iOS-kehittämisen aloittamiseen tarvitaan vain kolme asiaa: uudehko Mac-tietokone, Xcode-kehitysympäristö ja iOS SDK.

Ohjelmat kehitetään pääasiassa Mac-tietokoneilla. Ainoa laitteistovaatimus on OS X Snow Leopard -käyttöjärjestelmä, eli versio 10.6, joka on tullut uusien Mac-koneiden mukana vuoden 2009 puolivälistä lähtien.

Pääasiallinen kehitysympäristö on Xcode. Toki ohjelmakoodin kirjoittamiseen voi käyttää jotain muutakin editoria, mutta alussa ei kannata ampua itseään jalkaan, vaan käyttää Xcodea, kunnes koodaaminen alkaa sujua. Xcode on ilmainen, ja ladattavissa iOS Dev Centeristä. Dev Centeristä lataaminen vaatii rekisteröitymisen Apple-kehittäjäksi, mutta se ei onneksi tarkoita sielunsa myymistä Stevelle, eikä maksa mitään. Dev Center sisältää valtavan määrän dokumentaatiota, esimerkkejä ja ohjeita iOS-kehitykseen.

Tällä hetkellä uusin Xcoden uusin versio on 3.2.5 ja iOS SDK:n on 4.2. Molemmat saa ladattua yhtenä pakettina täältä (paketin koko on n. 3,52 GB).

Xcoden projektinäkymä.

Millä kielellä?

iOS-ohjelmat kehitetään pääasiassa Objective-C -kielellä. Se on laajennus C-kieleen ja tuo mukanaan mm. oliomallin, ollen kuitenkin täysin yhteensopiva C:n kanssa. Apple hyväksyy App Storeen vain Objective-C:llä, C:llä ja C++:lla kirjoitettuja ohjelmia, joten muita kieliä ei ohjelmien kehityksessä voi käyttää.

Simulaattorilla vai oikealla laitteella?

Helpoin ja ilmainen tapa tutustua Objective-C -kieleen ja Cocoa Touchiin, on ajaa ohjelmia simulaattorilla. Simulaattori näyttää iPhone- ja iPad-ohjelmat sellaisena kuin ne näkyisivät itse laitteellakin. Huomaa, että simulaattorissa ei toimi ominaisuudet jotka käyttävät kiihtyvyyssensorin lukemia ja GPS-paikanninta ja kompassia käyttävät ominaisuudet eivät toimi simulaattorissa.

Simulaattorin käyttäminen sopii hyvin iOS-ohjelmoinin opetteluun; se käynnistyy nopeasti ja toimii nopeasti. Valmiin ohjelman lopullinen testaaminen on kuitenkin syytä suorittaa oikealla laitteella, sillä ohjelma saattaa käyttäytyä hieman eri tavalla kuin simulaattorissa. Fyysisen laitteen käyttäminen kehittämisessä edellyttää iOS Developer Program -jäsenyyttä, joka maksaa $99 vuodessa. Jäsenyys mahdollistaa ohjelmien julkaisun App Storessa. Lisää tietoja iOS Developer Programista saa täältä.

Xcoden perusteet

Seuraavassa ohjeessa luodaan tyhjä Xcode-projekti ja ajetaan se simulaattorissa.

  1. Rekisteröidy Apple-kehittäjäksi osoitteessa http://developer.apple.com/devcenter/ios/ Oikeasta yläkulmasta löytyy linkki rekisteröitymiseen.
  2. Lataa uusin Xcode ja iOS SDK samalta sivulta rekisteröitymisen ja kirjautumisen jälkeen. Paketti on ylin linkki, jossa lukee “Xcode 3.2.5 and iOS SDK 4.2″ 
  3. Käy kahvilla 3,5 gigan paketin latautuessa.
  4. Käynnistä Xcode. Edessäsi pitäisi näkyä Xcoden käynnistysikkuna.
  5. Luo uusi projekti valitsemalla “Create a new Xcode project” Xcoden käynnistysikkunan vasemmalta puolelta.
  6. Valitse projektiksi iPhone-ohjelma valitsemalla vasemmalta palstalta, iOS-kohdan alta “Application”, ja oikealla näkyvältä alueelta “View-based Application”.
  7. Tallenna projekti haluamallasi nimellä.
  8. Nyt sinulla on edessäsi projekti joka sisältää iPhone-ohjelman rungon. Ohjelman voi käynnistää, mutta se piirtää ruudulle vain harmaan kuvan.
  9. Käynnistä ohjelma painamalla projekti-ikkunan yläpalkista vasaran ja vihreän play-painikkeen näköistä kuvaketta, jossa lukee “Build and Run” , tai valitsemalla ohjelman ylävalikosta Run -> Run.
  10. Simulaattorin pitäisi käynnistyä ja näyttää harmaata kuvaa.

Esimerkkiohjelma ajossa iPhone-simulaattorissa.

Seuraavassa artikkelissa kerromme iOS-ohjelmien toimintaperiaatteesta ja laitamme simulaattorin näyttämään jotain hienompaa kuin harmaan ruudun!

Yhteenveto kehittämiseen tarvittavista asioista

  1. Mac-tietokone jossa on OS X Snow Leopard (10.6)
  2. Rekisteröityminen Apple-kehittäjäksi
  3. XCode ja iOS SDK
  4. Mielenkiintoa opetella Objective-C:n syntaksi (se ei ole ollenkaan niin vaikeaa miltä se näyttää ;))

Linkkejä

  1. iOS Dev Center
  2. iOS Developer Program