<?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/"
	>

<channel>
	<title>Paul Hart</title>
	<atom:link href="http://paulhart.ca/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://paulhart.ca</link>
	<description>The business of coding for pleasure.</description>
	<lastBuildDate>Mon, 12 Apr 2010 02:18:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Are you making a sale or fostering a relationship?</title>
		<link>http://paulhart.ca/index.php/2010/04/11/are-you-making-a-sale-or-fostering-a-relationship/</link>
		<comments>http://paulhart.ca/index.php/2010/04/11/are-you-making-a-sale-or-fostering-a-relationship/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 02:18:03 +0000</pubDate>
		<dc:creator>Paul Hart</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://paulhart.ca/?p=35</guid>
		<description><![CDATA[The catalyst for this post is an email I received a couple of days ago in relation to my &#8220;day&#8221; job.
We have a client based in the northern U.S. who own and operate some electricity generation plants. We picked them up as a client almost by accident; we attended a conference with assumptions that were [...]]]></description>
			<content:encoded><![CDATA[<p>The catalyst for this post is an email I received a couple of days ago in relation to my &#8220;day&#8221; job.</p>
<p>We have a client based in the northern U.S. who own and operate some electricity generation plants. We picked them up as a client almost by accident; we attended a conference with assumptions that were way off base, but we walked away with a (then prospective) client as a result. We&#8217;ve now been working together for a couple of years, and while they aren&#8217;t a huge revenue source for us, we&#8217;ve built a great rapport.</p>
<p>Last week our client contact sent an email to confirm that our most recent invoice was being processed. This was followed by what could best be described as a love letter, extolling how our two cultures were a great fit and that we&#8217;d be their first stop for any future custom software development.</p>
<p>My first reaction to the note was &#8220;well of course we&#8217;ve been focused on your needs, why wouldn&#8217;t we work that way?&#8221; Having given it some thought, it seems clear that there are two business models in play here. Our objective has been to develop relationships with our clients. We get to know the players, learn about their business and needs, and come up with solutions designed to target their particular environment. We don&#8217;t claim to be experts at everything, but we&#8217;re very good at what we do and we have some accrued technical knowledge that we can apply to a business problem to better serve our clients.</p>
<p>Right now we&#8217;re working for our client on a project with another technology partner, and their focus is different. They are selling a prepackaged solution to our client and applying some customizations to it (we&#8217;re integrating various data feeds into their system). The other vendor may not see the same future with our client as we do, as their business revolves around their existent product &#8211; once it&#8217;s installed and customized, they&#8217;re done and their major association with the purchaser is over.</p>
<p>Neither model is &#8220;right&#8221; in the sense that one is superior to the other. Both work for the business models they support. However, I prefer creating a situation where my clients want to do business with me again in the future, and sometimes that&#8217;s lost in the short-term thinking that can be associated with a sales-driven mindset.</p>
]]></content:encoded>
			<wfw:commentRss>http://paulhart.ca/index.php/2010/04/11/are-you-making-a-sale-or-fostering-a-relationship/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tracking App Usage With Pinch Metrics</title>
		<link>http://paulhart.ca/index.php/2009/11/23/tracking-app-usage-with-pinch-metrics/</link>
		<comments>http://paulhart.ca/index.php/2009/11/23/tracking-app-usage-with-pinch-metrics/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 03:50:30 +0000</pubDate>
		<dc:creator>Paul Hart</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://paulhart.ca/?p=22</guid>
		<description><![CDATA[Apple provides details of how many downloads your app receives, but gives no insight into how your users are interacting with your app. Integrating a tool like Pinch Metrics will help provide that understanding.]]></description>
			<content:encoded><![CDATA[<p>While it&#8217;s nice to know how many people have acquired your app, whether through <a href="http://itunesconnect.apple.com/">iTunes Connect</a> or with a third-party application like <a href="http://www.ideaswarm.com/products/appviz/">AppViz</a>, neither of those will tell you about how your app is being used. For that kind of information you&#8217;ll need a metrics library that sits inside your application and measures usage patterns. Fortunately, <a href="http://pinchmedia.com">Pinch Media</a> offers a great solution called <a href="http://pinchmedia.com/#faq">Pinch Metrics</a>. Here&#8217;s a quick guide on setting it up for your app.</p>
<p style="text-align: center;"><strong>Jump Into The Pool</strong></p>
<p>As with so many services online, you can&#8217;t play until you&#8217;ve registered. Cleverly, the folks at Pinch Media recognize that the entire point of a developer signing up with them is to put the Pinch Metrics library into their app, so the registration process includes a step to add an initial application. After this, and once you&#8217;ve confirmed your email address, you&#8217;ll be provided with a unique key to identify your application, as well as a link to download the metrics library.</p>
<p style="text-align: center; "><strong>Project Configuration</strong></p>
<p>Now that we&#8217;ve got the basics available, it&#8217;s time to build them into the project. When you crack open the zip file that contains the metrics library (at least as of version 69), you&#8217;ll find a couple of header files and a library &#8216;.a&#8217; file. If you&#8217;re using Facebook Connect, you&#8217;ll want to use the Beacon+FBConnect.h file; otherwise, or if the last few words made no sense to you, use the Beacon.h file.</p>
<p>Drag the header file from the finder into the Classes folder of your project in Xcode, and check the &#8216;copy items&#8217; box before clicking &#8216;Add&#8217;. Do the same process with with the libPMAnalytics file, but copy that to the Frameworks folder.</p>
<p>Next you&#8217;ll need to add a few more frameworks that the Pinch Metrics library depends on. These are CoreLocation, SystemConfiguration, and libsqlite3.a. You should be able to find these by control-clicking on the Frameworks folder, selecting Add&#8230; Existing Frameworks&#8230;, and then highlighting the required items from the list.</p>
<p style="text-align: center; "><strong>Initial Code Updates</strong></p>
<p>The foundations are now in place for you to track user habits, and your code needs to build on them. The first thing to do is to import your selected header file into your application delegate&#8217;s header (something like &#8216;blahblahAppDelegate.h).</p>
<p>To start gathering metrics, you need to call the Beacon object&#8217;s initAndStartBeaconWithApplicationCode class method. This call should be made in your applicationDidFinishLaunching method. You can pass parameters to configure whether or not to collect the user&#8217;s location, and whether or not to send metrics over a WiFi connection only.</p>
<p>While you don&#8217;t have to stop the Beacon cleanly, it will consider closures of the application without a clean shutdown as crashes. To close the Beacon, call the endBeacon instance method. You&#8217;ve now done enough to start collecting useful data about the number of times your users run your app, where they are (either based on physical location or by IP address), and how long they had your app open.</p>
<p style="text-align: center;"><strong>Getting Granular</strong></p>
<p>While it&#8217;s nice to know that people used your app, it&#8217;s better to know what they were doing with it. You can add as many &#8217;sub-beacons&#8217; to your app as you like. No configuration is required at Pinch Metrics to create more sub-beacons, you can just create them in your code as needed. Each sub-beacon requires a unique name of 32 characters or less. A sub-beacon is created by calling the startSubBeaconWithName instance method.</p>
<p>You can specify whether or not you want your sub-beacon to be timed. In some circumstances you want to know how long a user accessed a particular activity, such as playing a game. In other cases, you&#8217;re simply interested to know whether or not something was accessed at all, perhaps an in-app purchase screen (or better yet, a purchase confirmation screen). If you create a timed sub-beacon, you&#8217;re responsible for stopping the timer by calling the endSubBeaconWithName instance method. Any sub-beacons you forget to stop will automatically be stopped when the application exits.</p>
<p style="text-align: center;"><strong>Knowing Is Half The Battle</strong></p>
<p>With the addition of a tool like Pinch Metrics, you&#8217;ll get a better idea of how your users are interacting with your application. This kind of knowledge can help inform your plans for further development.</p>
]]></content:encoded>
			<wfw:commentRss>http://paulhart.ca/index.php/2009/11/23/tracking-app-usage-with-pinch-metrics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Source Control and Xcode</title>
		<link>http://paulhart.ca/index.php/2009/11/20/source-control-and-xcode/</link>
		<comments>http://paulhart.ca/index.php/2009/11/20/source-control-and-xcode/#comments</comments>
		<pubDate>Sat, 21 Nov 2009 00:44:26 +0000</pubDate>
		<dc:creator>Paul Hart</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://paulhart.ca/?p=19</guid>
		<description><![CDATA[Source control is important. Here's a quick note about setting up Git with an Xcode project.]]></description>
			<content:encoded><![CDATA[<p>Up to this point I haven&#8217;t been using any source control on my iPhone project. As Sven pointed out in a comment on my last post, if I&#8217;d had source control in place, I could&#8217;ve branched my code, performed the cocos2d upgrades described previously, and merged the changes once they were successful. Instead I created an archive of the project&#8217;s state at the time.</p>
<p>Source control is the better solution. I&#8217;ve already had a couple of those &#8220;how do I un-break this?&#8221; moments where being able to revert changes would have been helpful. Let&#8217;s bring some control to that code.</p>
<p style="text-align: center;"><strong>A Plethora Of Choice</strong></p>
<p>Today&#8217;s developer has many options available when considering source control solutions, rom the old-school options of RCS and CVS, through to today&#8217;s <a href="http://mercurial.selenic.com/">Mercurial</a> and <a href="http://git-scm.com/">Git</a>. I&#8217;ll be using Git for this project, as I already have some experience with it and <a href="http://github.com/paulhart/">I have an account at GitHub</a>. I&#8217;ll be using GitHub to host the master repository.</p>
<p>Unfortunately there isn&#8217;t any integration of Git into Xcode. If you want to have that integration, then Subversion is the tool for you. Hopefully by 10.7 we&#8217;ll see more options (or a plugin system) available in Xcode. This doesn&#8217;t bother me too much, as I&#8217;m rather fond of my terminal windows (I keep Terminal in my dock).</p>
<p style="text-align: center;"><strong>Hub-a Hub-a</strong></p>
<p>The folks at GitHub have made it extremely easy to work with Git. As I&#8217;ve already got an account there, I created a new (private, sorry folks) repository. GitHub then presents the steps required to get started with the freshly minted repository. These steps are fine for most projects as-is, but when working with Xcode there&#8217;s a bunch of stuff we don&#8217;t want to store, such as build output, and some other files need to be treated in special ways. I created a .gitignore and .gitattributes files based on the content at <a href="http://shanesbrain.net/2008/7/9/using-xcode-with-git">Shane Vitarana&#8217;s blog</a>.</p>
<p>Once these additional files were in place, I initialized the repository, added everything to it, and did a first commit followed by a push to GitHub. Mission accomplished!</p>
<p>You don&#8217;t need to use GitHub by any means, but I like the tools and web view they offer. The important thing is having your code in a repository.</p>
]]></content:encoded>
			<wfw:commentRss>http://paulhart.ca/index.php/2009/11/20/source-control-and-xcode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upgrade Path for cocos2d 0.9.0-alpha</title>
		<link>http://paulhart.ca/index.php/2009/11/19/upgrade-path-for-cocos2d-0-9-0-alpha/</link>
		<comments>http://paulhart.ca/index.php/2009/11/19/upgrade-path-for-cocos2d-0-9-0-alpha/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 02:37:41 +0000</pubDate>
		<dc:creator>Paul Hart</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[cocos2d]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://paulhart.ca/?p=12</guid>
		<description><![CDATA[I decided to upgrade my project to using cocos2d 0.9.0-alpha. Here's the story.]]></description>
			<content:encoded><![CDATA[<p>While I&#8217;m making good progress with my project, I&#8217;m still far enough from completion that I don&#8217;t mind trying out bleeding edge versions of the libraries I rely on. In that vein, I&#8217;ve upgraded my game to use the cocos2d 0.9.0-alpha library that was <a href="http://www.cocos2d-iphone.org/forum/topic/3079">announced a few days ago</a>. Here&#8217;s my upgrade story.</p>
<p style="text-align: center;"><strong>Do No Harm</strong></p>
<p>First things first, make a backup of the project. In case of emergency, it&#8217;s easier to revert the processes undertaken. I simply made a tar file of the project directory and then gzipped it.</p>
<p style="text-align: center;"><strong>Excise The Old Tissue</strong></p>
<p>I deleted the &#8216;cocos2d&#8217; directory inside my &#8220;cocos2d Sources&#8221; group of classes (I&#8217;d create the project using one of the cocos2d templates). When asked, I told Xcode to move the files to the Trash, not just delete the references.</p>
<p style="text-align: center; "><strong>Introduce The Transplant</strong></p>
<p>Next was copying in the new &#8216;cocos2d&#8217; directory from the 0.9.0-alpha tarball into the place the old version of the directory inhabited. I stated I wanted to copy the files, not just references, and that I wanted them added to the &#8216;cocos2d libraries&#8217; subproject.</p>
<p style="text-align: center; "><strong>Administer The Anti-Rejection Medication</strong></p>
<p>At the bottom of the new ccConfig.h file is a commented out line that creates a CC_COMPATABILITY_WITH_0_8 flag. This is required initially, and will make cocos2d create stub classes that use the 0.8 naming conventions but flag their use with deprecation warnings.</p>
<p style="text-align: center;"><strong>Move to Intensive Care and Observe The Patient</strong></p>
<p>Now that the new files are in place and prepared, it&#8217;s time for a clean and compile. The result: a whole bunch of warnings as expected, but also a handful of errors. Errors are bad.</p>
<p>Fortunately, all the errors were the same &#8211; the compiler was complaining about the lack of a TargetedTouchDelegate protocol. This has been renamed CCTargetedTouchDelegate, so that change was applied liberally through the header files, the compile was fine, but the linker hated me. Turns out that the addition of the files to the &#8216;cocos2d libraries&#8217; subproject was a mistake. With that checkbox unchecked, the linking went fine.</p>
<p style="text-align: center;"><strong>Fool Me Once&#8230;</strong></p>
<p>Okay, so I really wanted to have my cocos2d folder live within the subproject build, not the main project. I deleted that new cocos2d directory again, and before adding it back I set the active project to be the &#8216;cocos2d libraries&#8217;. When I copied the files back into place, I was given the choice of making them exclusively part of that target, and did so. Then I set the active project back to my app, updated ccConfig.h again, cleaned the project, and compiled again. All good.</p>
<p style="text-align: center;"><strong>Removing The Stitches</strong></p>
<p>The setup was all corrected, now I needed to deal with the warnings. Most of these simply required the addition of the new &#8216;CC&#8217; namespace prefix. A few class names had changed completely though:</p>
<ul>
<li>TextureMgr is now CCTextureCache</li>
<li>AtlasAnimation is now part of CCAnimation</li>
<li>AtlasSprite is now part of CCSprite</li>
<li>AtlasSpriteManager is now CCSpriteSheet</li>
</ul>
<p>Where the class name had changed, there were a few method name changes to go alongside. Animation changes were slightly more involved, but not significantly so. My code now compiled without any warnings. All done, right?</p>
<p style="text-align: center;"><strong>Fool Me Twice&#8230;</strong></p>
<p>The last step was to re-comment the line in ccConfig.h that enabled 0.8 compatibility. A clean and compile later, and there&#8217;s a ton of errors again! Looks like not everything has a deprecation message yet. These classes included Director, TouchDispatcher, and some animations. The fixes were all class renames, and then it was done.</p>
<p style="text-align: center;"><strong>A Simple Operation</strong></p>
<p>All in all, this was a pretty simple feat to accomplish, though I got a lot of help from the <a href="http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:migrating_to_0_9">upgrade guide</a> and the <a href="http://www.cocos2d-iphone.org/forum/topic/3079">community forum</a>.  The cocos2d library is great and I look forward to seeing what new functionality the 0.9 series will bring us.</p>
]]></content:encoded>
			<wfw:commentRss>http://paulhart.ca/index.php/2009/11/19/upgrade-path-for-cocos2d-0-9-0-alpha/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Using Chipmunk Physics (In All The Wrong Ways)</title>
		<link>http://paulhart.ca/index.php/2009/11/18/using-chipmunk-physics-in-all-the-wrong-ways/</link>
		<comments>http://paulhart.ca/index.php/2009/11/18/using-chipmunk-physics-in-all-the-wrong-ways/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 03:15:05 +0000</pubDate>
		<dc:creator>Paul Hart</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://paulhart.ca/?p=7</guid>
		<description><![CDATA[Chipmunk physics offers functionality that can be used to simplify your games development in ways you may not have expected.]]></description>
			<content:encoded><![CDATA[<p>As I mentioned in passing in my previous post, I&#8217;ve started doing some iPhone development again. Last time I developed an application for playing <a href="http://en.wikipedia.org/wiki/Soundboard_(Flash)">soundboards</a> (ignore the Flash-specificity) on the device, and creating them via a web application. This time, I&#8217;ve decided to create a game.</p>
<p>The cocos2d-iphone library seems to be the best option available for creating two-dimensional games. It&#8217;s been proven in production games many times, and several of the most successful iPhone games have been developed with it. The latest distributions include built-in support for a couple of physics libraries, Chipmunk and Box2D.</p>
<p>My game doesn&#8217;t use gravity (the core mechanic is a top-down tower defence thing), but physics libraries offer some useful characteristics that have made my game easier to develop.</p>
<p style="text-align: center;"><strong>What a Creep</strong></p>
<p>Tower defence gameplay takes place on a grid. Two points in the grid are occupied at the start of the game &#8211; one is the location from which the creeps (bad guys) will start, and the other is the destination they want to reach. The player can place towers anywhere on the grid to shoot at the creeps and impede their movement, so long as the creeps can still reach the destination. Creeps will spawn from the start point at intervals.</p>
<p>The dynamic layout of towers in the grid means that the creeps must be able to figure out the optimal path to their destination. There is a standard algorithm for doing this called A* (and <a href="http://bravobug.com/news/?p=118">Alexander Bussman</a> has done all the heavy lifting with some great sample code). This pathfinding algorithm tells me which direction the creep should move in next, but it doesn&#8217;t manage the movement itself.</p>
<p>I didn&#8217;t want to have to track the location of each creep all the time, so I decided to use chipmunk to manage the movement of the creeps. With chipmunk it is very simple to define a speed vector for each object in the game space. I can also define a number of other characteristics for the object, such as the shape of its body (the area I state it displaces in the game space), and a &#8220;collision type&#8221; that tells the engine what kind of object it is. I can also write functions than handle collisions between different types of objects, so they are handled in various manners.</p>
<p>Now that the creeps have a &#8220;physical presence&#8221; in the game world, I needed to be told when they got to interesting points in the map (i.e. places where they might have to change direction). I created phantom bodies in the game space that the creeps would &#8220;bump into&#8221;, and associated the two collision types of the creeps and the phantoms with a callback function. When the function is called, I make the creep recalculate its path to the destination square on the grid and change direction if needed. For the purposes of the physics engine, I ignore the collision.</p>
<p style="text-align: center;"><strong>Bang Bang, Shoot Shoot</strong></p>
<p>I decided early on that I wanted the towers to target a single creep while it remained within range, and that the bullets should home in on that creep. Unfortunately I can&#8217;t use the physics engine to find the collision between the bullet and the one creep that its targeting, but chipmunk does make the homing very simple.</p>
<p>By defining a location of the bullet, I can calculate the current distance vector between the bullet and its target. I can then set the velocity of the bullet to have the same direction as the distance vector, and even apply an angle (just because an object is moving in a particular direction doesn&#8217;t mean it&#8217;s pointing in that direction).</p>
<p>With each tick of the game state I check all in-flight bullets to see if they&#8217;ve hit their targets. If so, I apply damage as appropriate and remove the bullet from the visible gameplay. If the target has disappeared, the bullet is also removed.</p>
<p style="text-align: center;"><strong>An Easier Life</strong></p>
<p>While I may not have used the chipmunk physics engine as intended, having access to its large feature set has been valuable in simplifying my code development. Admittedly, sometimes the documentation is lacking, but there are many examples online explaining how it can be put to use.</p>
]]></content:encoded>
			<wfw:commentRss>http://paulhart.ca/index.php/2009/11/18/using-chipmunk-physics-in-all-the-wrong-ways/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thoughts on improving and opening the iPhone / iPod Touch approval process</title>
		<link>http://paulhart.ca/index.php/2009/11/17/thoughts-on-improving-and-opening-the-iphone-ipod-touch-approval-process/</link>
		<comments>http://paulhart.ca/index.php/2009/11/17/thoughts-on-improving-and-opening-the-iphone-ipod-touch-approval-process/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 15:41:33 +0000</pubDate>
		<dc:creator>Paul Hart</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Approval Process]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://paulhart.ca/?p=3</guid>
		<description><![CDATA[Thoughts on how to improve the existing approvals process for the App Store, and on creating a new distribution channel.]]></description>
			<content:encoded><![CDATA[<p>It seems that Apple can&#8217;t catch a break these days, at least as far as their developer community is concerned. As someone who is actively developing an application (again) for iPhone and iPod Touch, the issues around the existing application approval process concern me greatly.</p>
<p>Below is a rehash of some comments I left at <a href="http://www.avc.com/a_vc/2009/11/the-power-of-instant-approval.html#comment-23186876">Fred Wilson&#8217;s blog</a>.</p>
<p>Today, the vast majority of iPhone developers are targeting the App Store as their only distribution channel. Though Apple has made an &#8220;ad-hoc&#8221; distribution channel available, it is unwieldy and extremely limited in its scope. Some developers have attempted to use this channel to circumvent the App Store; the reaction from Apple was to further limit the ad-hoc channel to the point that it was no longer viable for mass distribution.</p>
<p>While many commenters feel the whole idea of having an approval process is wrong on a moral level (&#8220;my customer&#8217;s device, my customer&#8217;s choice&#8221;), it does provide some value. In summary, some of the approval process is automated (&#8220;is this application only referencing public API methods?&#8221;) and some requires human input (&#8220;does the application meet our UI guidelines?&#8221;).</p>
<p>Given that some of the approval process is automated, I believe Apple should execute the automated steps as early as possible &#8211; right after the application has been uploaded. There is no value in a developer sitting around for two weeks for their program to be approved, only to find out that they&#8217;ve been rejected because an automated test has finally been run. The sooner this rejection reason can be communicated, the better.</p>
<p>Looking beyond this automation, there is the question of distribution. Currently Apple controls all distribution of applications for their mobile devices. I think they could open this up to some extent, while still maintaining control over certain aspects of code quality.</p>
<p>When developers submit their applications for approval, they could request an approval for &#8220;independent distribution&#8221;. Such applications would be required to pass the automated parts of the existing approvals process, and would probably have other restrictions (i.e. no access to StoreKit, no Push Notifications, possibly no network access). Passing applications would be signed by Apple as having been approved for independent distribution and could be installed via iTunes or directly through Mobile Safari and a slightly updated version of the existing App Store program on the iPhone.</p>
<p>If the developer chooses to only have their application approved for independent distribution, it is not put into the queue for human approval. This moves simple applications out of the extended approval process. Apple could introduce additional timing incentives for developers to start using this approval option. For instance, if the developer wants both forms of approval, they don&#8217;t get the signed binary for independent distribution until the full App Store approval process has been completed.</p>
<p>At the time of writing, the approval queue is approximately two weeks long (&#8220;96% of applications are approved within 14 days&#8221;). This queue is part of a workflow that takes a developed application and eventually makes it available to users exclusively through the App Store. By introducing some automation and other limiting criteria, Apple could create a better experience for their developer community and enable new distribution channels.</p>
]]></content:encoded>
			<wfw:commentRss>http://paulhart.ca/index.php/2009/11/17/thoughts-on-improving-and-opening-the-iphone-ipod-touch-approval-process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
