Kuulumisia viime vuosilta

Moi kaikille, jotka tänne päätyvät Googlen johdattamina tai muuten!

Sovelluskehitys-opiskeluistani on vierähtänyt jo pari vuotta, enkä ole sittemmin iOS-ohjelmointiin ennättänyt palailemaan. iOS on päivittynyt jo versioon 7 ja Xcodekin on varsin erinäköinen kuin aloittessani. Oma aikani on nyttemmin kulunut muun muassa oman ympäristö- ja yhteiskuntavastuullisen markkinointitoimistoni Viisaampi markkinointi käynnistelyyn – kurkista sivustoni viisaampi.fi.

Mobiilisovellusten suunnittelusta en toki ole luopunut. Mielenkiintoisin tapaus tällä kentällä oli ehkä Sitran Gesundheit 2013 -terveyspelikilpailun ideasarjan voitto pelikonseptillani Ravintoguru. Tarjoan sovellussuunnittelupalveluita myös uuden yritykseni kautta (mobiiliohjelmointi jääköön silti ammattilaisille).

Kiitokset vielä kaikille blogini seuraamisesta!

Näkemiin, ellei hyvästi

Moi,
kuten julkaisutahdista on ehkä ollut pääteltävissäkin, muut asiat ovat nyt vieneet vähäisen tarjolla olevan vapaa-aikani, eikä uusia applikaatio-proggiksia ole tullut aloitettua. Huomasin kuitenkin, että näihin kirjoituksiin tulee edelleen jonkin verran hakuosumia, joten ajattelin että olisi asiallista jollain tapaa päätellä tämä projekti.

Sweetest Kid myy tasaiseen yhden kappaleen viikkovauhtiin, joten ohjelmistomiljonääriys saa vielä tovin odottaa. Oli kuitenkin mukava todeta, että härkäpäisyydellä on mahdollista päästä osaamistasolta ”atk-ajokortti” julkaisukelpoisen applikaation laatimiseen alle vuodessa.

Ideoita olisi vielä varastossa yksi jos toinenkin, mutta aivan yhtä yksinkertaista toiminnallisuutta kuin eka applikaatiossani ei näillä näkymin tunnu mielekkäältä toistaa, ja monipuolisemmat appsit edellyttäisivät vielä moninverroin enemmän aikaa ja sitoutumista sekä yleensä myös jonkinlaisen työryhmän.

Näillä näkymin harrastus on siis jäissä, mutta kukapa tietää, mitä jatkossa tapahtuu. Kiitos kaikille seuraamisesta, toivottavasti saitte irti ainakin jotain – ellei muuta niin parit hörönaurut tämän märkäkorvan kämmäilyistä😉

App Store opettaa

Eka applikaationi Sweetest Kid on nyt ollut reilut pari viikkoa Storessa. Ennen julkaisua koettiinkin muuten jännittäviä hetkiä koskien Sweetest Kidin kohtaloa. Yksityiskohdat lienevät Developer Programin vaitiolosopimuksen alaisia, mutta sanotaanko näin: jos sinun applikaatiosi hylätään muihin kuin ohjelmoinnillisiin syihin vedoten, ja olet perusteluista eri mieltä, ei kannata vielä luopua toivosta. On nimittäin olemassa sellainen instituutio kuin App Review Board – ja yllätys, yllätys, siinä on ihan ihmisiä, jotka oikeasti lukevat (myös ei-tekniset) perustelusi ja joissain tapauksissa jopa kumoavat alkuperäisen hylkäyspäätöksen.

Toimintani on pienimuotoista ja harrastusluonteista, ja omalla taustallani jo App Storeen pääsy alle vuodessa on jo voitto sinänsä. Turha kuitenkaan kieltää, etteikö mahdolliset myyntiluvut kiinnostaisi myös – se Developer Programin kahdeksankymppiä olisi tietysti mukava tienata takaisin. Sweetest Kid on siinä mielessä mainio esimerkkitapaus, etten tehnyt sen suhteen minkäänlaista (tietoista) ennakkomarkkinointia – mainitsin toki useampaan kertaan tulossa olevasta applikaatiosta suosimillani foorumeilla ja sosiaalisessa mediassa, mutta lähinnä siksi että olin asiasta niin innoissani.

