<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.antipode.ca/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Antipode</title>
	
	<link>http://www.allenpike.com</link>
	<description>Allen Pike on gidgets and gazmos.</description>
	<lastBuildDate>Wed, 01 Feb 2012 00:26:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.antipode.ca/antipode" /><feedburner:info uri="antipode" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.antipode.ca%2Fantipode" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.antipode.ca%2Fantipode" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.antipode.ca%2Fantipode" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.antipode.ca/antipode" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.antipode.ca%2Fantipode" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.antipode.ca%2Fantipode" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.antipode.ca%2Fantipode" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><item>
		<title>The pain of text formatting on iOS</title>
		<link>http://feeds.antipode.ca/~r/antipode/~3/dq64U04ii9s/</link>
		<comments>http://www.allenpike.com/2012/the-pain-of-text-formatting-on-ios/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 00:26:01 +0000</pubDate>
		<dc:creator>Allen</dc:creator>
				<category><![CDATA[Article]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[WebKit]]></category>

		<guid isPermaLink="false">http://www.allenpike.com/?p=2118</guid>
		<description><![CDATA[Today Buzz Andersen highlighted the biggest hole in Cocoa Touch: there is no simple way to format text. What we really need is a facility that provides access to at least some subset of WebKit HTML rendering capabilities at a level between CoreText and UIWebView—something that doesn’t require developers to essentially re-invent HTML and CSS [...]]]></description>
			<content:encoded><![CDATA[<p>Today Buzz Andersen highlighted the biggest hole in Cocoa Touch: <a href="http://log.scifihifi.com/post/16834335332/a-plea-for-better-ios-text-facilities" >there is no simple way to format text</a>.</p>
<blockquote><p>What we really need is a facility that provides access to at least some subset of WebKit HTML rendering capabilities at a level between CoreText and UIWebView—something that doesn’t require developers to essentially re-invent HTML and CSS but allows them to render at least some level of HTML formatted text to a native view without the overhead and inflexibility of UIWebView—basically, a next generation version of Mac OS X Cocoa’s NSAttributedString</p></blockquote>
<p>My favourite &#8220;why is native iOS development sometimes expensive&#8221; story is the Tale of the Bold Username. In an alpha version of the iPhone app we built for Foodtree, we displayed comments like so:</p>
<blockquote><p>Allen: These are some great-looking blueberries! This year I&#8217;m buying a few pounds and freezing them.</p></blockquote>
<p>We&#8217;d just hired Angelina, who had a background in web development, and her first task was to change the formatting to look like this:</p>
<blockquote><p><b style="font-weight: bold; color: #C75B12;" >Allen</b>&nbsp; These are some great-looking blueberries! This year I&#8217;m buying a few pounds and freezing them.</p></blockquote>
<p>She was surprised that we estimated it would take her two days. In HTML this would take a few seconds &#8211; possibly a few minutes. Sure enough, it took two full days to get the text layout reimplemented in the low-level C APIs, called CoreText<sup>1</sup>.</p>
<p>As soon as we changed to a formatted multi-line label, we had to do a whole pile of work just to lay out the text, specify the character range we wanted to format, wrap the text, actually render, and then get the dimensions of the final output. Things were further complicated by the fact we needed to get the dimensions of the output for every row in the table before it could be displayed, since this determined the height of the rows and therefore the scrolling metrics.</p>
<p>Why not just use a WebView? In most cases we would, but this is was one little element that may appear hundreds of times in a scrolling TableView. The table needs to be able to <a href="/2011/providing-joy-at-60-fps/" >scroll at 60fps</a>, and there&#8217;s no way we can tear down and set up WebView fast enough.</p>
<p>Worse, in order to get the proper scrollbar height at load time, you&#8217;d need to render the whole content in every WebView for the entire table. We could reimplement the entire main view of the app in a WebView, but that would have a whole other set of performance and UI consequences, and be a lot of work. </p>
<p>I think Buzz&#8217; conclusion is apt:</p>
<blockquote><p>I think the absence of such an API on iOS is holding the platform back as a media platform more than almost anything else I can think of.</p></blockquote>
<ol class="footnotes" ><li id="footnote_0_2118"  class="footnote" >Uncharacteristically, we didn&#8217;t bill for the time &#8211; partly because she was learning, and partly because it seemed so ridiculous.</li></ol><div class="feedflare">
<a href="http://feeds.antipode.ca/~ff/antipode?a=dq64U04ii9s:7tFCc-MlgHc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/antipode?i=dq64U04ii9s:7tFCc-MlgHc:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/antipode/~4/dq64U04ii9s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allenpike.com/2012/the-pain-of-text-formatting-on-ios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.allenpike.com/2012/the-pain-of-text-formatting-on-ios/</feedburner:origLink></item>
		<item>
		<title>Design your way out of that paper bag</title>
		<link>http://feeds.antipode.ca/~r/antipode/~3/0is_B28Uqlc/</link>
		<comments>http://www.allenpike.com/2011/design-your-way-out-of-that-paper-bag/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 02:07:08 +0000</pubDate>
		<dc:creator>Allen</dc:creator>
				<category><![CDATA[Article]]></category>
		<category><![CDATA[Prism]]></category>
		<category><![CDATA[Steam Clock]]></category>
		<category><![CDATA[User Interface]]></category>
		<category><![CDATA[Visual Design]]></category>

		<guid isPermaLink="false">http://www.allenpike.com/?p=2071</guid>
		<description><![CDATA[There are a dozen apps that do the same thing as yours1. To stand out, your users must to be delighted by your product &#8211; from icon to settings screen. You get there by designing, aligning, and refining each screen, nook, and edge case. Most programmers act as if their ability to program prevents them [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_2092"  class="wp-caption alignright"  style="width: 101px" ><a href="http://www.antipode.ca/wp-content/uploads/2011/12/prism-add-buttons1.png" ><img align="right"  class="size-medium wp-image-2092"  title="Prism design iteration."  src="http://www.antipode.ca/wp-content/uploads/2011/12/prism-add-buttons1-91x300.png"  alt=""  width="91"  height="300"   style="float: right; padding-bottom: 10px; padding-left: 10px"/></a><p class="wp-caption-text" >Watch me learn design via Prism&#39;s add button iterations.</p></div>
<p>There are a dozen apps that do the same thing as yours<sup>1</sup>. To stand out, your users must to be delighted by your product &#8211; from icon to settings screen. You get there by designing, aligning, and refining each screen, nook, and edge case.</p>
<p>Most programmers act as if their ability to program prevents them from making something look good. This is bullshit. There are hundreds of counterexamples, ranging from <a href="https://twitter.com/atebits" >Loren Brichter</a> to <a href="http://flyosity.com/" >Mike Rundle</a>. You get good at design exactly the same way you get good at programming: you do it badly enough times to become mediocre, then you do it mediocrally until you become good.</p>
<p>Maybe you don&#8217;t enjoy design, which is fine. However, most engineers haven&#8217;t really tried it because they think they&#8217;re incapable. If you&#8217;re really unsure where to start, do a bit of reading about spacing and alignment. Spend some time trying to reproduce a nice-looking button or effect. Pull apart somebody&#8217;s .psd and reverse-engineer it.</p>
<p>Then here&#8217;s what you do: next time you&#8217;re tasked with adding a feature, take a serious shot at how it should look. Do your best to line up that new button with the existing ones. If the existing styles in the app clearly won&#8217;t work, try tweaking one until it&#8217;s close.</p>
<p>Your goal is to add a new feature, then have the designer that usually fixes your &#8220;programmer art&#8221; leave it alone<sup>2</sup>. It may start small &#8211; an error message or edge case, or a new element that just needs to be well aligned and balanced with what&#8217;s already there.</p>
<p>The more design practice you get, the more opportunities it will open. The prototypes you present to superiors will become more impressive. Your personal website will stop looking like it&#8217;s from 1998. The designer time spent on your features will go to polish and &#8220;wow&#8221; instead of just getting things up to par with the rest of the product.</p>
<p>Before you know it<sup>3</sup>, you will have become a unicorn. That&#8217;s right, every startup&#8217;s dream: <a href="https://twitter.com/johnallsopp/status/148906621056196608" >a Desingineer</a>. You&#8217;ll likely continue to focus on programming, but you&#8217;ll have become more powerful than you could possibly imagine.</p>
<p>Or at least, you&#8217;ll make wonderful looking products that people want to use. That&#8217;s a good start.</p>
<ol class="footnotes" ><li id="footnote_0_2071"  class="footnote" >If there aren&#8217;t, you&#8217;re either crazy, or there will be soon.</li><li id="footnote_1_2071"  class="footnote" >Admittedly this was very hard at Apple, but I got pretty good at it. The trick was to find some function or edge case that had yet to be mocked up by Design, and implement it so well that it looked like it had been reviewed.</li><li id="footnote_2_2071"  class="footnote" >Well actually, after thousands of hours of practice, but close enough.</li></ol><div class="feedflare">
<a href="http://feeds.antipode.ca/~ff/antipode?a=0is_B28Uqlc:PSFsURbaGtU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/antipode?i=0is_B28Uqlc:PSFsURbaGtU:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/antipode/~4/0is_B28Uqlc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allenpike.com/2011/design-your-way-out-of-that-paper-bag/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.allenpike.com/2011/design-your-way-out-of-that-paper-bag/</feedburner:origLink></item>
		<item>
		<title>Prism, the image browser</title>
		<link>http://feeds.antipode.ca/~r/antipode/~3/HzHoecH0HPE/</link>
		<comments>http://www.allenpike.com/2011/prism-the-image-browser/#comments</comments>
		<pubDate>Sat, 17 Dec 2011 00:07:16 +0000</pubDate>
		<dc:creator>Allen</dc:creator>
				<category><![CDATA[Article]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[Prism]]></category>
		<category><![CDATA[Steam Clock Software]]></category>

		<guid isPermaLink="false">http://www.allenpike.com/?p=2059</guid>
		<description><![CDATA[Today, Steam Clock Software launches Prism. A year ago, we wondered, &#8220;Why isn&#8217;t there an Instapaper for images?&#8221; Photo galleries like The Big Picture and Reddit&#8217;s &#8220;Earth Porn&#8221; are kind of a pain to browse on the iPad, and nobody who had tackled the problem of image browsing gave you a distraction-free, full-screen experience where [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.steamclocksw.com/prism/" ><img align="right"  class="alignnone size-full wp-image-2060"  title="Prism, the best image browsing app for iPad."  src="http://www.antipode.ca/wp-content/uploads/2011/12/prism-image-browser.png"  alt=""  width="150"  height="150"   style="float: right; padding-bottom: 10px; padding-left: 10px"/></a>Today, Steam Clock Software launches <a href="http://www.steamclocksw.com/prism/" >Prism</a>. A year ago, we wondered, &#8220;Why isn&#8217;t there an Instapaper for images?&#8221; Photo galleries like <a href="http://www.boston.com/bigpicture/" >The Big Picture</a> and <a href="http://www.reddit.com/r/earthporn" >Reddit&#8217;s &#8220;Earth Porn&#8221;</a> are kind of a pain to browse on the iPad, and nobody who had tackled the problem of image browsing gave you a distraction-free, full-screen experience where the images load faster than you flip through them.</p>
<p>The first 10% of our work on Prism was getting full-screen images loading from a few sites. The other 90% was crazy amounts of polish: captions, multi-threaded loading, Recommended Galleries, generating nice thumbnails, storing images for offline use, not storing too many images for offline use, and so on. We had to make a judgement call between being the best at we do (pulling images out of HTML) or instead focusing on supporting every site in the world. Looking at Prism 1.0, I think we made the right call.</p>
<p>Looking forward, there are a lot of sites we&#8217;d like to add support for &#8211; Twitter, Facebook, Google Reader, and Flickr are some big ones, but the sites users request will get support first. If you&#8217;re interested, please <a href="itms://itunes.apple.com/app/prism-the-image-browser/id488236799?mt=8" >give Prism a try</a> and let me know what you think.</p>
<p>Onward!</p>
<div class="feedflare">
<a href="http://feeds.antipode.ca/~ff/antipode?a=HzHoecH0HPE:zZCDm6_Mees:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/antipode?i=HzHoecH0HPE:zZCDm6_Mees:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/antipode/~4/HzHoecH0HPE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allenpike.com/2011/prism-the-image-browser/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.allenpike.com/2011/prism-the-image-browser/</feedburner:origLink></item>
		<item>
		<title>Web technology in native apps</title>
		<link>http://feeds.antipode.ca/~r/antipode/~3/MKtrTLuyq28/</link>
		<comments>http://www.allenpike.com/2011/web-technology-in-native-apps/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 06:15:52 +0000</pubDate>
		<dc:creator>Allen</dc:creator>
				<category><![CDATA[Article]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Mobile Safari]]></category>

		<guid isPermaLink="false">http://www.allenpike.com/?p=2050</guid>
		<description><![CDATA[When discussing mobile apps, we&#8217;re often asked, &#8220;native or HTML5&#8243;? For some products it really makes sense to build a mobile web site, for others a 100% native app is the best approach. What often surprises people is when we recommend some of each. Once you&#8217;ve made the call to distribute using the App Store, [...]]]></description>
			<content:encoded><![CDATA[<p>When discussing mobile apps, we&#8217;re often asked, &#8220;native or HTML5&#8243;? For some products it really makes sense to build a mobile web site, for others a 100% native app is the best approach. What often surprises people is when we recommend some of each. Once you&#8217;ve made the call to distribute using the App Store, you have both technologies at your disposal and should build each part of your app using the best tool.</p>
<p>Buzz Andersen, a longtime Objective-C developer, has a good example in  <a href="http://log.scifihifi.com/post/13084982465/the-facebook-app-fuck-ups-seem-to-be-because" >his post about dogmatic Native vs. Web arguments</a>:</p>
<blockquote><p>To me, one of the textbook examples of something the web is <em>made</em> for but is practically rocket science on iOS is text rendering. While users are accustomed to thinking of iOS apps as exceptionally beautiful and visually sophisticated, UIKit’s text rendering capabilities turn out to be frustratingly primitive, making it quite a challenge for even expert iOS developers to match the advanced page layout and text formatting capabilities of web browsers.</p></blockquote>
<p>The point is that although ignoring the great strengths of native code can lead to an inferior app, ignoring the great strengths of Webkit can also lead to an inferior app. Dogma doesn&#8217;t help build wonderful products &#8211; choosing the right tools does.</p>
<div class="feedflare">
<a href="http://feeds.antipode.ca/~ff/antipode?a=MKtrTLuyq28:nCIsoibaWIs:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/antipode?i=MKtrTLuyq28:nCIsoibaWIs:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/antipode/~4/MKtrTLuyq28" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allenpike.com/2011/web-technology-in-native-apps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.allenpike.com/2011/web-technology-in-native-apps/</feedburner:origLink></item>
		<item>
		<title>Video: Making a JS meetup blow minds</title>
		<link>http://feeds.antipode.ca/~r/antipode/~3/dPJOh_7c4L0/</link>
		<comments>http://www.allenpike.com/2011/video-making-a-js-meetup-blow-minds/#comments</comments>
		<pubDate>Thu, 18 Aug 2011 00:56:01 +0000</pubDate>
		<dc:creator>Allen</dc:creator>
				<category><![CDATA[Article]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JSConf]]></category>
		<category><![CDATA[VanJS]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://www.allenpike.com/?p=2017</guid>
		<description><![CDATA[In May I gave this 15 minute talk at JSConf about putting together a great tech meetup, based on my experience putting on VanJS. JSConf was the largest crowd I&#8217;ve presented to so far (about 200 by my count) but it was worth the pressure for sure. Any feedback on my presentation style would be [...]]]></description>
			<content:encoded><![CDATA[<p>In May I gave <a href="http://blip.tv/jsconf/jsconf2011-allen-pike-5454838" >this 15 minute talk at JSConf</a> about putting together a great tech meetup, based on my experience putting on VanJS.</p>
<p><iframe src="http://blip.tv/play/g_Mngsz4WgI.html"  width="510"  height="320"  frameborder="0"  allowfullscreen="" ></iframe><embed type="application/x-shockwave-flash"  src="http://a.blip.tv/api.swf#g_Mngsz4WgI"  style="display:none" ></embed></p>
<p>JSConf was the largest crowd I&#8217;ve presented to so far (about 200 by my count) but it was worth the pressure for sure. Any feedback on my presentation style would be really helpful. Maybe next year I&#8217;ll give a talk entitled &#8216;Eliminating all the &#8220;uh&#8221;s and head bobbing you see in videos of yourself giving talks&#8217;.</p>
<div class="feedflare">
<a href="http://feeds.antipode.ca/~ff/antipode?a=dPJOh_7c4L0:ItC3lWzSDN4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/antipode?i=dPJOh_7c4L0:ItC3lWzSDN4:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/antipode/~4/dPJOh_7c4L0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allenpike.com/2011/video-making-a-js-meetup-blow-minds/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.allenpike.com/2011/video-making-a-js-meetup-blow-minds/</feedburner:origLink></item>
		<item>
		<title>Providing joy at 60 fps</title>
		<link>http://feeds.antipode.ca/~r/antipode/~3/dVd5obqHbDA/</link>
		<comments>http://www.allenpike.com/2011/providing-joy-at-60-fps/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 20:52:51 +0000</pubDate>
		<dc:creator>Allen</dc:creator>
				<category><![CDATA[Article]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Usability]]></category>

		<guid isPermaLink="false">http://www.allenpike.com/?p=1972</guid>
		<description><![CDATA[At Steam Clock we go to a lot of effort to make sure we ship apps with a high level of polish. Making your app solve the user&#8217;s problems well is the first 90% of building a great app. Polishing the hell out of that experience so it&#8217;s a joy to use is the final [...]]]></description>
			<content:encoded><![CDATA[<p><img align="right"  class="alignnone size-full wp-image-1985"  title="A sweet progress pie."  src="http://www.antipode.ca/wp-content/uploads/2011/07/progress.png"  alt=""  width="150"  height="150"   style="float: right; padding-bottom: 10px; padding-left: 10px"/>At Steam Clock we go to a lot of effort to make sure we ship apps with a high level of polish. Making your app solve the user&#8217;s problems well is the first 90% of building a great app. Polishing the hell out of that experience so it&#8217;s a joy to use is the final 90% of the work.</p>
<p>A huge component of that polish is responsiveness: giving the user an instant reaction to everything they do. Making your app faster and more efficient is good, but there&#8217;s more to responsiveness than speed.</p>
<p><strong>60 frames</strong></p>
<p>Your goal is 60 frames per second: the natural frame rate of the device, faster than the user can perceive. During animations and transitions, 60fps means a smooth transition with no stuttering. Although this is important for all animations, it is crucial in animations that are responding to a user&#8217;s touch. Even a very subtle delay between touch and response will give the feeling that the app is sluggish. This is a big reason that JavaScript &#8220;fake scrolling&#8221; gets such a negative response from users.</p>
<p>When responding to user feedback, 60fps means no stalling. If your app stalls for a frame on any supported device, it&#8217;s a bug. As long as the delay is small it might not be a high priority bug, but it is still an opportunity. Profile your app to get an idea of where your frame rate drops. It&#8217;s often worth keeping an older device to do this testing on, since if you can even get the older device up to 30fps, you&#8217;ll be in good shape on newer devices.</p>
<p>Actually getting a faster frame rate often involves either avoiding waste like drawing offscreen views, unnecessary opacity, or inefficient algorithms. Often though, getting a smooth frame rate involves moving work off of the main UI thread.</p>
<p><strong>Threading</strong></p>
<p>By default, any code you write runs on the main UI thread. If you do anything on the main thread that takes more than 16 milliseconds, you&#8217;ve dropped a frame and there will be a perceptible stutter. 16 milliseconds is a really long time, especially on newer hardware, so this isn&#8217;t as dire as it sounds.</p>
<p>Your biggest thread-blocking monsters are I/O operations. If you read or write a file or do any network operation, you need to do it in a background thread. On iOS this is a lot simpler than it is in plain C. The <code>NSURLConnection</code> class works asynchronously by default, plus Grand Central Dispatch and Blocks make most things straightforward to make asynchronous.</p>
<p>Although moving file, network, and data crunching to separate threads is important for any app, it&#8217;s doubly vital on mobile. Your phone doesn&#8217;t have a wait cursor, and its network quality can be incredibly bad. If you block for long enough, the OS will kill your app.</p>
<p><strong><img align="right"  class="alignnone size-full wp-image-1995"  title="Perception in UI."  src="http://www.antipode.ca/wp-content/uploads/2011/07/perception2.png"  alt=""  width="330"  height="300"   style="float: right; padding-bottom: 10px; padding-left: 10px"/>Spinning</strong></p>
<p>Now that your work is asynchronous, you need to let the user know something is happening. Provide a progress indicator if possible and worthwhile. Otherwise, get spinning.</p>
<p>Activity indicators (whether spinning, pulsing, or jiving) let your user know that you&#8217;re on the job and should go up after any perceptible delay. Without feedback, your app could have crashed, or it could have finished but without the results the user expected. You never want people wondering what your app is doing.</p>
<p>A special kind of activity indicator is placeholder content. Users can sometimes navigate through your app faster than you can render content, especially if you need to fetch something from the internet. For things like avatars and other peripheral information, a tasteful placeholder is definitely preferable to a distracting spinner.</p>
<p><strong>Backend responses</strong></p>
<p>So you have spinners now, but want to show them as briefly as possible. Although ideally you respond within 16ms, users are used to waiting for internet content to be delivered, especially when they know their wireless connection is weak. Even on a good wifi connection, your app&#8217;s request will have perceptible latency to get to the server and come back with a simple response.</p>
<p>Unfortunately, any time your backend servers take in responding is in addition to that latency. Every moment it takes for you to get a response back to the user is more frustration and impatience. Your goal should be to get content back to the user in 100ms<sup>1</sup>. After one second, users lose their feeling of task flow. On the web, users are intolerant of waiting for servers to respond. Within a mobile app, they are even less tolerant &#8211; if you can&#8217;t provide a faster experience than a normal web site, you might as well just have a web site.</p>
<p><strong>Launch time</strong></p>
<p>While launching an entire app in one frame is not likely, launching before the user feels a wait is possible, and launching in a second is often straightforward. Launch time affects the most important use case for your app: first use. If you can&#8217;t get the app loaded and fully functional in a second, you should at least get it awake and giving activity indication in that time.</p>
<p>Doing some simple profiling of app launch will usually reveal unnecessary work you&#8217;re doing at launch. Whether it&#8217;s building views that aren&#8217;t being displayed yet, loading content that isn&#8217;t necessary, or blocking on some operation that could be threaded, you can often get some easy wins without a lot of work.</p>
<p><strong>Tap highlights</strong></p>
<p>Every tap should have consequences when you lift your finger. First, though, comes an indication of a successful tap when you touch down. This provides a visual response for actions that cause a few frames to drop but last less than 100ms. Unlike with a keyboard or mouse, the user has no tactile feedback that they tapped successfully. They have no way of knowing they tapped on the right thing until it highlights.</p>
<p><strong>Result: Joy</strong></p>
<p>Congratulations! You now have a responsive app that is a joy to use. Of course, it also needs to be functional, usable, beautiful, and useful. But that is for another day.</p>
<ol class="footnotes" ><li id="footnote_0_1972"  class="footnote" >IBM did this research decades ago, but <a href="http://www.useit.com/papers/responsetime.html" >Jakob Nielsen has various explorations of it</a> online.</li></ol><div class="feedflare">
<a href="http://feeds.antipode.ca/~ff/antipode?a=dVd5obqHbDA:GsjruEaTJos:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/antipode?i=dVd5obqHbDA:GsjruEaTJos:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/antipode/~4/dVd5obqHbDA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allenpike.com/2011/providing-joy-at-60-fps/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.allenpike.com/2011/providing-joy-at-60-fps/</feedburner:origLink></item>
		<item>
		<title>Micro-subscriptions are here</title>
		<link>http://feeds.antipode.ca/~r/antipode/~3/jfZd9vJvwvA/</link>
		<comments>http://www.allenpike.com/2011/micro-subscriptions-are-here/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 23:49:11 +0000</pubDate>
		<dc:creator>Allen</dc:creator>
				<category><![CDATA[Article]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Startups]]></category>

		<guid isPermaLink="false">http://www.antipode.ca/?p=1952</guid>
		<description><![CDATA[For years, subscription software has been kicking ass. 37signals, Github, and many of my favourite companies support their products this way. It&#8217;s the best possible economics for building an app &#8211; your revenue is recurring and predictable. If you make something great, people will keep paying. If you don&#8217;t, they&#8217;ll stop. However, consumers have never [...]]]></description>
			<content:encoded><![CDATA[<p><img align="right"  src="http://www.antipode.ca/wp-content/uploads/2011/02/micro.png"  alt=""  title="$0.01 is probably too little for a subscription, but still."  width="150"  height="150"  class="alignnone size-full wp-image-1957"   style="float: right; padding-bottom: 10px; padding-left: 10px"/>For years, subscription software has been kicking ass. 37signals, Github, and many of my favourite companies support their products this way. It&#8217;s the best possible economics for building an app &#8211; your revenue is recurring and predictable. If you make something great, people will keep paying. If you don&#8217;t, they&#8217;ll stop.</p>
<p>However, consumers have never bought in. Businesses do, prosumers do, enthusiasts do, but normal people don&#8217;t. For a decade people have tried to make &#8220;micro-subscriptions&#8221; a reality &#8211; a way for normal people to pay a small amount to get a content or service. They&#8217;ve all failed utterly.</p>
<p>There is no way people will put in their credit card info into various sites and apps to pay a $1/mo fee. The cognitive pain of creating accounts, entering and maintaining payment info, and being billed for it makes the whole thing a complete non-starter to most consumers. And so, consumer apps continue to be offered as advertising-supported affairs that need giant scale to be profitable, or, more recently, pay-once apps.</p>
<p><a href="http://arstechnica.com/apple/news/2011/02/apples-in-app-subscriptions-if-we-bring-in-subscribers-we-deserve-a-cut.ars" >iOS subscriptions</a> finally change this. Although Apple takes 30%<sup>1</sup>, the one-click nature of the process and safety net of the App Store means for the mass market you&#8217;ll get way more than a 30% boost in sales.</p>
<p>The same app offering the same value to the mass market is going to get <strong>50x as many customers</strong> through one-click subscribing at $1/mo than it would get through sending them to enter their credit card information on some website. I may be wrong &#8211; it may be more like 500x.</p>
<p>Entire products that were infeasible before are now feasible. Micro-subscriptions are here. Enough writing &#8211; back to writing an app that kicks ass with them.</p>
<ol class="footnotes" ><li id="footnote_0_1952"  class="footnote" >I am aware Apple&#8217;s cut makes the &#8220;you must offer in-app if you have subscriptions&#8221; rule a slap in the face for some business models. Apple can&#8217;t really charge much less than 30% because they sell iTunes cards at retail, plus it would provide a way to route around their cut for app sales. Still, forcing everything through them sucks.</li></ol><div class="feedflare">
<a href="http://feeds.antipode.ca/~ff/antipode?a=jfZd9vJvwvA:5lAv2FmahKM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/antipode?i=jfZd9vJvwvA:5lAv2FmahKM:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/antipode/~4/jfZd9vJvwvA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allenpike.com/2011/micro-subscriptions-are-here/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.allenpike.com/2011/micro-subscriptions-are-here/</feedburner:origLink></item>
		<item>
		<title>The Chrome Web Store: get paid to make things</title>
		<link>http://feeds.antipode.ca/~r/antipode/~3/eputm8th61Y/</link>
		<comments>http://www.allenpike.com/2010/the-chrome-web-store-get-paid-to-make-things/#comments</comments>
		<pubDate>Wed, 08 Dec 2010 00:12:22 +0000</pubDate>
		<dc:creator>Allen</dc:creator>
				<category><![CDATA[Article]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Web Apps]]></category>

		<guid isPermaLink="false">http://www.antipode.ca/?p=1693</guid>
		<description><![CDATA[The Chrome Web Store launched today. In a nutshell, it&#8217;s a marketplace for installable web apps. Chrome&#8217;s New Tab page now has a Web Store link, along with app icons for all the apps you&#8217;ve installed. There&#8217;s nothing technically interesting going on here &#8211; the &#8220;apps&#8221; are just thin wrappers around links to websites. The [...]]]></description>
			<content:encoded><![CDATA[<p><img align="right"  class="alignnone size-full wp-image-1920"  title="How the Web Store appears in Chrome."  src="http://www.antipode.ca/wp-content/uploads/2010/12/chromestore.png"  alt=""  width="150"  height="150"   style="float: right; padding-bottom: 10px; padding-left: 10px"/>The Chrome Web Store launched today. In a nutshell, it&#8217;s a marketplace for installable web apps. Chrome&#8217;s New Tab page now has a Web Store link, along with app icons for all the apps you&#8217;ve installed. There&#8217;s nothing technically interesting going on here &#8211; the &#8220;apps&#8221; are just thin wrappers around links to websites. The Chrome App Store is really only one thing: a way for consumers to pay you for your web app. Which, believe it or not, is a huge deal.</p>
<p>Now, it&#8217;s true there are some ways to make money from web apps already. There are actually three<sup>1</sup>:</p>
<ol>
<li>Sell advertising on your multimillion-user site. Often this requires VC to ramp up to a huge user base.</li>
<li>Sell your app as a service to companies that subscribe. This can be quite profitable but consumers aren&#8217;t willing to do this.</li>
<li>Get paid directly to build custom web apps.</li>
</ol>
<p>The Chrome App Store is irrelevant for the above categories of software since they&#8217;re profitably humming away. However, there are a lot of potential web apps that don&#8217;t fit into the above categories. Specifically, consumer-oriented apps that aren&#8217;t appropriate for the &#8220;scale huge, sell ads&#8221; model. Some examples:</p>
<ul>
<li>Games</li>
<li>Specialty consumer software (like <a href="http://steamclocksw.com/weddingdj/" >WeddingDJ</a>)</li>
<li>Personal productivity and finance software</li>
<li>Magazines and newspapers</li>
<li>Most stuff on the iOS App Store</li>
</ul>
<p>Most web developers in the above markets attempted to do the obvious: charge customers to use their sites. However, having to put in your credit card info or jump through a PayPal hoop to pay for something online is a pain in the ass. It can&#8217;t be understated: a credit card entry form is a brick wall to most consumers. The vast majority of them would never consider putting their credit card info in to pay for a web site, no matter how good it is.</p>
<p>Those same people don&#8217;t think twice about paying for apps, especially as a one-time fee. Hence, the great success of the iOS App Store. The App Store, and iTunes before it, and Amazon before it, showed that people will pay to buy things online if they can just click. Developers flocked to the iPhone because you can make money there, myself included.</p>
<p>A lot of people would love to make web apps for consumers, but their ideas aren&#8217;t viable under the advertising model. It&#8217;s insanely hard to bootstrap a consumer-facing web startup because of this. As a consequence, startups that would have been building web apps five years ago are now building iOS apps. The web is a great platform, but if consumers aren&#8217;t paying you, then you&#8217;re limited in what you can build.</p>
<p>So now we wait and see if consumers embrace the Chrome Web Store. If they do, expect to see a whole new wave of web apps.</p>
<ol class="footnotes" ><li id="footnote_0_1693"  class="footnote" >Arguably, the fourth way to make money on a web app is to wrap it in PhoneGap and stick it on the iOS app store. While tangential, the fact this is a popular route reinforces my argument.</li></ol><div class="feedflare">
<a href="http://feeds.antipode.ca/~ff/antipode?a=eputm8th61Y:QihJuZbk0M0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/antipode?i=eputm8th61Y:QihJuZbk0M0:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/antipode/~4/eputm8th61Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allenpike.com/2010/the-chrome-web-store-get-paid-to-make-things/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.allenpike.com/2010/the-chrome-web-store-get-paid-to-make-things/</feedburner:origLink></item>
		<item>
		<title>HOWTO start a technical meetup</title>
		<link>http://feeds.antipode.ca/~r/antipode/~3/jQqRzaXvsoA/</link>
		<comments>http://www.allenpike.com/2010/howto-start-a-technical-meetup/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 22:05:11 +0000</pubDate>
		<dc:creator>Allen</dc:creator>
				<category><![CDATA[Article]]></category>
		<category><![CDATA[Experience]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Vancouver]]></category>
		<category><![CDATA[VanJS]]></category>

		<guid isPermaLink="false">http://www.antipode.ca/?p=1859</guid>
		<description><![CDATA[One year ago I found myself wishing there was a JavaScript meetup group here in Vancouver. Today I&#8217;m running VanJS, one of the largest JavaScript meetups in the world1, featuring high-profile speakers like John Resig. I&#8217;ve made some great contacts, helped spread JavaScript knowhow in my city, and seen a lot of great talks I [...]]]></description>
			<content:encoded><![CDATA[<p><img align="right"  class="alignnone size-full wp-image-1908"  title="VanJS' vital stats."  src="http://www.antipode.ca/wp-content/uploads/2010/11/vanjs6.jpg"  alt=""  width="150"  height="150"   style="float: right; padding-bottom: 10px; padding-left: 10px"/>One year ago I found myself wishing there was a JavaScript meetup group here in Vancouver. Today I&#8217;m running VanJS, one of the largest JavaScript meetups in the world<sup>1</sup>, featuring high-profile speakers like John Resig. I&#8217;ve made some great contacts, helped spread JavaScript knowhow in my city, and seen a lot of great talks I wouldn&#8217;t have otherwise seen. And now, you should do the same thing.</p>
<p>Get started by recognizing a vacuum. If you wish there was a meetup in your city for a given technology, there&#8217;s probably demand. It&#8217;s easier to get momentum behind something that&#8217;s hot like JavaScript, but as long as there&#8217;s interest, you can pull it off. Once you&#8217;ve picked a topic, gauge interest on your favourite social medium. If you can get 5 or 10 people on board to attend, you&#8217;re ready to apply the following recipe.</p>
<h3><strong>What (The Format)</strong></h3>
<p>Two speakers for 45 minutes each. People just can&#8217;t learn for longer than 45 minutes. If your talks are under an hour, they&#8217;re digestible, don&#8217;t leave people exhausted, but are long enough that you can get into a satisfyingly technical topic. Even shorter is fine.</p>
<p>Having two speakers will double your potential audience, and you&#8217;ll challenge people who might think they only care about one topic. You can&#8217;t really vet the talks in advance, but one rough talk paired with one strong one will still make for an enjoyable evening.</p>
<p>To finish up each night, lead your crowd out for a drink. This turns a group of lecture attendees into a community. You&#8217;ll find out what people want to see at the next meetup, meet future speakers, and get to hang out with the perfect crowd: one you created around your favourite technology. Attending the talks is a filter that makes the beer conversation simply awesome.</p>
<h3><strong><img align="right"  class="alignnone size-full wp-image-1904"  title="It turns out you can fill a 100-person lecture hall on a Sunday if the creator of JQuery comes to town."  src="http://www.antipode.ca/wp-content/uploads/2010/11/vanjs4.jpg"  alt=""  width="150"  height="150"   style="float: right; padding-bottom: 10px; padding-left: 10px"/>When (The Schedule)</strong></h3>
<p>A weeknight every couple months is a good pace. You might get pushback on weeknights, but it turns out that a lot of the fun and interesting people are busy on Friday and Saturday nights. Speakers probably want to be home with their family on weekends, and meeting space and afterparty space is easier to find on weeknights.</p>
<p>If you have a really top-notch speaker who will only be in town at a specific time, schedule your event then. Still, every two months is a good frequency to make sure you don&#8217;t run out of good speakers or topics, encourage people to come out when it does happen, and keep yourself from burning out.</p>
<h3>Who (The Speakers)</h3>
<p>If possible, set the tone by being speaker #1. Then recruit the friends and the contacts you have in the field to come talk. Modest folks will claim they aren&#8217;t qualified, but most programmers are experts about certain topics without even realizing it.</p>
<p>Once the meetups are attracting people you don&#8217;t know, chat them up. Ask if they&#8217;d like to give a talk, or know anybody who would. When you go to conferences, seek out the people you&#8217;d love to see speak and pitch them &#8211; ask if they&#8217;ll be in your city anytime soon.<sup>2</sup> Have others do the same. Once speakers can see you&#8217;re a regular meetup that seems to be organized well, they&#8217;ll be willing to give a talk. In general, just find people who are doing great work and reach out to them.</p>
<p><img align="right"  title="Some smart dudes learning JavaScript."  src="http://www.antipode.ca/wp-content/uploads/2010/11/vanjs2.jpg"  alt=""  width="150"  height="150"   style="float: right; padding-bottom: 10px; padding-left: 10px"/>When looking for speakers, look for advanced topics and specific talks. You&#8217;re better off blowing people&#8217;s minds than boring them. Going for advanced content will challenge people to learn, keep the list of new topics long, and excite the type of people you want. Focused talks also work as a nice filter for &#8220;the scene&#8221;<sup>3</sup> taking over your event.</p>
<h3><strong>Where (The Space)</strong></h3>
<p>Most cities have coworking spaces for startups and small businesses that will happily host a tech meetup. The best spaces are walking distance to both the local tech startups and a good beer place. Once you grow beyond coworking spaces, seek out companies locally that are hiring programmers who use your technology.</p>
<p>These companies will be happy to sponsor space for your events. A couple key contacts here can be the key to getting speakers, space, and good people to go for beer with. For example, about half of VanJS&#8217; speakers come directly or indirectly through the awesome folks at <a href="http://www.joyent.com/" >Joyent</a> and <a href="http://www.nitobi.com" >Nitobi</a>.</p>
<h3><strong>Why (The Reward)</strong></h3>
<p>Building a successful tech meetup connected me with lots of awesome people and helped me launch <a href="http://www.steamclocksw.com/" >Steam Clock</a>. More importantly, it gave me the meetup I&#8217;ve always wanted. I get to book the talks I want to see, and once the projector is set up and everything&#8217;s under control, I can sit back and learn something awesome. All in all, it&#8217;s definitely worth the hard work.</p>
<ol class="footnotes" ><li id="footnote_0_1859"  class="footnote" >We&#8217;re #6 on Meetup by members for JavaScript-specific groups. If you look at recent attendance, we&#8217;re the largest outside of NYC and the Bay Area.</li><li id="footnote_1_1859"  class="footnote" >This is how I got John Resig to VanJS: I chatted with him at a conference and asked if he&#8217;d be in Vancouver anytime soon. Nothing magical to it, he&#8217;s just a cool guy.</li><li id="footnote_2_1859"  class="footnote" >What I mean by &#8220;the scene&#8221; is people who identify as part of the tech community, but don&#8217;t actually care much about your meetup&#8217;s topic. Bless their hearts, but before you know it you can have a Liveblogged Social Media Tweetup instead of a technology meetup. If that happens, the people that get shit done will stop coming to the events and go back to getting shit done.</li></ol><div class="feedflare">
<a href="http://feeds.antipode.ca/~ff/antipode?a=jQqRzaXvsoA:9E-q6dbYpj0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/antipode?i=jQqRzaXvsoA:9E-q6dbYpj0:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/antipode/~4/jQqRzaXvsoA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allenpike.com/2010/howto-start-a-technical-meetup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.allenpike.com/2010/howto-start-a-technical-meetup/</feedburner:origLink></item>
		<item>
		<title>Simple lessons about the App Store</title>
		<link>http://feeds.antipode.ca/~r/antipode/~3/XKkTX-X8bD8/</link>
		<comments>http://www.allenpike.com/2010/simple-lessons-about-the-app-store/#comments</comments>
		<pubDate>Tue, 21 Sep 2010 04:15:03 +0000</pubDate>
		<dc:creator>Allen</dc:creator>
				<category><![CDATA[Article]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Startups]]></category>
		<category><![CDATA[WeddingDJ]]></category>

		<guid isPermaLink="false">http://www.antipode.ca/?p=1826</guid>
		<description><![CDATA[Apple recently posted a detailed document of the App Store guidelines for the approval process. We complied with these, as well as the HIG, and WeddingDJ was approved on the first try. It&#8217;s now two weeks later, and I&#8217;ve learned a lot about the post-approval life on the App Store, so here goes. If you use the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.steamclocksw.com/weddingdj/" ><img align="right"  class="alignnone size-full wp-image-1830"  title="Doesn't that button just look irresistible?"  src="http://www.antipode.ca/wp-content/uploads/2010/09/appstore1.jpg"  alt=""  width="150"  height="150"   style="float: right; padding-bottom: 10px; padding-left: 10px"/></a>Apple recently posted a detailed <a href="http://developer.apple.com/appstore/guidelines.html" >document of the App Store guidelines</a> for the approval process. We complied with these, as well as the <a href="http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/MobileHIG/" >HIG</a>, and <a href="http://www.steamclocksw.com/weddingdj/" >WeddingDJ</a> was approved on the first try. It&#8217;s now two weeks later, and I&#8217;ve learned a lot about the post-approval life on the App Store, so here goes.</p>
<ol>
<li>If you use the famed <a href="http://blog.cocoia.com/2010/iphone-4-icon-psd-file/" >Cocoia PSD</a> for your icon, your icon can get back fringing on the App Store and on iOS 4. The best way to do an app icon is to submit it as a square and let Apple&#8217;s software apply the rounded corners.</li>
<li>Getting reviews can be hard (if your app doesn&#8217;t crash or annoy people). Giving out promo codes doesn&#8217;t work (code redeemers can&#8217;t review the app) and your beta testers have to buy the app to review it.</li>
<li>Submit all the forms to Apple as soon as you can. There are at least four, and they happen at the speed of mail<sup>1</sup>.</li>
<li>Use <a href="http://www.ideaswarm.com/products/appviz/" >AppViz</a> instead of the Sales and Trends portion of iTunes Connect.</li>
<li>If you have an update that&#8217;s been waiting to be reviewed, you can&#8217;t upload a new binary and keep your spot in the queue. And I thought I was so clever.</li>
<li>If you don&#8217;t complete all steps of the registration of an app name, it can get stuck in limbo and be unusable. This is why our app is &#8220;My&#8221; WeddingDJ on the app store for now. It looks like Apple is <a href="http://www.cultofmac.com/apple-cracks-down-on-app-store-squatters/59015" >trying to improve this somewhat</a>.</li>
<li>Pay per click advertising is hard to do profitably. Even for a $5 app, it&#8217;s easy to pay more for clicks than you get in completed purchases. Since you can&#8217;t track a click through to a purchase, and your sales reports are daily, it&#8217;s hard to fine tune your campaigns.</li>
<li>If you do run an ad campaign, try targeting a specific country. If all your Facebook ads are in Australia and you got zero sales in Australia, then you know it&#8217;s not working.</li>
<li>It only takes $5 of sales to be the #12 highest grossing music app in Poland.</li>
</ol>
<p>We&#8217;ve learned a lot more about the other facets of iOS development, so stay tuned for more.</p>
<ol class="footnotes" ><li id="footnote_0_1826"  class="footnote" >There&#8217;s a general Paid Applications contract that everybody needs. If you&#8217;re Canadian, you need to fill out an HST form before you can sell your app. If you want to use Apple images on your website, there&#8217;s a form for that. If you want the Japanese government to not withhold 20% of your income, there&#8217;s a form for that.</li></ol><div class="feedflare">
<a href="http://feeds.antipode.ca/~ff/antipode?a=XKkTX-X8bD8:vrKb7zkYAeo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/antipode?i=XKkTX-X8bD8:vrKb7zkYAeo:D7DqB2pKExk" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/antipode/~4/XKkTX-X8bD8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.allenpike.com/2010/simple-lessons-about-the-app-store/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.allenpike.com/2010/simple-lessons-about-the-app-store/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.682 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-01-31 16:26:07 -->

