<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Aikahyppy</title>
	<atom:link href="http://aikahyppy.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://aikahyppy.wordpress.com</link>
	<description>Viimeksi teini-iässä vähän C:llä ohjelmoinut graafikko opettelee iPhone-applikaatioiden tekoa.</description>
	<lastBuildDate>Mon, 12 Dec 2011 11:48:08 +0000</lastBuildDate>
	<language>fi</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='aikahyppy.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Aikahyppy</title>
		<link>http://aikahyppy.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://aikahyppy.wordpress.com/osd.xml" title="Aikahyppy" />
	<atom:link rel='hub' href='http://aikahyppy.wordpress.com/?pushpress=hub'/>
		<item>
		<title>App Store opettaa</title>
		<link>http://aikahyppy.wordpress.com/2011/12/11/app-store-opettaa/</link>
		<comments>http://aikahyppy.wordpress.com/2011/12/11/app-store-opettaa/#comments</comments>
		<pubDate>Sun, 11 Dec 2011 10:51:35 +0000</pubDate>
		<dc:creator>Samuli</dc:creator>
				<category><![CDATA[Developer Program]]></category>
		<category><![CDATA[Yleistä pohdintaa]]></category>

		<guid isPermaLink="false">http://aikahyppy.wordpress.com/?p=178</guid>
		<description><![CDATA[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 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=178&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Eka applikaationi <a href="http://sweetestkid.samuliviitasaari.com/" target="_blank">Sweetest Kid</a> 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 <a href="http://developer.apple.com/appstore/contact/appreviewboard/" target="_blank">App Review Board</a> – 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.</p>
<p>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.</p>
<div id="attachment_179" class="wp-caption aligncenter" style="width: 640px"><a href="http://aikahyppy.files.wordpress.com/2011/12/myynti.png"><img class="size-full wp-image-179" title="Ekojen päivien myynti" src="http://aikahyppy.files.wordpress.com/2011/12/myynti.png?w=630&#038;h=197" alt="" width="630" height="197" /></a><p class="wp-caption-text">Ekojen päivien myynti – ei, nuo luvut eivät ole tuhansia <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p></div>
<p>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 &#8220;myyntiryntäys&#8221; 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 <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>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ä.</p>
<p>Ensin korvasin kökön Facebook-likeboxin perussiistillä mainossisällöllä applikaation <a href="http://sweetestkid.samuliviitasaari.com/" target="_blank">omalla promosivustolla</a>. Selkeämpi url ja seurattavuus Google Analyticsillä olivat isoimmat syyt, miksi sinänsä selkeä <a href="http://itunes.apple.com/us/app/sweetest-kid/id476637106?ls=1&amp;mt=8" target="_blank">iTunes-sivu</a> 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ä.</p>
<p>Muistelin myös tunnukset pitkään unohduksissa olleeseen Twitter-tiliini ja aloin twiittailemaan applikaatiooni liittyvistä uutisista.</p>
<p>Jonkin aikaa harkittuani linkitin promosivulle jopa sattumalta melko suosituksi nousseesta <a href="http://www.youtube.com/watch?v=s7R46ggWmzA" target="_blank">YouTube-vitsistäni</a> – 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 &#8220;vakavahenkisestä&#8221; applikaatiosta.</p>
<p>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 <a href="http://momswithapps.com/" target="_blank">Moms with Apps</a> -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 <a href="http://momswithapps.com/2011/12/06/the-jellybean-tunes-app-report-volume-8/" target="_blank">blogiinsa</a> ja kanssadevaajien Facebook-sivuja promotaan anteliaasti. Genre on ilmeisen rajattu, mutta vastaavanlaisia yhteisöjä löytynee muunkinlaisten applikaatioiden kehittäjien keskuudesta.</p>
<p>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 <a href="http://www.theiphonemom.com/" target="_blank">&#8220;the iPhone Mom&#8221;in blogissa</a> on kuulemma jo aikataulutettuna aatonaatoksi. Jännä nähdä, minkälainen arvio sieltä on luvassa&#8230;</p>
<p>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.</p>
<div id="attachment_184" class="wp-caption aligncenter" style="width: 640px"><a href="http://aikahyppy.files.wordpress.com/2011/12/cybermonday.png"><img class="size-full wp-image-184" title="cybermonday" src="http://aikahyppy.files.wordpress.com/2011/12/cybermonday.png?w=630&#038;h=197" alt="" width="630" height="197" /></a><p class="wp-caption-text">CyberMondayn ilmaisjakelu: 99 latausta!</p></div>
<p>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ä.</p>
<p>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!</p>
<p>Sweetest Kidin myöhemmät vaiheet selviävät tätä blogia seuraamalla – pysykää kanavalla <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Pohdintaa erilaisista ennakkomarkkinoinnin keinoista saattaa olla luvassa myös. Siihen asti: kuulemiin!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aikahyppy.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aikahyppy.wordpress.com/178/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aikahyppy.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aikahyppy.wordpress.com/178/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aikahyppy.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aikahyppy.wordpress.com/178/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aikahyppy.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aikahyppy.wordpress.com/178/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aikahyppy.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aikahyppy.wordpress.com/178/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aikahyppy.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aikahyppy.wordpress.com/178/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aikahyppy.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aikahyppy.wordpress.com/178/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=178&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aikahyppy.wordpress.com/2011/12/11/app-store-opettaa/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/47e3d0b1f1fb9cdd4d6578b3496e273d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">djkyykkae</media:title>
		</media:content>

		<media:content url="http://aikahyppy.files.wordpress.com/2011/12/myynti.png" medium="image">
			<media:title type="html">Ekojen päivien myynti</media:title>
		</media:content>

		<media:content url="http://aikahyppy.files.wordpress.com/2011/12/cybermonday.png" medium="image">
			<media:title type="html">cybermonday</media:title>
		</media:content>
	</item>
		<item>
		<title>App Storessa ollaan!</title>
		<link>http://aikahyppy.wordpress.com/2011/11/22/app-storessa-ollaan/</link>
		<comments>http://aikahyppy.wordpress.com/2011/11/22/app-storessa-ollaan/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 08:17:32 +0000</pubDate>
		<dc:creator>Samuli</dc:creator>
				<category><![CDATA[Yleistä pohdintaa]]></category>

		<guid isPermaLink="false">http://aikahyppy.wordpress.com/?p=170</guid>
		<description><![CDATA[Aamulla tuli sähköpostia Applelta – mun eka oma applikaatio Sweetest Kid on nyt hyväksytty ja julkaistu App Storessa. Jee! Sweetest Kid iTunesissa Sweetest Kid Facebookissa Sweetest Kid netissä (ainakin toistaiseksi vain Facebook-likeboxin muodossa) Applikaation ideana on klassista Lumikki-sadun taikapeiliä soveltaen kertoa lapselle, että tämä on suloisin asia maailmassa. Lapsen kuva ilmestyy peiliin, ja sen voi [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=170&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Aamulla tuli sähköpostia Applelta – mun eka oma applikaatio Sweetest Kid on nyt hyväksytty ja julkaistu App Storessa. Jee!</p>
<ul>
<li><a href="http://itunes.apple.com/us/app/sweetest-kid/id476637106?mt=8" target="_blank">Sweetest Kid iTunesissa</a></li>
<li><a href="https://www.facebook.com/apps/application.php?id=176948019050730" target="_blank">Sweetest Kid Facebookissa</a></li>
<li><a href="http://sweetestkid.samuliviitasaari.com/" target="_blank">Sweetest Kid netissä</a> (ainakin toistaiseksi vain Facebook-likeboxin muodossa)</li>
</ul>
<p>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ää <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ellei muuta, niin onhan tämä kannuste muille samassa tilanteessa oleville ei-dippainssi-devaajille: kyllä, on se mahdollista! Ja allekirjoittaneen joulu alkoi muuten nyt <img src='http://s0.wp.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aikahyppy.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aikahyppy.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aikahyppy.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aikahyppy.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aikahyppy.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aikahyppy.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aikahyppy.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aikahyppy.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aikahyppy.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aikahyppy.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aikahyppy.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aikahyppy.wordpress.com/170/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aikahyppy.wordpress.com/170/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aikahyppy.wordpress.com/170/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=170&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aikahyppy.wordpress.com/2011/11/22/app-storessa-ollaan/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/47e3d0b1f1fb9cdd4d6578b3496e273d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">djkyykkae</media:title>
		</media:content>
	</item>
		<item>
		<title>Sekalaisia huomioita Developer-ohjelmasta</title>
		<link>http://aikahyppy.wordpress.com/2011/10/30/sekalaisia-huomioita-developer-ohjelmasta/</link>
		<comments>http://aikahyppy.wordpress.com/2011/10/30/sekalaisia-huomioita-developer-ohjelmasta/#comments</comments>
		<pubDate>Sun, 30 Oct 2011 12:54:50 +0000</pubDate>
		<dc:creator>Samuli</dc:creator>
				<category><![CDATA[Developer Program]]></category>
		<category><![CDATA[Yleistä pohdintaa]]></category>

		<guid isPermaLink="false">http://aikahyppy.wordpress.com/?p=159</guid>
		<description><![CDATA[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, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=159&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Tervehdys jälleen!</p>
<p>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ä.</p>
<h3>Ihan ensimmäiseksi</h3>
<p>Jos olet juuri aloittamassa iOS (= kaikkien Applen mobiililaitteiden käyttis) -ohjelmointia, ihan ensiksi kannattaa huomioida, että sinulla on kaksi vaihtoehtoa:</p>
<ol>
<li>Voit aloittaa ilmaiseksi yksinkertaisesti rekisteröitymällä Apple Developeriksi: <a href="http://developer.apple.com/programs/register/" target="_blank">http://developer.apple.com/programs/register/</a></li>
<li>Tai voit liittyä Applen maksulliseen (99 $/vuosi) Developer Programiin <a href="http://developer.apple.com/programs/ios/" target="_blank">http://developer.apple.com/programs/ios/</a></li>
</ol>
<p>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.</p>
<h3>Kantapään kautta voittoon</h3>
<p>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.</p>
<p>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): <a href="http://itunes.apple.com/us/itunes-u/developing-apps-for-ios-sd/id395631522" target="_blank">http://itunes.apple.com/us/itunes-u/developing-apps-for-ios-sd/id395631522</a></p>
<h3>Developer Program</h3>
<p><span class="Apple-style-span" style="font-size:13px;font-weight:normal;">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ä.</span></p>
<p>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ä: <a href="https://developer.apple.com/membercenter/index.action" target="_blank">https://developer.apple.com/membercenter/index.action</a></p>
<p>Varmaan oudoimman kuuloiset ja samalla tärkeimmät käyttöösi tulleet työkalut ovat &#8220;iOS Provisioning Portal&#8221; ja &#8220;iTunes Connect&#8221;. Ensinmainitussa luodaan tarvittavat kehityssertifikaatit ja &#8220;App ID&#8221;: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ä.</p>
<h3>Provisioning Portal</h3>
<p>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.</p>
<p>App ID koostuu siis Applelta automaattisesti tulevasta &#8220;Bundle Seed ID&#8221;:stä sekä itse määräämästäsi &#8220;Bundle Identifieristä&#8221;. 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 &#8220;reverse domain name style&#8221;, jonka tajusin vasta googlailun jälkeen todellakin viittaavan yrityksesi tai oman nettisivustosi domainnimeen.</p>
<p>Täydellisen App ID:n rakenne on siis seuraavanlainen:</p>
<p>ABCDEFGHIJ.com.yrityksesinimi.applikaationnimi tai<br />
ABCDEFGHIJ.com.omanimesi.applikaationnimi</p>
<p>Tuo ABC&#8230; 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.)</p>
<p>Ja suositus tosiaan olisi, että sinulla todella olisi hallussa tuo www.yrityksesinimi.com tai 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.</p>
<p>Applikaatiokokoelmia (suite) varten App ID:ssä on mahdollista käyttää asteriskia * jokerimerkkinä, tähän tapaan:</p>
<p>ABCDEFGHIJ.com.yrityksesinimi.* tai<br />
ABCDEFGHIJ.*</p>
<p>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.</p>
<h3>iTunes Connect</h3>
<p>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.</p>
<p>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.</p>
<p>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!</p>
<p>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.</p>
<p>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ää &#8220;hyväksyttyä&#8221;. Tällaisen keskustelun aiheesta löysin googlaamalla: <a href="http://www.iphonedevsdk.com/forum/business-legal-app-store/34759-itunes-connect-tax-info.html" target="_blank">http://www.iphonedevsdk.com/forum/busin &#8230; -info.html</a></p>
<p>Siinäpä se!</p>
<p>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 &#8220;1.4 muut ansiotulot&#8221; ja vero.fi:stä lomakkeen 15: &#8220;Taiteilijan ja freelancerin tulot&#8221; siihen liitteeksi. Lähde: Hopeisen Omenan keskustelu aiheesta: <a href="http://hopeinenomena.net/viewtopic.php?f=40&amp;t=117834&amp;start=25" target="_blank">http://hopeinenomena.net/viewtopic.php?f=40&amp;t=117834&amp;start=25</a></p>
<h3><span class="Apple-style-span" style="font-size:15px;font-weight:bold;">iTunes Connect: Manage Your Apps</span></h3>
<p>Jos &#8220;Add New App&#8221; -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:</p>
<ul>
<li>Applikaation virallinen nimi</li>
<li>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.</li>
<li>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ä.</li>
<li>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ä.</li>
<li>Price Tier. Eka tier näkyy App Storessa hintana 0.99$ / 0,79€ jne. – sinulle Apple tilittää sitten sen siivun kun tilittää</li>
<li>Description – App Storessa näkyvä kuvausteksti. Tämä kannattaa miettiä tarkkaan!</li>
<li>Keywords – näillä hakusanoilla softasi löytyy, todella tärkeä!</li>
<li>Support URL: tämä on pakollinen, eli joku paikka pitää olla valmiina, josta applikaation ostajat saavat (ainakin teoriassa) yhteyden kehittäjään</li>
<li>Vapaaehtoiset App URL (promoamiseen) ja Privacy Policy URL</li>
<li>Rating – kaikki likaiset yksityiskohdat kysellään, kannattaa olla varautunut</li>
<li>512 x 512 px ikoni App Storea varten</li>
<li>Vähintään 1, maksimissaan 6 näyttökaappausta applikaatiosta jokaisella applikaatiosi tukemalla laiteresoluutiolla (standard, retina display, iPad). Pikselikoko määrätty tarkkaan &#8211; joko koko näyttö tai sitten ilman ylälaidan vakiostatusbaria, jos se ohjelmassasi on näkyvissä.</li>
<li>Jos juridinen kikkailu kiinnostaa, voit laatia oman EULA:si, muuten käytetään Applen standardipohjaa</li>
</ul>
<p>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.</p>
<h3>Xcode-projektin puolella</h3>
<p>Jos itsestäänselvyydet ohitetaan (softa ei saa kaatuilla jne.), ainakin pari kohtaa pitää säätää projektin asetuksissa.</p>
<p>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: &#8220;com.yrityksesinimi.applikaatiosinimi&#8221;. Sitä 10-merkkistä Bundle Seed ID:tä ei enää nykyään tarvitse eikä kuulu tuohon kirjoittaa.</p>
<p>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ä: <a href="http://iphonedevelopertips.com/xcode/base-sdk-and-iphone-os-deployment-target-developing-apps-with-the-4-x-sdk-deploying-to-3-x-devices.html" target="_blank">http://iphonedevelopertips.com/xcode/base-sdk-and-iphone-os-deployment-target-developing-apps-with-the-4-x-sdk-deploying-to-3-x-devices.html</a></p>
<p>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).</p>
<p>Ai niin, ja jos vakiokiilto ei jostain syystä sovi applikaatioikonisi tyyliin, info.plistiin voi myös lisätä kohdan &#8220;Icon already includes gloss effects&#8221;. Kulmanpyöristykset tulevat automaattisesti, niitä ei tarvitse eikä voi ottaa pois (tee siis ikonikuvasi ihan nurkasta nurkkaan asti).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aikahyppy.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aikahyppy.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aikahyppy.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aikahyppy.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aikahyppy.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aikahyppy.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aikahyppy.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aikahyppy.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aikahyppy.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aikahyppy.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aikahyppy.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aikahyppy.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aikahyppy.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aikahyppy.wordpress.com/159/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=159&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aikahyppy.wordpress.com/2011/10/30/sekalaisia-huomioita-developer-ohjelmasta/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/47e3d0b1f1fb9cdd4d6578b3496e273d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">djkyykkae</media:title>
		</media:content>
	</item>
		<item>
		<title>Pieni App Delegate -testiohjelma</title>
		<link>http://aikahyppy.wordpress.com/2011/10/19/pieni-app-delegate-testiohjelma/</link>
		<comments>http://aikahyppy.wordpress.com/2011/10/19/pieni-app-delegate-testiohjelma/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 20:58:35 +0000</pubDate>
		<dc:creator>Samuli</dc:creator>
				<category><![CDATA[Ohjelmointiesimerkkejä]]></category>

		<guid isPermaLink="false">http://aikahyppy.wordpress.com/?p=155</guid>
		<description><![CDATA[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 &#8220;Utility [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=155&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Moi,<br />
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.</p>
<p>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 &#8220;Utility Application&#8221; -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.</p>
<p>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.</p>
<p><a title="App Delegate -harjoitus" href="www.activeaggressive.com/misc/AppDelegateHarjoitus.zip" target="_blank">Tässä Xcode-projekti zip-pakettina</a>.</p>
<p>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.</p>
<pre>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:</pre>
<p>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.</p>
<p>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.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aikahyppy.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aikahyppy.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aikahyppy.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aikahyppy.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aikahyppy.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aikahyppy.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aikahyppy.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aikahyppy.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aikahyppy.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aikahyppy.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aikahyppy.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aikahyppy.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aikahyppy.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aikahyppy.wordpress.com/155/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=155&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aikahyppy.wordpress.com/2011/10/19/pieni-app-delegate-testiohjelma/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/47e3d0b1f1fb9cdd4d6578b3496e273d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">djkyykkae</media:title>
		</media:content>
	</item>
		<item>
		<title>Pikku-uutisia</title>
		<link>http://aikahyppy.wordpress.com/2011/10/17/pikku-uutisia/</link>
		<comments>http://aikahyppy.wordpress.com/2011/10/17/pikku-uutisia/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 20:59:34 +0000</pubDate>
		<dc:creator>Samuli</dc:creator>
				<category><![CDATA[Yleistä pohdintaa]]></category>

		<guid isPermaLink="false">http://aikahyppy.wordpress.com/?p=151</guid>
		<description><![CDATA[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 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=151&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<p>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.</p>
<p>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ää.</p>
<p>Tällä hetkellä tämän yökoodarin huomio on siis kohdistunut enimmäkseen AppDelegaten metodien suuntaan. Asiaa on selvitetty suht. selkeästi <a href="http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW3" target="_blank">Applen Dev Centerissä</a> ja <a href="http://www.cocoanetics.com/2010/07/understanding-ios-4-backgrounding-and-delegate-messaging/" target="_blank">Cocoaneticsissä</a>, mutta kuten aina, periaatteen tajuamisesta on vielä aika lailla matkaa siihen, että hoksaa mitä käytännössä pitää omassa applikaatiossa naputella mihinkin metodiin.</p>
<p>Mutta eiköhän tuo moniajomörkökin tuosta seläty&#8230; 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&#8230;</p>
<p>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.</p>
<p>Eli ihan – köh, köh – hypoteettisena esimerkkinä teille rakkaat lukijat, pätkä viewWillAppear-metodista:</p>
<pre>- (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 <img src='http://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />
}</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aikahyppy.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aikahyppy.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aikahyppy.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aikahyppy.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aikahyppy.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aikahyppy.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aikahyppy.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aikahyppy.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aikahyppy.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aikahyppy.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aikahyppy.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aikahyppy.wordpress.com/151/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aikahyppy.wordpress.com/151/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aikahyppy.wordpress.com/151/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=151&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aikahyppy.wordpress.com/2011/10/17/pikku-uutisia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/47e3d0b1f1fb9cdd4d6578b3496e273d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">djkyykkae</media:title>
		</media:content>
	</item>
		<item>
		<title>Välihuomautus: &#8220;FBCDN image is not allowed in stream&#8230;&#8221;</title>
		<link>http://aikahyppy.wordpress.com/2011/09/30/valihuomautus-fbcdn-image-is-not-allowed-in-stream/</link>
		<comments>http://aikahyppy.wordpress.com/2011/09/30/valihuomautus-fbcdn-image-is-not-allowed-in-stream/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 22:33:10 +0000</pubDate>
		<dc:creator>Samuli</dc:creator>
				<category><![CDATA[Ohjelmointiesimerkkejä]]></category>
		<category><![CDATA[Yleistä pohdintaa]]></category>
		<category><![CDATA[Facebook Connect]]></category>
		<category><![CDATA[Facebook Graph API]]></category>
		<category><![CDATA[Facebook iOS SDK]]></category>
		<category><![CDATA[FBCDN]]></category>
		<category><![CDATA[ffffuuuu]]></category>

		<guid isPermaLink="false">http://aikahyppy.wordpress.com/?p=144</guid>
		<description><![CDATA[Moi pitkästä aikaa! En ole heittänyt lusikkaa nurkkaan, enkä myöskään devauspyyhettäni kehään, päinvastoin. Aika vain on ollut hieman kortilla viime kuukausina. Olen laatinut yhtä suhteellisen yksinkertaista taulukkonäkymiin ja -navigaatioon perustuvaa applikaatiota, mutta huomasin jossain vaiheessa, että sekin on turhan laaja ekaksi projektiksi ja näinä harvoina vapaina yön pikkutunteina edistettäväksi. Palasin siis metaforiselle Moleskinelleni, valitsin jokseenkin [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=144&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://aikahyppy.files.wordpress.com/2011/09/screen-shot-2011-09-30-at-12-18-10-am.png"><img class="alignleft size-thumbnail wp-image-145" title="Screen shot 2011-09-30 at 12.18.10 AM" src="http://aikahyppy.files.wordpress.com/2011/09/screen-shot-2011-09-30-at-12-18-10-am.png?w=105&#038;h=150" alt="" width="105" height="150" /></a>Moi pitkästä aikaa! En ole heittänyt lusikkaa nurkkaan, enkä myöskään devauspyyhettäni kehään, päinvastoin. Aika vain on ollut hieman kortilla viime kuukausina. Olen laatinut yhtä suhteellisen yksinkertaista taulukkonäkymiin ja -navigaatioon perustuvaa applikaatiota, mutta huomasin jossain vaiheessa, että sekin on turhan laaja ekaksi projektiksi ja näinä harvoina vapaina yön pikkutunteina edistettäväksi.</p>
<p>Palasin siis metaforiselle Moleskinelleni, valitsin jokseenkin järkevien softaideoideni pinosta kaikista simppeleimmän, ja aloin hommiin. Kyseessä on pikkuruinen yhden näkymän viihdeapplikaatio, ja se alkaa itse asiassa olla olennaisilta osiltaan valmis! Suosittelen muuten kaikille samankaltaisessa tilanteessa oleville: aloittakaa yhden screenin applikaatiolla! Tekemistä ja opettelua riittää ihan varmasti, ja toisekseen, osa maailman suosituimmista iOS-applikaatioista on (ainakin pintapuolisesti) simppeleitä yhden ruudun softia.</p>
<p>Tilanne softan kanssa alkaa olla sellainen, että jotakuinkin kaikki sellaiset ominaisuudet jotka eivät edellytä todellisella iVehkeellä testaamista, alkavat olla valmiina. Toisin sanoen, hurja kahdeksankympin sijoitus omaan Developer Programiin on lähempänä kuin koskaan. Jotta kaikki vapaa-aikani ei menisi omilla applikaatioraakileilla leikkiessä oikealla iPhonella, olen kuitenkin edellyttänyt itseltäni tämän ekan applikaation viimeistelemistä kaikilta muilta osiltaan ennen Developer-tilin avausta ja fyysisellä laitteella testaamista.</p>
<p>Yksi näistä &#8220;muista osista&#8221; on ohjelmallinen Facebook-statuspäivitys, jota olen siis viime päivät (=yöt) opetellut. Ja se on myös tämän kirjoituksen pohjimmainen motivaattori.</p>
<h3>Ja se varsinainen asia:</h3>
<p>Siltä varalta, jos joku muukin sattumoisin haluaisi tehdä applikaatiollaan jotain niinkin poikkeuksellista kuin antaa käyttäjän liittää applikaatiosta lähettämänsä kuvan Facebook-statukseensa, eikä tunne tämän asian ympärillä kiehunutta kollektiivista devaajien raivoa, sanottakoon tässä: ei v**** onnistu.</p>
<p>Eli: kuvia voi uploadata FB:iin applikaatiosta käsin (helposti), käyttäjän seinälle voi laatia statuspäivityksen johon saa myös määritellä kuva-URLin, (helposti), näiden uploadattujen kuvien URLin pystyy selvittämään ohjelmallisesti FB graph API:n metodien avulla (pienellä perehtymisellä) mutta näitä nimenomaisia URLeja ei sitten saakaan käyttää statuspäivityksen kuva-URLeina (ei niin sitten millään).</p>
<p>Tulos on virheilmoitus, joka alkaa näin: &#8220;FBCDN image is not allowed in stream&#8230;&#8221; – googlailemalla löytyy muutama tuhat devausblogia, jossa lainataan Facebookin ilmoitusta nähtävästi viime vuoden kesältä:</p>
<blockquote>
<div>&#8220;We no longer allow stream stories to contain images that are hosted on the fbcdn.net domain. The images associated with these URLs aren&#8217;t always optimized for stream stories and occasionally resulted in errors, leading to a poor user experience. Make sure your stream attachments don&#8217;t reference images with this domain. You should host the images locally.&#8221;</div>
</blockquote>
<p>Että se siitä. Eipä siinä muuten mitään, mutta jokseenkin turhauttaa pari viime yötä, jotka meni FB:n developer-dokumentteja kahlatessa ja yllämainittuja tekniikoita opetellessa. Että ehkäpä olisi voinut jossain getting started -osion kohdalla vaikka ilmoittaa, että kenties yleisimmin kaivattu toiminnallisuus sosiaaliselle applikaatiolle on kerrassaan kielletty FB:n toimesta.</p>
<p>Kylläpä taas hieman paremmin osaa arvostaa Applen Dev Centerin loistavasti laadittuja ja käyttäjälähtöisesti kirjoitettuja dokumentaatioita. Jobs 6 &#8211; Zuckerberg 0.</p>
<p>Ei mulla muuta, piti vain tulla vähän päästämään höyryjä.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aikahyppy.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aikahyppy.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aikahyppy.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aikahyppy.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aikahyppy.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aikahyppy.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aikahyppy.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aikahyppy.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aikahyppy.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aikahyppy.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aikahyppy.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aikahyppy.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aikahyppy.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aikahyppy.wordpress.com/144/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=144&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aikahyppy.wordpress.com/2011/09/30/valihuomautus-fbcdn-image-is-not-allowed-in-stream/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/47e3d0b1f1fb9cdd4d6578b3496e273d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">djkyykkae</media:title>
		</media:content>

		<media:content url="http://aikahyppy.files.wordpress.com/2011/09/screen-shot-2011-09-30-at-12-18-10-am.png?w=105" medium="image">
			<media:title type="html">Screen shot 2011-09-30 at 12.18.10 AM</media:title>
		</media:content>
	</item>
		<item>
		<title>Sample Code ja Base SDK</title>
		<link>http://aikahyppy.wordpress.com/2011/06/02/sample-code-ja-base-sdk/</link>
		<comments>http://aikahyppy.wordpress.com/2011/06/02/sample-code-ja-base-sdk/#comments</comments>
		<pubDate>Thu, 02 Jun 2011 08:31:52 +0000</pubDate>
		<dc:creator>Samuli</dc:creator>
				<category><![CDATA[Yleistä pohdintaa]]></category>
		<category><![CDATA[Base SDK]]></category>
		<category><![CDATA[Sample Code]]></category>
		<category><![CDATA[SDK]]></category>

		<guid isPermaLink="false">http://aikahyppy.wordpress.com/?p=127</guid>
		<description><![CDATA[Heipä taas! Harjoittelu UIKitin parissa jatkuu, ja kylläpä Apple onkin pedannut pehmoisen pedin standardinmukaisten navigointipohjaisten applikaatioiden tekijälle: kaikki Applen omista appseista tutut käyttistoiminnot – animaatiot, feidaukset ynnämuut mukaanlukien – ovat automaattisesti käytettävissä ilman että tarvitsee kirjoitella riviäkään esimerkiksi animointikoodia. Kirjoittelen aiheesta joskus pidemmin, mutta nyt ajattelin ottaa esiin yhden pulman, jonka ratkaiseminen helpotti omaa opiskeluani [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=127&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Heipä taas! Harjoittelu UIKitin parissa jatkuu, ja kylläpä Apple onkin pedannut pehmoisen pedin standardinmukaisten navigointipohjaisten applikaatioiden tekijälle: kaikki Applen omista appseista tutut käyttistoiminnot – animaatiot, feidaukset ynnämuut mukaanlukien – ovat automaattisesti käytettävissä ilman että tarvitsee kirjoitella riviäkään esimerkiksi animointikoodia. Kirjoittelen aiheesta joskus pidemmin, mutta nyt ajattelin ottaa esiin yhden pulman, jonka ratkaiseminen helpotti omaa opiskeluani taas kummasti.</p>
<p>Kuten mainittu, Applella on Sample Code -arkisto, josta löytyy esimerkkitoteutuksia melkeinpä mistä vaan iOS-applikaation perustoiminnosta. Lähdekoodit eivät kuitenkaan näytä päivittyvän kovin usein, mistä seuraa että lataamani iOS SDK 4.2 antaa lähes jokaisen kohdalla virheilmoituksen &#8220;Base SDK missing&#8221;, eikä applikaatiota pääse testaamaan.</p>
<p>Ratkaisu on kuitenkin useimmiten hyvin yksinkertainen. Tässä kuvasarja toimenpiteistä, joilla vanhemmatkin Sample Codet pitäisi saada kääntymään:</p>

<a href='http://aikahyppy.wordpress.com/2011/06/02/sample-code-ja-base-sdk/screen-shot-2011-06-02-at-10-39-08-am/' title='Kuva 9.0. &quot;Base SDK Missing&quot;'><img data-attachment-id='128' data-orig-size='671,351' data-liked='0'width="150" height="78" src="http://aikahyppy.files.wordpress.com/2011/06/screen-shot-2011-06-02-at-10-39-08-am.png?w=150&#038;h=78" class="attachment-thumbnail" alt="Kuva 9.0. Kun vasemman ylälaidan dropdown-menun otsikko näyttää &quot;Base SDK Missing&quot; ja koodilistauksen frameworkit on merkitty punaisella, ei koodia kannata yrittää kääntää, siitä seuraa vain virheilmoitus. Tuplaklikkaa sen sijaan vasemman palstan listasta projektin kuvaketta." title="Kuva 9.0. &quot;Base SDK Missing&quot;" /></a>
<a href='http://aikahyppy.wordpress.com/2011/06/02/sample-code-ja-base-sdk/screen-shot-2011-06-02-at-10-40-17-am/' title='Kuva 9.1. Project Info'><img data-attachment-id='129' data-orig-size='536,673' data-liked='0'width="119" height="150" src="http://aikahyppy.files.wordpress.com/2011/06/screen-shot-2011-06-02-at-10-40-17-am.png?w=119&#038;h=150" class="attachment-thumbnail" alt="Kuva 9.1. Valitse General-välilehden alimmasta dropdown-valikosta &quot;Latest iOS&quot;, tallenna, sulje ja avaa projekti uudestaan, niin Base SDK pitäisi löytyä." title="Kuva 9.1. Project Info" /></a>
<a href='http://aikahyppy.wordpress.com/2011/06/02/sample-code-ja-base-sdk/screen-shot-2011-06-02-at-10-41-30-am/' title='Kuva 9.2. Targets'><img data-attachment-id='133' data-orig-size='631,311' data-liked='0'width="150" height="73" src="http://aikahyppy.files.wordpress.com/2011/06/screen-shot-2011-06-02-at-10-41-30-am.png?w=150&#038;h=73" class="attachment-thumbnail" alt="Kuva 9.2. Jos ongelma ei ratkennut, tuplaklikkaa vielä Target info esiin." title="Kuva 9.2. Targets" /></a>
<a href='http://aikahyppy.wordpress.com/2011/06/02/sample-code-ja-base-sdk/screen-shot-2011-06-02-at-10-41-38-am/' title='Kuva 9.3. Target Info'><img data-attachment-id='134' data-orig-size='536,673' data-liked='0'width="119" height="150" src="http://aikahyppy.files.wordpress.com/2011/06/screen-shot-2011-06-02-at-10-41-38-am.png?w=119&#038;h=150" class="attachment-thumbnail" alt="Kuva 9.3. Vaihda Target Info -ikkunan Build-välilehdeltäkin Base SDK -kohtaan &quot;Latest iOS&quot;, tallenna, sulje ja avaa taas." title="Kuva 9.3. Target Info" /></a>
<a href='http://aikahyppy.wordpress.com/2011/06/02/sample-code-ja-base-sdk/screen-shot-2011-06-02-at-10-42-16-am/' title='Kuva 9.4. Toimii!'><img data-attachment-id='135' data-orig-size='645,335' data-liked='0'width="150" height="77" src="http://aikahyppy.files.wordpress.com/2011/06/screen-shot-2011-06-02-at-10-42-16-am.png?w=150&#038;h=77" class="attachment-thumbnail" alt="Kuva 9.4. Viimeistään nyt projektin pitäisi kääntyä ongelmitta applikaatioksi, ja pääset tutkimaan esimerkkikoodin toimintaa käytännössä." title="Kuva 9.4. Toimii!" /></a>

<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aikahyppy.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aikahyppy.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aikahyppy.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aikahyppy.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aikahyppy.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aikahyppy.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aikahyppy.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aikahyppy.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aikahyppy.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aikahyppy.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aikahyppy.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aikahyppy.wordpress.com/127/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aikahyppy.wordpress.com/127/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aikahyppy.wordpress.com/127/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=127&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aikahyppy.wordpress.com/2011/06/02/sample-code-ja-base-sdk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/47e3d0b1f1fb9cdd4d6578b3496e273d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">djkyykkae</media:title>
		</media:content>

		<media:content url="http://aikahyppy.files.wordpress.com/2011/06/screen-shot-2011-06-02-at-10-39-08-am.png?w=150" medium="image">
			<media:title type="html">Kuva 9.0. &#34;Base SDK Missing&#34;</media:title>
		</media:content>

		<media:content url="http://aikahyppy.files.wordpress.com/2011/06/screen-shot-2011-06-02-at-10-40-17-am.png?w=119" medium="image">
			<media:title type="html">Kuva 9.1. Project Info</media:title>
		</media:content>

		<media:content url="http://aikahyppy.files.wordpress.com/2011/06/screen-shot-2011-06-02-at-10-41-30-am.png?w=150" medium="image">
			<media:title type="html">Kuva 9.2. Targets</media:title>
		</media:content>

		<media:content url="http://aikahyppy.files.wordpress.com/2011/06/screen-shot-2011-06-02-at-10-41-38-am.png?w=119" medium="image">
			<media:title type="html">Kuva 9.3. Target Info</media:title>
		</media:content>

		<media:content url="http://aikahyppy.files.wordpress.com/2011/06/screen-shot-2011-06-02-at-10-42-16-am.png?w=150" medium="image">
			<media:title type="html">Kuva 9.4. Toimii!</media:title>
		</media:content>
	</item>
		<item>
		<title>Pikainen päivitys&#8230;</title>
		<link>http://aikahyppy.wordpress.com/2011/05/26/pikainen-paivitys/</link>
		<comments>http://aikahyppy.wordpress.com/2011/05/26/pikainen-paivitys/#comments</comments>
		<pubDate>Thu, 26 May 2011 06:00:41 +0000</pubDate>
		<dc:creator>Samuli</dc:creator>
				<category><![CDATA[Yleistä pohdintaa]]></category>

		<guid isPermaLink="false">http://aikahyppy.wordpress.com/?p=125</guid>
		<description><![CDATA[Tässä on nyt tovi opeteltu suhteellisen matalan tason frameworkeja, joihin framerate-kriittisiä pelejä laadittaessa täytyykin useimmiten turvautua. Peliprojektien välissä ajattelin kuitenkin opetella hieman myös UIKitin hyödyntämistä, joka on ehkä tyypillisintä iPhone-ohjelmointia. Pieni hyötyapplikaatiokin on kehitteillä. Näistä lisää myöhemmin – tämän postauksen varsinainen tarkoitus on vain esitellä loistava linkkilöytö, joka tuli dokumentaatioita kahlaillessa vastaan. Itunes U:ssa on [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=125&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Tässä on nyt tovi opeteltu suhteellisen matalan tason frameworkeja, joihin framerate-kriittisiä pelejä laadittaessa täytyykin useimmiten turvautua. Peliprojektien välissä ajattelin kuitenkin opetella hieman myös UIKitin hyödyntämistä, joka on ehkä tyypillisintä iPhone-ohjelmointia. Pieni hyötyapplikaatiokin on kehitteillä.</p>
<p>Näistä lisää myöhemmin – tämän postauksen varsinainen tarkoitus on vain esitellä loistava linkkilöytö, joka tuli dokumentaatioita kahlaillessa vastaan.</p>
<p>Itunes U:ssa on nimittäin ladattavissa Stanfordin talven 2010 iPhone-ohjelmoinnin peruskurssin luentovideot kokonaisuudessaan, täysin ilmaiseksi!</p>
<p>Linkki esittelysivuille <a href="http://itunes.apple.com/us/itunes-u/iphone-application-development/id384233225" target="_blank">tässä</a>.</p>
<p>Ekan luennon ensimmäiset parikymmentä minuuttia on vain kurssin käytännön asioiden läpikäymistä, ne voi vaikka skipata, mutta siitä lähtien kyllä täyttä asiaa. Olisinpa törmännyt tähän ekana treenipäivänäni, ei ehkä olisi tarvinnut opetella ihan niin paljon kantapään kautta!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aikahyppy.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aikahyppy.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aikahyppy.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aikahyppy.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aikahyppy.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aikahyppy.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aikahyppy.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aikahyppy.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aikahyppy.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aikahyppy.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aikahyppy.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aikahyppy.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aikahyppy.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aikahyppy.wordpress.com/125/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=125&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aikahyppy.wordpress.com/2011/05/26/pikainen-paivitys/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/47e3d0b1f1fb9cdd4d6578b3496e273d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">djkyykkae</media:title>
		</media:content>
	</item>
		<item>
		<title>Se liikkuu sittenkin!</title>
		<link>http://aikahyppy.wordpress.com/2011/05/21/se-liikkuu-sittenkin/</link>
		<comments>http://aikahyppy.wordpress.com/2011/05/21/se-liikkuu-sittenkin/#comments</comments>
		<pubDate>Sat, 21 May 2011 01:36:47 +0000</pubDate>
		<dc:creator>Samuli</dc:creator>
				<category><![CDATA[Ohjelmointiesimerkkejä]]></category>

		<guid isPermaLink="false">http://aikahyppy.wordpress.com/?p=113</guid>
		<description><![CDATA[Ensimmäinen varsinainen harjoitustyöni, viihdepainotteinen aurinkokuntasimulaattori, on lähtenyt ihan mukavasti käyntiin. Perusosat – kosketusnäytön tapahtumiin reagointi, säännöllisten tilannepäivitysten laskeminen ja ruutuun piirtäminen toimivat jotenkuten, joskaan eivät aivan bugeitta, tuskin ihan oikeaoppisesti, eivätkä taatusti ainakaan optimoidusti. Helpoin osuus oli odotetusti Planet-luokan laatiminen, koska MVC-mallin model-osio toimii täysin itsenäisesti, eikä itselleni vaikeita kytkyjä iOS-käyttöliittymään tarvinnut siis vielä miettiä.  [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=113&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ensimmäinen varsinainen harjoitustyöni, viihdepainotteinen aurinkokuntasimulaattori, on lähtenyt ihan mukavasti käyntiin. Perusosat – kosketusnäytön tapahtumiin reagointi, säännöllisten tilannepäivitysten laskeminen ja ruutuun piirtäminen toimivat jotenkuten, joskaan eivät aivan bugeitta, tuskin ihan oikeaoppisesti, eivätkä taatusti ainakaan optimoidusti.</p>
<p>Helpoin osuus oli odotetusti Planet-luokan laatiminen, koska <a href="http://developer.apple.com/library/ios/#documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html">MVC-mallin</a> model-osio toimii täysin itsenäisesti, eikä itselleni vaikeita kytkyjä iOS-käyttöliittymään tarvinnut siis vielä miettiä.  Xcoden new filestä vaan Objective-C class &gt; Subclass of NSObject (joka on iOS-ohjelmoinnissa jonkinlainen &#8220;kaikkien olioiden äiti&#8221;) ja tallennetaan nimillä Planet.h ja Planet.m. Tämän luokan muuttujien ja metodien määrittely muistutti eniten sitä ohjelmointia jota opettelin silloin joskus kun Ritari Ässä oli vielä kova juttu.</p>
<h4>Planet.h</h4>
<p>Header-tiedostossa oli #import &lt;Foundation/Foundation.h&gt; joten jätin sen siihen ja naputtelin perään muutamia vakioita kuten:</p>
<pre>#define PLANET_GROWTH_RATIO 0.5
#define MAX_PLANET_RADIUS 50.0</pre>
<p>Tämä on simppeli tapa määritellä nimettyjä vakioita. Muitakin tapoja näytti olevan, mutta tämä vaikutti tarpeisiini sopivalta.</p>
<p>Sitten määrittelin @interfacen, jossa esitellään luokan julkiset muuttujat, esimerkiksi nämä:</p>
<pre>@interface Planet : NSObject {
    BOOL tooFar;
    float radius;
    float mass;
    NSTimeInterval birthday;
    // jne.
}</pre>
<p>Noiden floatien sijaan suositeltiin käytettäväksi CGFloatia, kuulemma helpottaa 64-bittisyyteen siirtymistä, mutta kaipasin hämmentävän koodin joukkoon jotain ennestään tuttua, joten käytin float-määritystä. Tuo NSTimeInterval taisi olla sekin vain normaali float tms., mutta koska sitä käytetään nimenomaan ajan mittaamiseen se on ymmärrettävyyden vuoksi nimetty noin. En tiedä, olisiko jotenkin parempi käyttää näissäkin pointereita, mutta olen jotenkin vielä arka käyttämään niitä muuten kuin pakon edessä (olioihin viitatessa).</p>
<p>Sitten @propertyt (eli ne getter/setter-metodin automatisointikäskyt) samoille muuttujille tähän tapaan:</p>
<pre>@property(nonatomic, readwrite, getter=isTooFar) BOOL tooFar;
@property(nonatomic, readwrite) float radius;
@property(nonatomic, readwrite) float mass;</pre>
<p>Ja vielä metodien nimet:</p>
<pre>-(id) initWithLocation: (CGPoint)theLocation birthday:(NSTimeInterval)theBirthday;
-(void) calculateGravityWithSolarSystem: (NSDictionary *)theSolarSystem;
//jne.</pre>
<p>Tuo eka on alustusmetodi, joten siinä on paluuarvona (id), eli tässä tapauksessa planeetta-luokan instanssi. Tuo painovoima-metodi ei palauta mitään lopputulosta vaan muuttaa vain sen planeetta-instanssin sisäisiä arvoja, josta sitä kutsutaan,  joten paluuarvona on (void). Samaan tapaan kaikki tarvittavat metodit ja sitten loppuun vielä @end, niin päästään varsinaiseen metodien määrittelyyn.</p>
<h4>Planet.m</h4>
<p>Tässä jonkin verran karsittu listaus tiedoston alusta:</p>
<pre>#import "Planet.h"
@implementation Planet

@synthesize tooFar;
@synthesize radius;
@synthesize mass;
// jne.

-(id) initWithLocation:(CGPoint)theLocation birthday:(NSTimeInterval)theBirthday
{    self = [super init]; //tämä rivi piti olla, se liittyi jotenkin periytymishommiin mutten nyt muista tarkemmin
    if (self) { //pitää varmistaa että edellisen rivin komento onnistui ennen kun aloitetaan alustelu
        self.xCenter = theLocation.x;
        self.yCenter = theLocation.y;
        self.birthday = theBirthday;
        self.tooFar = NO;
        self.radius = BABY_PLANET_RADIUS;
        self.diameter = self.radius*2;
        self.mass = (self.radius * self.radius * self.radius) / MASS_DIVIDER;
        self.xSpeed = 0;
        //jne.
    }
    return self;
}

-(void) calculateGravityWithSolarSystem: (NSDictionary *)theSolarSystem {
    float xDistance, yDistance, distance = 0.0;
    double multipliedMasses, distanceSqr, gravity, xGravity, yGravity = 0.0;
    // seuraavat kolme riviä käyvät läpi theSolarSystem -Dictionaryn
    // kaikki planeetat, eräänlainen looppi siis, kiitti vinkistä www.hopeinenomena.net
    NSEnumerator *enumerator = [theSolarSystem keyEnumerator];
    id key;
    while ((key = [enumerator nextObject])) {
        xDistance = ([[theSolarSystem objectForKey:key] xCenter] - self.xCenter);
        yDistance = ([[theSolarSystem objectForKey:key] yCenter] - self.yCenter);
        distance = sqrtf((xDistance * xDistance) + (yDistance * yDistance));
        if (distance != 0) {
            if (distance &lt; (self.radius + [[theSolarSystem objectForKey:key] radius])){
                // Ympyröiden törmäystunnistus, hillitsee älytöntä kiihtymistä pakottamalla
                // etäisyysmuuttujan vähintään planeettojen säteiden summan suuruiseksi.
                // Ei kimpoamislaskelmia tms. vielä, väri vain muuttuu punaiseksi
                distance = (self.radius + [[theSolarSystem objectForKey:key] radius]);
                NSLog(@"Hit!");
                self.red = 1;
            }
            multipliedMasses = (self.mass * [[theSolarSystem objectForKey:key] mass]);
            distanceSqr = (distance * distance);
            gravity = multipliedMasses / distanceSqr;
            xGravity = gravity * xDistance / distance;
            yGravity = gravity * yDistance / distance;
            self.xForce += (xGravity);
            NSLog(@"distance: %f, gravity: %f, multipliedMasses: %f, distanceSqr: %f", distance, gravity, multipliedMasses, distanceSqr);
            NSLog(@"xDist: %f, xForce: %f, xGravity: %f", xDistance, self.xForce, xGravity);
            self.yForce += (yGravity);                    
            NSLog(@"yDist: %f, yForce: %f, yGravity: %f", yDistance, self.yForce, yGravity);

        }
    }
}
// jne.</pre>
<p>Tuo calculateGravity&#8230; oli melko kinkkinen, mutta ei varsinaisten gravitaatiolaskelmien takia, vaan koska en meinannut millään osata tehdä luuppia. Samaan ongelmaan törmäsin myös myöhemmin, kun ajastinmetodin sisällä piti kutsua kaikkien planeettojen päivitystoimintoja vuorotellen. Onneksi  <a href="http://hopeinenomena.net/viewforum.php?f=40">hopeinenomena.netin</a> avuliaat toverit tulivat hätiin ja neuvoivat tuon enumerator-objektin käytön. Tästä tarkemmin vähän jäljempänä. Tuo Dictionary joka koodissa paljon toistuu, on muuten kuten taulukko, mutta siihen tallennetaan objektin kaveriksi aina key-arvo, jota käyttämällä päästään aina tarvittaessa käsiksi oikeaan objektiin.</p>
<h4>SolarSystemView.h ja .m</h4>
<p>Planeetat piirretään view-luokan drawRect-metodissa, jonka käyttöä aiemmin jo vähän opeteltiinkin. View-luokassa tarkkaillaan kuitenkin myös kosketusnäyttöä ja luodaan kosketusten perusteella uusia planeettoja. Header on lyhyt, kokonaisuudessaan tässä:</p>
<pre>#import &lt;UIKit/UIKit.h&gt;
#import "Planet.h"
#import "SolarSystemViewController.h"
#import "SolarSystemAppDelegate.h"

@class SolarSystemViewController;

@interface SolarSystemView : UIView {
    SolarSystemViewController *solarSystemViewController;
    float dashes[2];
    NSMutableDictionary *solarSystem;
}
@property(nonatomic, retain) SolarSystemViewController *solarSystemViewController;
@property(nonatomic, readwrite, retain) NSMutableDictionary *solarSystem;

@end</pre>
<p>Siinä pohjustetaan Viewin paritusta ViewControllerin kanssa, josta tarkemmin kohta. Ekaksi kurkataan kuitenkin pari juttua View.m:stä. Se alkaa näin:</p>
<pre>#import "SolarSystemView.h"
@implementation SolarSystemView
@synthesize solarSystemViewController;
@synthesize solarSystem;

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor blackColor];
        dashes[0] = 2;
        dashes[1] = 5;

        solarSystem = [[NSMutableDictionary alloc] initWithCapacity:20];
    }

    return self;
}
//jatkuu...</pre>
<p>Tuossa heti alussa on taas ilmiö, joka tulee Cocoan kanssa usein vastaan: tuota initWithFrameahan ei määritelty headerissa lainkaan, silti sen toiminta tuossa selvästi määritellään. Se on yksi näistä lukuisista vakiomuotoisista metodeista, joita iOS kutsuu automaattisesti sopivissa tilanteissa, ja jotka koodaaja uudelleenmäärittelee tekemään mitä sitten haluaakaan. Tässä tapauksessa määrittelemään taustavärin sekä vähän nolosti tuon dashes-taulukon tuossa, koska en osannut tehdä taulukkoa vakiona (tuota dashes-taulukkoa tarvitaan myöhemmin planeettojen ääriviivoissa käytetyn katkoviivan määrittelyyn). Ja sitten alustetaan tuo solarSystem -dictionary, johon kaikki luotavat planeetat tullaan laittamaan talteen.</p>
<p>Saman tiedoston drawRect-metodissa loopataan läpi kaikki kirjastoon tallennetut planeetat ja piirretään niiden perustella sopivankokoiset ympyrät oikeille paikoilleen, tähän tapaan:</p>
<pre>// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    CGContextRef solarSystemContext = UIGraphicsGetCurrentContext();
    //CGContextClearRect (solarSystemContext,CGRectMake(0, 0, 320, 480));
    CGContextSetLineWidth(solarSystemContext, 2);
    CGContextSetLineDash (solarSystemContext, 0, dashes, 2);
    CGContextSetLineCap(solarSystemContext, kCGLineCapRound);
    NSString *key;
    for(key in solarSystem){
        CGContextSetRGBFillColor (solarSystemContext, [[solarSystem objectForKey: key] red], [[solarSystem objectForKey: key] green], [[solarSystem objectForKey: key] blue], [[solarSystem objectForKey: key] alphaValue]);
        CGContextSetRGBStrokeColor (solarSystemContext, [[solarSystem objectForKey: key] red], [[solarSystem objectForKey: key] green], [[solarSystem objectForKey: key] blue], [[solarSystem objectForKey: key] alphaValue]);    
        CGContextAddEllipseInRect (solarSystemContext, CGRectMake ([[solarSystem objectForKey: key] leftEdge], [[solarSystem objectForKey: key] topEdge], [[solarSystem objectForKey: key] diameter], [[solarSystem objectForKey: key] diameter]));
        CGContextDrawPath(solarSystemContext, kCGPathFillStroke);
    }
    [key release];
}</pre>
<p>Tuossa olin näköjään osannut käyttää luuppia Dictionaryn läpikäyntiin noin yksinkertaisesti, miksihän en muistanut tuota tapaa siellä Planet-luokan koodissa tai myöhemmin siellä Timer-metodissa&#8230; no, tulipa treenattua erilaisia luuppaustapoja!</p>
<p>Edelleen, täällä SolarSystemView.m:ssä on määritelty uudestaan kosketusnäytön tapahtumiin reagointimetodit. Nämä voisivat ymmärtääkseni olla View Controllerinkin puolella kuten ajastinmetoditkin (oho, spoileri!), ja minulla on sellainen fiilis, että ehkä niiden tyylikkyyden nimissä pitäisikin, jotta View-objektille jäisi selkeästi pelkkä ruudun piirto. Mutta en ole ihan varma, joten ne nyt jäivät tähän – kumpikaan tapa ei siis ole varsinaisesti laiton. Mutta ne touches-metodit, tässä:</p>
<pre>// Handles the start of a touch
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{    
    //NSUInteger numTaps = [[touches anyObject] tapCount];
    // Enumerate through all the touch objects.
    for (UITouch *touch in touches) {
        CGPoint touchLocation = [touch locationInView:self];
        NSString *addressToTouchThatCreatedAPlanet = [[NSString alloc] initWithFormat:@"%u", touch];
        Planet *aPlanet = [[Planet alloc] initWithLocation:touchLocation birthday:[touch timestamp]];

        [solarSystem setObject: aPlanet forKey: addressToTouchThatCreatedAPlanet];
        [aPlanet release];
        [addressToTouchThatCreatedAPlanet release];

        /*
        Tällä palautetaan osoite takaisin integeriksi
        unsigned int addressAsInteger = [addressToTouchThatCreatedAPlanet intValue];
        UITouch *testTouch = addressAsInteger;*/
        [self setNeedsDisplay];
    }    
}

// Handles the continuation of a touch.
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{  
    // Enumerates through all touch objects
    for (UITouch *touch in touches) {
        CGPoint touchLocation = [touch locationInView:self];

        Planet *aPlanet = [solarSystem objectForKey: [NSString stringWithFormat:@"%u", touch]];
        [aPlanet movePlanetToLocation:touchLocation];
    }

}

// Handles the end of a touch event.
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    // Enumerates through all touch object
    for (UITouch *touch in touches) {
        CGPoint touchLocation = [touch locationInView:self];
        CGPoint previousTouchLocation = [touch previousLocationInView:self];

        Planet *aPlanet = [solarSystem objectForKey: [NSString stringWithFormat:@"%u", touch] ];
        [aPlanet setPlanetFreeWithXSpeed: (touchLocation.x - previousTouchLocation.x) ySpeed:(touchLocation.y - previousTouchLocation.y)];
    }
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    // Enumerates through all touch object
    for (UITouch *touch in touches) {
    // täällä pitäisi varautua siihen, jos touch-tapahtuma keskeytyy esim. puhelimen soidessa, mutta en ole viitsinyt <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
    }
}</pre>
<p>Tuossa ekassa metodissa touchesBegan käy ilmi myös minkä takia päädyin Dictionaryyn planeettojen tallentamiseksi enkä settiin tai arrayhin. Kaunis ajatukseni oli tallentaa planeetan key-pariksi sen kosketuksen pointteriosoitteen, jolla kyseinen planeetta on luotu, jotta multitouch-tilanteessa planeetta osaisi pysytellä juuri oikean kosketuksen mukana. Itse asiassa tämä toimiikin, mutta samalla syntyi koodin toistaiseksi järein bugi. iOS nimittäin kierrättää kosketusten pointteriosoitteita aika tehokkaasti vanhojen kosketusten päätyttyä,  joten uudet planeetat alkavat ennen pitkää tallentua vanhojen päälle. Tämä pitäisi korjata käyttämällä dictionaryä vain kosketusten ajan, tai tallentaa koko kosketuksen osoitetieto vaikka tuonne planeetta-luokan muuttujaan ja tarkistaa touchesMoved-metodissa sieltä käsin. Tämä on vielä vähän hakusessa <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h4>SolarSystemViewController.h</h4>
<p>Tämä on hyvin simppeli:</p>
<pre>#import &lt;UIKit/UIKit.h&gt;
#import "SolarSystemView.h"
#import "Planet.h"

@class SolarSystemView;

@interface SolarSystemViewController : UIViewController {
    SolarSystemView *solarSystemView;
    NSTimer *solarSystemTimer;
}

@property (nonatomic, assign) SolarSystemView *solarSystemView;

-(void) updateSolarSystem:(NSTimer*)theTimer;

@end</pre>
<p>Tuossa määriteltiin solarSystemView-instanssi, jotta näkymää päästään kontrolloimaan. Ja sitten tuo tärkeä NSTimer *solarSystemTimer -ajastinobjekti, jota tarvitaan säännöllisen tilannepäivitysrutiinin käynnistämiseen. ViewControllerin ainoa oma metodi onkin tuo updateSolarSystem, jota tuolta ajastimesta sitten säännöllisesti kutsutaan.</p>
<h4>SolarSystemViewController.m</h4>
<p>Täällä ei oikeastaan olekaan muuta kuin tuo updateSolarSystem-metodi sekä ViewController-templatessa valmiina tulleet metodit, joista tarvitsi uudelleenmääritellä vain tuo loadView</p>
<pre>#import "SolarSystemViewController.h"
@implementation SolarSystemViewController
@synthesize solarSystemView;

-(void) updateSolarSystem: (NSTimer*)theTimer {
     NSMutableArray *keysForPlanetsToRemove = [NSMutableArray array];
     NSEnumerator *enumerator = [[solarSystemView solarSystem] keyEnumerator];
     id key;
     while ((key = [enumerator nextObject])) {

         if ([[[solarSystemView solarSystem] objectForKey:key] isTooFar])
         { [keysForPlanetsToRemove addObject:key];
         NSLog(@"%@", keysForPlanetsToRemove);}

         else {
             [[[solarSystemView solarSystem] objectForKey:key] growPlanetUnderConstruction];
             [[[solarSystemView solarSystem] objectForKey:key] calculateGravityWithSolarSystem:[solarSystemView solarSystem]];
             [[[solarSystemView solarSystem] objectForKey:key] movePlanet];    
         }
     }
    [[solarSystemView solarSystem] removeObjectsForKeys:keysForPlanetsToRemove];

    NSLog(@"Planeettoja: %u", [[solarSystemView solarSystem] count]);
    [solarSystemView setNeedsDisplay];
}

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
    self.wantsFullScreenLayout = YES;
    SolarSystemView *view = [[SolarSystemView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    view.solarSystemViewController = self;
    self.view = view;
    self.solarSystemView = view;
    self.view.multipleTouchEnabled = YES;
    [view release];
    // Timerin ohjelmointi
    solarSystemTimer = [[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(updateSolarSystem:) userInfo:nil repeats: YES] retain];

}

/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
}
*/

/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations.
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc. that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)dealloc {
    [super dealloc];
}

@end</pre>
<p>Tämä rivi oli itselleni ehkä koko harjoituksen valaisevin:</p>
<pre>solarSystemTimer = [[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(updateSolarSystem:) userInfo:nil repeats: YES] retain];</pre>
<p>Tuolla siis laitetaan käyntiin ajastin, joka lähettää kerran sadasosasekunnissa (jos pystyy) kohteelle self, eli tälle ViewControllerille itselleen metodikutsun updateSolarSystem. Tuossa siis vihdoin on se &#8220;pääluuppi&#8221; tai ainakin niin lähellä sitä kuin Cocoa-maailmassa pääsee ilman todellisia hc-kikkoja. Ja tuolta loadView-metodin lopusta sille löytyi mielestäni ihan looginen paikkakin – ajastinta tarvitaan ekan kerran siinä vaiheessa kun eka näkymä on latautunut loppuun.</p>
<h4>Jaha, kello on 4:22</h4>
<p>Ehkä pitää muuten mainita, että tässä harjoituksessa jätin tarkoituksella kaikki Interface Builderilla wysiwyg-tyyliin laaditut näkymät kokonaan pois, ja kokeilin näkymän luomista ohjelmallisesti – osittain harjoittelun vuoksi ja osittain, koska IB-elementtien linkitys koodiin aiheuttaa vielä toistaiseksi enemmän hämmennystä kuin helpotusta. Kannattaa kuitenkin ehdottomasti käyttää Interface Builderia, jos tarvitset lähimainkaan Apple-tyylistä vakionavigointia – vakioelementit ovat aika pitkälle tuunattavissa, joten omaakin ilmettä niillä kyllä saa. Tähänkin projektiin varmaan käyttäisin IB-näkymiä esimerkiksi preferences-valikkoon ja planeettanäkymän päälle tuleviin pistelaskureihin tms.; pitää vain ensin opetella se linkitys paremmin.</p>
<p>Tuo NSLog on muuten aika välttämätön komento työstövaiheessa. Xcoden Run-valikosta löytyvä Console kannattaa pitää auki ja NSLogilla lähetellä työstövaihessa tarvittavaa tietoa sinne, jotta pääsee kärryille esim. ohjelmakoodin bugeista.</p>
<p>Korostan siis vielä, että näitä lähdekoodeja ei missään tapauksessa kannata pitää esimerkkitapauksina oikeaoppisesta Cocoa-ohjelmoinnista. Nämä ovat harjoitusvaiheen koodeja ja täynnä tehottomuuksia ja epäloogisuuksia. Otan mielelläni vastaan kaikenlaisia vinkkejä edistyneemmiltä iOS-koodaajilta!</p>
<p>Testatessa on kyllä ilmennyt harmillinen juttu, jota en osannut ihan ennakoida, nimittäin fysiikan lait. Planeetan saaminen toisen kiertoradalle onkin muuten aika pirun tarkkaa hommaa, eikä se oikein onnistu näppituntumalta, kuten olin mielessäni alunperin hahmotellut. Jos näkymän laittaisi zoomailemaan ulospäin tarvittaessa, jotta pystyisi hahmottamaan isomman palan avaruutta kerralla, voisi tämä helpottua, mutta varsinaisen aurinkokunnan kasaaminen edellyttäisi kyllä koodiin jonkinlaista tekoälyä, joka vaivihkaa avustaisi planeettoja toisiaan kiertäville radoille. Se on ehkä tässä vaiheessa turhan monimutkaista, joten tämä harjoitus taitaa nyt  jäädä odottelemaan taitojeni karttumista. Monenlaista muuta on kuitenkin kehitteillä, ei tämä tähän lopu!</p>
<p>Kurkista <a href="http://www.screencast.com/t/cCN1w9cNHLQ" target="_blank">tästä</a> applikaatiota toiminnassa.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aikahyppy.wordpress.com/113/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aikahyppy.wordpress.com/113/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aikahyppy.wordpress.com/113/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aikahyppy.wordpress.com/113/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aikahyppy.wordpress.com/113/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aikahyppy.wordpress.com/113/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aikahyppy.wordpress.com/113/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aikahyppy.wordpress.com/113/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aikahyppy.wordpress.com/113/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aikahyppy.wordpress.com/113/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aikahyppy.wordpress.com/113/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aikahyppy.wordpress.com/113/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aikahyppy.wordpress.com/113/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aikahyppy.wordpress.com/113/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=113&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aikahyppy.wordpress.com/2011/05/21/se-liikkuu-sittenkin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/47e3d0b1f1fb9cdd4d6578b3496e273d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">djkyykkae</media:title>
		</media:content>
	</item>
		<item>
		<title>Baby steps, baby steps</title>
		<link>http://aikahyppy.wordpress.com/2011/05/15/baby-steps-baby-steps/</link>
		<comments>http://aikahyppy.wordpress.com/2011/05/15/baby-steps-baby-steps/#comments</comments>
		<pubDate>Sun, 15 May 2011 09:03:21 +0000</pubDate>
		<dc:creator>Samuli</dc:creator>
				<category><![CDATA[Yleistä pohdintaa]]></category>

		<guid isPermaLink="false">http://aikahyppy.wordpress.com/?p=101</guid>
		<description><![CDATA[Viimeksi raaputeltiin vähän iPhone-arkkitehtuurin pintaa ja saatiinkin siitä ainakin jonkinlainen alkeellinen kuva. On isot Cocoan frameworkit joihin tukeutua, on oliot ja Model-View-Controller -filosofiat. Jottei homma menisi ihan teoretisoinniksi, nyt pitäisi taas päästä tekemään jotain käytännössä. Käytin autoilupeliä esimerkkitapauksena jossain aiemmassa kirjoituksessani, mutta kaahailugenre on harjoitteluvaiheessa  aivan liian vaativa ja kaiken lisäksi melkoisen loppuunkaluttu pelimarkkinoilla. Jotakin [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=101&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div id="attachment_103" class="wp-caption alignright" style="width: 240px"><a href="http://aikahyppy.files.wordpress.com/2011/05/maol-taulukkokirja1.jpg"><img class="size-thumbnail wp-image-103    " title="MAOL-taulukkokirja" src="http://aikahyppy.files.wordpress.com/2011/05/maol-taulukkokirja1.jpg?w=230&#038;h=288" alt="" width="230" height="288" /></a><p class="wp-caption-text">Kuva 6.0. Kuten yleisesti tiedetään, aikamatkustaja ei yleensä saa mukaansa irtainta omaisuutta, joten tämä referenssiteos ei selvinnyt vuoteen 2011 asti. Kirjoittaja joutuu siis tyytymään Googleen.</p></div>
<p>Viimeksi raaputeltiin vähän iPhone-arkkitehtuurin pintaa ja saatiinkin siitä ainakin jonkinlainen alkeellinen kuva. On isot Cocoan frameworkit joihin tukeutua, on oliot ja Model-View-Controller -filosofiat. Jottei homma menisi ihan teoretisoinniksi, nyt pitäisi taas päästä tekemään jotain käytännössä.</p>
<p>Käytin autoilupeliä esimerkkitapauksena jossain aiemmassa kirjoituksessani, mutta kaahailugenre on harjoitteluvaiheessa  aivan liian vaativa ja kaiken lisäksi melkoisen loppuunkaluttu pelimarkkinoilla. Jotakin simppelimpää siis.</p>
<p>Ympyröitä on jo saatu ruutuun, mitäs niistä saisi aikaan? No vaikka – planeettoja. Painovoima on aina muodissa ja sen laskemiseen löytyy kaavat googlaamalla (ensimmäinen ajatukseni oli kaivaa MAOL:n taulukkokirja esiin, kunnes muistin taas että nyt ollaankin 2000-luvulla). Näyttöä koskettamalla voisi luoda planeettoja, jotka sitten vaikuttaisivat toistensa liikeratoihin painovoimalain määräämällä tavalla. Suhteellisen helppo toteutus ja lopputuloksena mahdollisesti jopa ihan viihdyttävä lelusovellus. Hei, et sitten ryövää tätä ideaa ja tienaa sillä miljoonia, senkin lurjus, tai David Fincher tekee sinusta leffan, jonka perusteella kaikki alkavat pitää sinua kusipäänä.</p>
<div id="attachment_105" class="wp-caption alignleft" style="width: 452px"><a href="http://aikahyppy.files.wordpress.com/2011/05/gnomes_plan.png"><img class="size-full wp-image-105" title="Gnomes_plan" src="http://aikahyppy.files.wordpress.com/2011/05/gnomes_plan.png?w=630" alt=""   /></a><p class="wp-caption-text">Kuva 6.1. Kirjoittajan ensimmäisen applikaation ansaintalogiikka graafisena esityksenä.</p></div>
<p>Eli töihin sitten vaan. Tarvitaan ainakin luokka planeetan ominaisuuksien ja toimintojen kokoamiseen. Planeettojen sijainnit ja keskinäiset vetovoimat pitää päivittää säännöllisesti, siihen tarvitaan Timer Eventiä. Uusia planeettoja pitää päästä luomaan näyttöä koskettamalla, sitä varten täytyy ottaa haltuun Touch Eventeihin reagointimetodit. Ja pitäähän ne planeetat myös piirtää ruutuun; aiemman harjoituksen ympyränpiirtorutiinit saavat kelvata siihen toistaiseksi, hieman tuunattuina toki.</p>
<p>Tietysti oikeassa pelissä on myös jonkinlainen intro, highscore-näkymät, preferences-osio ynnämuut, mutta sille kaikelle on aika sitten myöhemmin – ensin pitää saada perustoiminnot kasaan. Motivoin itseni lupaamalla, että jos saan tämän applikaation julkaisukuntoon, voin sijoittaa 100 taalaa Applen Developer Programin vuosimaksuun, joka tarvitaan jotta omia softia voi testata puhelimessa – tai, sitten joskus, julkaista App Storessa!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/aikahyppy.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/aikahyppy.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/aikahyppy.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/aikahyppy.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/aikahyppy.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/aikahyppy.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/aikahyppy.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/aikahyppy.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/aikahyppy.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/aikahyppy.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/aikahyppy.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/aikahyppy.wordpress.com/101/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/aikahyppy.wordpress.com/101/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/aikahyppy.wordpress.com/101/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=aikahyppy.wordpress.com&amp;blog=22286134&amp;post=101&amp;subd=aikahyppy&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://aikahyppy.wordpress.com/2011/05/15/baby-steps-baby-steps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/47e3d0b1f1fb9cdd4d6578b3496e273d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">djkyykkae</media:title>
		</media:content>

		<media:content url="http://aikahyppy.files.wordpress.com/2011/05/maol-taulukkokirja1.jpg?w=119" medium="image">
			<media:title type="html">MAOL-taulukkokirja</media:title>
		</media:content>

		<media:content url="http://aikahyppy.files.wordpress.com/2011/05/gnomes_plan.png" medium="image">
			<media:title type="html">Gnomes_plan</media:title>
		</media:content>
	</item>
	</channel>
</rss>