Ekojen päivien myynti – ei, nuo luvut eivät ole tuhansia🙂

Ylläolevan kuvan perusteella lienee aika ilmeistä: jos tarkoituksenasi on oikeasti tienata jotain, ei kannata luottaa viidentoista minuutin kuuluisuuteesi (nerokkaan selvänäköinen ennustus Warholilta muuten) App Storen vastajulkaistujen listalla. Tuo ekan päivän ”myyntiryntäys” koostuu omasta testiostostani, ja työkaverini sekä erään tuttavan ostoksesta. Seuraavilta päiviltä  kertyi yhteensä viisi latausta – viimeiset pari jopa aivan tuntemattomilta ihmisiltä, vau🙂

Ihan näin helposti en kuitenkaan halunnut applikaationi jäävän unohduksiin, joten aloin miettimään, miten markkinointibudjetillani (0 € – tosin nyttemmin turvonnut parinkymmenen euron tuntumaan) voisi saada houkuteltua uusia käyttäjiä.

Ensin korvasin kökön Facebook-likeboxin perussiistillä mainossisällöllä applikaation omalla promosivustolla. Selkeämpi url ja seurattavuus Google Analyticsillä olivat isoimmat syyt, miksi sinänsä selkeä iTunes-sivu ei tuntunut riittävän. Joskus aiemmin avaamani Google AdWords -tili mainosti sattumalta juuri samoihin aikoihin 100 € promootiokoodilla, joten käytin sen applikaationi mainontaan kids apps -tyylisillä hakusanoilla. Siitä seurasi vajaat parisataa klikkausta promosivulle, muttei kuitenkaan myyntiä.

Muistelin myös tunnukset pitkään unohduksissa olleeseen Twitter-tiliini ja aloin twiittailemaan applikaatiooni liittyvistä uutisista.

Jonkin aikaa harkittuani linkitin promosivulle jopa sattumalta melko suosituksi nousseesta YouTube-vitsistäni – alkuun mietin, tuleeko sivuille tuolta vääräntyyppistä yleisöä, mutta YouTube Insightin ja oman järkeilyni perusteella tuohon videoon päätyvät muutama tuhatta päivittäistä katsojaa saattavat hyvinkin olla lasten vanhempia, eikä läppävideon katsominen välttämättä sulje pois kiinnostumista ”vakavahenkisestä” applikaatiosta.

Näistä toimenpiteistä on seurannut vaatimattomia kävijämääriä promosivulla, mutta ei 0-1 päivittäistä ostoa enempää tuloksia. Aloin googlailla aiheesta, ja päädyin Moms with Apps -sivulle. Ryhmä edistää pienten perheystävällisiä applikaatioita kehittävien tekijöiden asiaa, ja kelpuuttaa nimestään huolimatta mukaan myös isejä. Ryhmän aktiivisuus ja avuliaisuus yllätti, esimerkiksi pelkästään esittäytymällä jäsenfoorumilla sain yllättäen applikaationi mukaan heidän blogiinsa ja kanssadevaajien Facebook-sivuja promotaan anteliaasti. Genre on ilmeisen rajattu, mutta vastaavanlaisia yhteisöjä löytynee muunkinlaisten applikaatioiden kehittäjien keskuudesta.

Myös muutama arviointipyyntö on vetämässä – hyvillä arvosteluilla voisi kuvitella olevan seurauksena myös myyntiä. Uusien (perhe)applikaatioiden virta on valtava, joten arvioitavaksi pääseminen ei ole ihan itsestäänselvää eikä varsinkaan nopeaa, mutta yksi arvio ”the iPhone Mom”in blogissa on kuulemma jo aikataulutettuna aatonaatoksi. Jännä nähdä, minkälainen arvio sieltä on luvassa…

Olen myös kokeillut yhden päivän väliaikaista ilmaisjakelua (erittäin vaivaton ja yksinkertainen, minuutin homma iTunes Connectissa muuten) ja tulokset olivat myyntimääriin suhteutettuna melko yllättävät.

CyberMondayn ilmaisjakelu: 99 latausta!

Sweetest Kid oli ilmainen yhden päivän ajan (28.11. eli online-kaupan promotoimiseen lanseerattu CyberMonday), minkä seurauksena sitä ladattiin 99 kappaletta. Absoluuttisessa mielessä ei mikään suuri määrä, mutta 0-1 maksulliseen lataukseen verrattuna prosentuaalinen ero on huima. Vaikka ajattelisi, että yksi dollarihan on käytännössä ilmainen, on ero applikaatiomarkkinoilla kaikkea muuta kuin merkityksetön. Kuulin eräästä devaajasta, joka muutti muutama päivä sitten (erittäin monipuolisen ja laadukkaan) applikaationsa ilmaiseksi, ja 1 osto /1–4 päivää -tahti muuttui 15000 globaaliksi lataukseksi muutosta seuraavana päivänä.

Oma kampanjani ei vielä vaikuttanut seuraavien päivien myyntiin, mutta 100 käyttäjää ei vielä olekaan kovin massiivinen alkujoukko. Siksipä ajattelin kokeilla näin joulun alla pidempää giveaway-kampanjaa, josko sillä saisi houkuteltua isomman käyttäjäkunnan, ja sitä kautta applikaation some-ominaisuuksien perusteella myöhemmin myös ostavia asiakkaita. Aloitin kampanjan eilen, joten ensimmäiset lataustilastot pitäisi ilmestyä muutaman tunnin sisällä. Ihan kiinnostavaa nähdä, mitä sieltä paljastuu!

Sweetest Kidin myöhemmät vaiheet selviävät tätä blogia seuraamalla – pysykää kanavalla🙂 Pohdintaa erilaisista ennakkomarkkinoinnin keinoista saattaa olla luvassa myös. Siihen asti: kuulemiin!

App Storessa ollaan!

Aamulla tuli sähköpostia Applelta – mun eka oma applikaatio Sweetest Kid on nyt hyväksytty ja julkaistu App Storessa. Jee!

Applikaation ideana on klassista Lumikki-sadun taikapeiliä soveltaen kertoa lapselle, että tämä on suloisin asia maailmassa. Lapsen kuva ilmestyy peiliin, ja sen voi sitten jakaa Facebookissa ja sähköpostilla. Aikuisetkin saavat tätä toki käyttää🙂

Ellei muuta, niin onhan tämä kannuste muille samassa tilanteessa oleville ei-dippainssi-devaajille: kyllä, on se mahdollista! Ja allekirjoittaneen joulu alkoi muuten nyt😀

Sekalaisia huomioita Developer-ohjelmasta

Tervehdys jälleen!

Nyt kun ensimmäinen applikaationi on pientä hiomista vaille valmis lähetettäväksi ehdolle App Storeen, voisin kerrata hieman mitkä asiat tuossa valmisteluprosessissa tuottivat itselleni eniten päänvaivaa, ja miten ne lopulta ratkesivat – lähinnä painotus siis tuossa App Storessa myymiseen liittyvässä (virtuaalisessa) paperityössä.

Ihan ensimmäiseksi

Jos olet juuri aloittamassa iOS (= kaikkien Applen mobiililaitteiden käyttis) -ohjelmointia, ihan ensiksi kannattaa huomioida, että sinulla on kaksi vaihtoehtoa:

  1. Voit aloittaa ilmaiseksi yksinkertaisesti rekisteröitymällä Apple Developeriksi: http://developer.apple.com/programs/register/
  2. Tai voit liittyä Applen maksulliseen (99 $/vuosi) Developer Programiin http://developer.apple.com/programs/ios/

Suurimmat erot ovat siinä, että maksullisen ohjelman jäsenenä pystyt testaamaan ohjelmiasi fyysisellä iPhone/iPad/iLaitteellasi, saat pääsyn suljetulle Developer-foorumille ja voit saada applikaatiosi App Storeen. Eli jos aiot julkaista jotain, ennemmin tai myöhemmin tarvitset tuon maksullisen tilin. Jos sata taalaa ei tunnu missään, voit kaikin mokomin liittyä Developer Programiin vaikka samantien. Omasta kokemuksesta voin kuitenkin sanoa, että opeteltavaa kyllä riittää ennen kuin laitteella testaaminen tai App Storeen pääsy alkaa olla välttämätöntä. Maksu on kuitenkin voimassa vuoden sopimuksen aloituspäivästä, joten jos opettelet perusteita suurinpiirtein puoli vuotta, kuten minä, tuolta ajalta maksaminen ei välttämättä ole kovin viisasta.

Kantapään kautta voittoon

Xcoden ja iOS SDK:n (Software Development Kit) lataamisessa ja asentamisessa ei ollut mitään ihmeellistä, Applella on tähän hyvät ja täsmälliset ohjeet.

Xcode on mainio kehitysympäristö, jonka vipstaakien opetteluun menee toki oma aikansa. Sitten tietysti pitää opetella kielen (Objective C), järjestelmän (Cocoa Touch) ja koko Applen voimakkaasti objektiorientoituneen ohjelmointifilosofian perusteet. Helpommin sanottu kuin tehty, mutta kyllä se onnistuu ei-insinööriltäkin – aika ajoin päätä seinään hakaten. Edelleen suosittelen painokkaasti aloittamaan tästä loistavasta Stanfordin videoluentosarjasta (en tiedä, onko jo uudempikin lukukausi julkaistu, mutta tämän ääressä itse opiskelin): http://itunes.apple.com/us/itunes-u/developing-apps-for-ios-sd/id395631522

Developer Program

Huomaat kyllä itsekin, kun maksulliseen ohjelmaan liittyminen alkaa olla ajankohtaista. Liittyminen on helppoa ja yksiselitteistä, sen jälkeen tapahtuva omien tietojen täydentäminen voi aiheuttaa paikka paikoin hieman enemmän pähkäilyä.

Kun olet maksanut jäsenyytesi ja saanut Applelta varmistusmeilin, että kaikki on ok, käyttöösi tulleet ominaisuudet löytyvät nätisti yhdelle sivulle koottuna Member Centeristä: https://developer.apple.com/membercenter/index.action

Varmaan oudoimman kuuloiset ja samalla tärkeimmät käyttöösi tulleet työkalut ovat ”iOS Provisioning Portal” ja ”iTunes Connect”. Ensinmainitussa luodaan tarvittavat kehityssertifikaatit ja ”App ID”:t  sekä rekisteröidään testauslaitteet. Jälkimmäisessä hallinnoit sopimus-, pankki-, ja verotustietojasi ja applikaatioidesi myyntiä/jakelua. Molemmat edellyttävät hieman pohjatyötä.

Provisioning Portal

Jos kuvaus Provisioning Portalista kuulosti heprealta, ei se mitään. Kaikki on yksityiskohtaisesti opastettu – sen ansiosta onnistuin saamaan kaiken toimimaan, vaikken yhtään tiennytkään, mitä olin tekemässä. Ainoa juttu, jota jouduin vähän korjailemaan jälkeenpäin, oli tuo App ID:n formaatti.

App ID koostuu siis Applelta automaattisesti tulevasta ”Bundle Seed ID”:stä sekä itse määräämästäsi ”Bundle Identifieristä”. Vaikka Bundle Identifierillä ei ymmärääkseni ole muuta ihan pakollista vaatimusta kuin että se on applikaatiosi tai applikaatiokokoelmasi uniikki tunnus, kannattaa noudattaa Applen suositusta ellei ole jotain erityistä syytä tehdä toisin. Applen suositus on ”reverse domain name style”, jonka tajusin vasta googlailun jälkeen todellakin viittaavan yrityksesi tai oman nettisivustosi domainnimeen.

Täydellisen App ID:n rakenne on siis seuraavanlainen:

ABCDEFGHIJ.com.yrityksesinimi.applikaationnimi tai
ABCDEFGHIJ.com.omanimesi.applikaationnimi

Tuo ABC… on se Bundle Seed ID, 10 merkin/numeron sarja, joka tulee Applelta. Tuo com.yrityksesinimi.applikaationnimi on se Bundle Identifier (jota muuten tuolla iTunes Connectin puolella kutsuttiin hämäävästi vähän eri nimellä, muistaakseni se oli joku App ID Suffix tms.)

Ja suositus tosiaan olisi, että sinulla todella olisi hallussa tuo http://www.yrityksesinimi.com tai http://www.omanimesi.com -domain netissä (näin pystyttäisiin takaamaan se, että App ID:si todella on uniikki). Pakollista tämä ei ymmärtääkseni ole, mutta ihan järkevä periaate mielestäni.

Applikaatiokokoelmia (suite) varten App ID:ssä on mahdollista käyttää asteriskia * jokerimerkkinä, tähän tapaan:

ABCDEFGHIJ.com.yrityksesinimi.* tai
ABCDEFGHIJ.*

Ymmärtääkseni viimeistään applikaation julkaisuvaiheessa pitää kuitenkin täydentää tuo applikaatiokohtainen loppuosakin. Tämän asian voisi joku kokeneempi selventää, itselle jäi tuo vähän hämäräksi.

iTunes Connect

Ekalla kerralla saattaa hämätä hieman, että iTunes Connectiin kirjaudutaan erikseen, vaikka tunnukset ovatkin samat kuin Member Centeriin. iTunes Connectin Contracts, Tax, and Banking -osiossa olikin sitten ehkä koko prosessin hankalimmat kohdat. iOS Free Applications -sopimus pitäisi olla valmiiksi hyväksyttynä, se kuuluu jo Developer Programin sopimukseen. Maksulliseen tai mainosrahoitteiseen sopimukseen tarvitaankin sitten pankki- ja verotietoja.

Jostain syystä esitäytettyihin tietoihini oli tullut väärä lähiosoite (en vieläkään tiedä, mistä se putkahti: Applelta, luottokunnalta vai mistä lie). Osoite oli muutaman korttelin päässä kotoani, mutta ei kuitenkaan oma osoitteeni. Asia korjautui joka tapauksessa itsestään siinä vaiheessa kun ehdin kirjoittaa asiasta kyselyn Applelle.

Seuraava hakala kohta olikin sitten Bank Info. Pitkä tarina lyhentäen: kävi ilmi, että oman pankkitilini alkuosa (pankkikonttorin tunniste) ei vastannutkaan kotikonttoriani tai ylipäätään mitään virallisissa rekistereissä olevaa pankkia. Kummallista kerrassaan, mutta tilinumero ei siis kelvannut Applelle, eikä pankkini osannut tehdä asialle mitään(!) Kaikeksi onneksi sain vinkin käyttää S-etutilini tilinumeroa, jonka Apple tosiaan hyväksyi heittämällä. Problem solved!

Sitten oli vielä Tax Information, jota kohtaan olin kehittänyt melkoiset ennakkopelot erinäisiä foorumeita seuraamalla. Tätä varten on ei-usalaisena vielä hiljattain täytynyt soitella Jenkkien verotoimistoon asti, kirjautua verovelvolliseksi Yhdysvalloissa (!) ja täytellä jotain IRS ja W-8BEN -lomakkeita.

Nähtävästi (sanon nähtävästi, koska minulla ei vielä ole yhtään applikaatiota kaupassa, eikä näin ollen tilityksiäkään tullut) asia on kuitenkin hiljattain muuttunut, eikä meiltä ulkomaalaisilta kysytä enää muuta kuin vakuutus siitä, että meillä ei ole muuta liiketoimintaa tai alaisia Yhdysvalloissa. Ainakaan missään ei kyselty yllämainittujen verotusdokumenttien perään, ja sopimukseni status näyttää ”hyväksyttyä”. Tällaisen keskustelun aiheesta löysin googlaamalla: http://www.iphonedevsdk.com/forum/busin … -info.html

Siinäpä se!

Verotus Suomen puolella on sitten ihan oma juttunsa. Se tuntuu olevan kaikille (eikä vähiten veroviranomaisille itselleen) täysin hämärän peitossa oleva juttu. Helpoin, ja näin ollen itselleni mieluisin tulkinta on se, että 8500 euroon asti tulot eivät edellytä yksityishenkilöltä muuta kuin yhdenkertaista kirjanpitoa ja tulojen kirjaamista verokortin kohtaan ”1.4 muut ansiotulot” ja vero.fi:stä lomakkeen 15: ”Taiteilijan ja freelancerin tulot” siihen liitteeksi. Lähde: Hopeisen Omenan keskustelu aiheesta: http://hopeinenomena.net/viewtopic.php?f=40&t=117834&start=25

iTunes Connect: Manage Your Apps

Jos ”Add New App” -painiketta ekaa kertaa klikatessa yhtään jännitä, on jotain kyllä vialla. Applikaation tietoja voi käydä koetäyttelemässä, jotta lomake tulee tutuksi, mutta jos on aikomus oikeasti julkaista jotain, kannattaa olla valmiina ainakin seuraavaa:

  • Applikaation virallinen nimi
  • SKU Number; tämä on siis itse keksimäsi applikaatiokohtainen tunniste, jota käytät siis vain omassa kirjanpidossasi jne., tässä ei ole mitään pakollista virallista formaattia. Mulla on 1001_applikaationnimi (1 = tyyppi, esim. peli versus hyötyohjelma, 001 = applikaation numero – kuten huomaat, olen varautunut 999 eri applikaation softaimperiumin pyörittämiseen, hehe, sitten alaviiva koristeeksi ja applikaation nimi pienillä kirjaimilla yhteen). Mutta tosiaan, suit yourself. Seuraavaan näkymään et kuitenkaan pääse, ellet täytä tuohon ainakin jotain.
  • Bundle ID: tämä valitaan siis tuolla Provisioning-puolella rekisteröimistäsi ID:stä, eli se pitää olla valmiina tässä vaiheessa. Jos käytät Bundle ID:ssäsi asteriskia jokerimerkkinä, ID:n loppuosa pitää täydentää tässä.
  • Availiability Date: voit laittaa lähetyspäivän – tämä on mahdollista muuttaa applikaation hyväksymispäivänä, ja vain sinä päivänä. Se kannattaakin tehdä, jotta applikaatiosi saa 15 minuuttia feimiään uusien julkaisujen kärjessä.
  • Price Tier. Eka tier näkyy App Storessa hintana 0.99$ / 0,79€ jne. – sinulle Apple tilittää sitten sen siivun kun tilittää
  • Description – App Storessa näkyvä kuvausteksti. Tämä kannattaa miettiä tarkkaan!
  • Keywords – näillä hakusanoilla softasi löytyy, todella tärkeä!
  • Support URL: tämä on pakollinen, eli joku paikka pitää olla valmiina, josta applikaation ostajat saavat (ainakin teoriassa) yhteyden kehittäjään
  • Vapaaehtoiset App URL (promoamiseen) ja Privacy Policy URL
  • Rating – kaikki likaiset yksityiskohdat kysellään, kannattaa olla varautunut
  • 512 x 512 px ikoni App Storea varten
  • Vähintään 1, maksimissaan 6 näyttökaappausta applikaatiosta jokaisella applikaatiosi tukemalla laiteresoluutiolla (standard, retina display, iPad). Pikselikoko määrätty tarkkaan – joko koko näyttö tai sitten ilman ylälaidan vakiostatusbaria, jos se ohjelmassasi on näkyvissä.
  • Jos juridinen kikkailu kiinnostaa, voit laatia oman EULA:si, muuten käytetään Applen standardipohjaa

Tässä vaiheessa tiedot voi tallentaa. Niitä pääsee muuttamaan vapaasti siihen asti, kunnes lähetät itse applikaatiopaketin tarkistukseen, ja taas applikaation hyväksymisen jälkeen hieman rajoitetummin.

Xcode-projektin puolella

Jos itsestäänselvyydet ohitetaan (softa ei saa kaatuilla jne.), ainakin pari kohtaa pitää säätää projektin asetuksissa.

Tuolla Applikaationnimi.plist-tiedostossa on tuo Bundle identifier – se on oletusarvoisesti tuollaisessa puoliautomaattisesti generoituvassa formaatissa (com.yourcompany.${PRODUCT_NAME:rfc1034identifier}, tuo hämärännäköinen rfc1034 paljastui lopulta kaikessa yksinkertaisuudessaan vaan muotoiluksi, joka varmistaa, ettei bundlenimessäsi ole erikoismerkkejä). Joka tapauksessa, jos toimintasi on pienimuotoista, eikä automatisoinilla ole tässä tilanteessa sinulle merkitystä, voit naputella bundle ID:n tuohon ihan rohkeasti käsin: ”com.yrityksesinimi.applikaatiosinimi”. Sitä 10-merkkistä Bundle Seed ID:tä ei enää nykyään tarvitse eikä kuulu tuohon kirjoittaa.

Toinen tärkeä juttu on Deployment Target, eli vanhin käyttisversio, jota haluat applikaatiosi tukevan. Tästä on hyvät kuvitetut ohjeet esim. täällä: http://iphonedevelopertips.com/xcode/base-sdk-and-iphone-os-deployment-target-developing-apps-with-the-4-x-sdk-deploying-to-3-x-devices.html

Jos applikaatiosi käyttisversion lisäksi ehdottomasti vaatii laitteelta jotain tiettyä ominaisuutta (kahta kameraa, gyroskooppia tms.), se kannattaa laittaa tuonne info.plistiin myös (ominaisuuden nimi on Required device capabilities, ja sinne Item 0:ksi vaadittu ominaisuus, ja niin edelleen).

Ai niin, ja jos vakiokiilto ei jostain syystä sovi applikaatioikonisi tyyliin, info.plistiin voi myös lisätä kohdan ”Icon already includes gloss effects”. Kulmanpyöristykset tulevat automaattisesti, niitä ei tarvitse eikä voi ottaa pois (tee siis ikonikuvasi ihan nurkasta nurkkaan asti).

Pieni App Delegate -testiohjelma

Moi,
kuten sanottua, opettelen parhaillaan applikaation sopeutumista erilaisiin keskeytyksiin, kuten puhelimen soimiseen, exit-napin painamiseen tai näytön lukitsemiseen. Kaikenlaisia selostuksia ja flow chartteja on nyt tulkittu, mutta emmental-aivot kaipasivat edelleen jotakin konkreettisempaa.

Tein siis pikkiriikkisen testiapplikaation, jonka ajattelin jakaa tässä, josko siitä joku muukin hyötyisi. Kyse ei ole siis mistään sen kummemmasta kuin valmis Xcoden ”Utility Application” -template, johon olen lisännyt NSLog-komentoja tyypillisimpiin applikaation eri vaiheisiin liittyviin delegate-metodeihin ym. – loki ei siis ole millään muotoa kattava, mutta perustoiminnoista päässee tämän avulla kärryille.

Huom! Ruudulla ei siis näy mitään muuta kuin perus Utility-template flipside-näkymineen – Xcoden Debugger Console (omppu-shift-R) pitää olla auki, jotta applikaatiosta saisi mitään irti.

Tässä Xcode-projekti zip-pakettina.

Asia konkretisoituu varsin mukavasti tiirailemalla konsolia applikaatiota käytellessä. Aika paljon konepellin alla tapahtuu, vaikka ulospäin ei näy juuri mitään. Esimerkiksi heti applikaatiota käynnistäessä pölähtää konsoliin tällainen raportti – MVC tarkoittaa MainViewControlleria, Flipside tietty kääntöpuolen ViewControlleria ja pelkät metodinimet viittaavat Application Delegaten metodeihin.

2011-10-19 23:17:26.485 AppDelegateHarjoitus[183:707] MVC - awakeFromNib
2011-10-19 23:17:26.496 AppDelegateHarjoitus[183:707] application:didFinishLaunchingWithOptions:
2011-10-19 23:17:26.516 AppDelegateHarjoitus[183:707] MVC - viewDidLoad
2011-10-19 23:17:26.520 AppDelegateHarjoitus[183:707] MVC - viewWillAppear
2011-10-19 23:17:26.525 AppDelegateHarjoitus[183:707] MVC - shouldAutorotateToInterfaceOrientation: Portrait
2011-10-19 23:17:26.529 AppDelegateHarjoitus[183:707] MVC - viewDidAppear
2011-10-19 23:17:26.535 AppDelegateHarjoitus[183:707] MVC - shouldAutorotateToInterfaceOrientation: Portrait
2011-10-19 23:17:26.543 AppDelegateHarjoitus[183:707] applicationDidBecomeActive:

Ihan mielenkiintoista oli huomata käytännössä esimerkiksi, että tuo awakeFromNib ilmoittaa olemassaolostaan ennen mitään muita viestejä, ja että tuo Autorotate-metodi tulee jostain syystä kutsutuksi kahdesti: sekä WillAppearin että DidAppearin jälkeen.

Jos App Delegaten ja View Controllereiden perustoiminnot vielä Dev Centerin kahlaamisen jälkeenkin vaikuttavat hieman hämäriltä, kuten minulla, tämän applikaation kanssa leikkiminen voi helpottaa asian hahmottamista.

Pikku-uutisia

Jee, nyt on developer-ohjelma käynnistelty. Kaikki sujui Applen ohjeistuksia seuraamalla melko sutjakasti, tosin paikallinen pankkikonttorini aiheutti hieman viivästystä erikoisilla tilinumerointikäytännöillään.

Ekan applikaationi kehitystyö on siis edennyt debuggausvaiheeseen asti. Kuukausien simulaattorin tuijottelun jälkeen oman appin asennus oikeaan iPhoneen oli kieltämättä aika jänskä paikka. Kyllähän se pyörähti käyntiin, eikä edes aiheuttanut mitään kovin perustavanlaatuista katastrofia.

Silti, jos olet lineaarisen koodauksen kultakaudelta nykyaikaan eksynyt jäärä kuten minä, siinä vaiheessa kun oletat applikaatiosi olevan jotakuinkin valmis, kannattaa alkaa estottomasti näpyttelemään exit- ja sleep-nappeja sekä soitella testipuhelimeesi applikaatiosi pyöriessä. Todennäköisesti töitä riittää vielä, ennen kuin applikaatiosi käyttäytyy siivosti kaikenlaisia satunnaisia keskeytyksiä kohdatessaan – ja niitä puhelimessa kyllä riittää.

Tällä hetkellä tämän yökoodarin huomio on siis kohdistunut enimmäkseen AppDelegaten metodien suuntaan. Asiaa on selvitetty suht. selkeästi Applen Dev Centerissä ja Cocoaneticsissä, mutta kuten aina, periaatteen tajuamisesta on vielä aika lailla matkaa siihen, että hoksaa mitä käytännössä pitää omassa applikaatiossa naputella mihinkin metodiin.

Mutta eiköhän tuo moniajomörkökin tuosta seläty… sittenpä onkin enää jäljellä pientä loppuviilailua siellä täällä, jonka jälkeen täytyykin jo koittaa onnea App Storen hyväksymisprosessin kanssa. Huh! Oma pikkuruinen ikoni App Storen katalogissa alkaa olla kuviteltavissa olevaa lähitulevaisuutta. Olisipa kiva jo mainostaa omaa tuotosta, mutta odotellaanpa nyt vielä tovi, että softa ei sekoa ensimmäiseen vastaantulevaan keskeytykseen…

Loppuun pieni loppukevennys ja samalla käytännön vinkki debuggauksen parissa kamppaileville kanssa-amatööreille: kun olet ihmetellyt tuntikaupalla tyhjästä ilmestynyttä koko applikaation kaatavaa bugia, ei kannata unohtaa tätä: ne samaiset NSLog-komennot, joilla koitat bugia metsästää, eivät ole millään muotoa immuuneita bugiselle koodille itsekään.

Eli ihan – köh, köh – hypoteettisena esimerkkinä teille rakkaat lukijat, pätkä viewWillAppear-metodista:

- (void)viewWillAppear:(BOOL)animated {
    NSLog(@"wiewWillAppear: animated = BOOL (%d)", animated); // Tämä toimii ongelmitta
    // NSLog(@"wiewWillAppear: animated = BOOL (%@)", animated); // Kun taas tämä kaataa koko softan
    // %@ viittaa siis objektiin, jota BOOL ei taasen ole, joten seurauksena on 
    // tiltti. Eli myös NSLogin kanssa kannattaa olla tarkkana ;)
}