<?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>Indie iPhone Development Blog &#187; iPhone app</title>
	<atom:link href="http://blog.indieiphonedev.com/tag/iphone-app/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.indieiphonedev.com</link>
	<description>The musings of an independent iPhone developer</description>
	<lastBuildDate>Mon, 20 Jun 2011 18:48:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>On constructive critizism</title>
		<link>http://blog.indieiphonedev.com/2011/06/04/on-constructive-critizism/</link>
		<comments>http://blog.indieiphonedev.com/2011/06/04/on-constructive-critizism/#comments</comments>
		<pubDate>Sat, 04 Jun 2011 18:23:53 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[app review]]></category>
		<category><![CDATA[iPhone app]]></category>
		<category><![CDATA[iPhone OS]]></category>
		<category><![CDATA[objective-C]]></category>

		<guid isPermaLink="false">http://blog.indieiphonedev.com/?p=304</guid>
		<description><![CDATA[There has been a couple of blog posts lately regarding the bloggy criticism of iOS applications by other app developers as well as general tech bloggers. These posts seem to suggest that iOS developers should band together and not criticize each others applications. I generally agree with the statement &#8220;be excellent to each other&#8221; &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>There has been a couple of <a href="http://www.cimgf.com/2011/06/03/why-so-serious/">blog</a> <a href="http://iphonedevelopment.blogspot.com/2011/06/on-being-excellent-to-each-other.html">posts</a> lately regarding the bloggy criticism of iOS applications by other app developers as well as general tech bloggers.  These posts seem to suggest that iOS developers should band together and not criticize each others applications.  I generally agree with the statement &#8220;be excellent to each other&#8221; &#8211; but if that means patting each others backs and saying good job even if the application has flaws then the iOS platform is in trouble.  I think that one of the great things about the iOS platform is the constant push to make something that is greater and more amazing than what has been done before.<br />
<P><br />
Getting criticism, be it from users through app reviews or emails or from bloggers, is a great way to push everyone to make better applications.  I can clearly identify with the fact that developers have an emotional connection to the applications that they make.  None of my applications make a huge amount of money and my main motivation is to provide people with great tools to use on their phone &#8211; so getting emails or reviews saying &#8220;this app sucks&#8221; is a feeling not much different than helping a complete stranger just to have them spit at you.<br />
<P><br />
In my opinion, the app review system setup by Apple is one of the greatest innovations of the iOS platform and has been instrumental in the success of the App Store &#8211; before this the only way to give feedback was to email the developer and then they could do whatever they wanted &#8211; you had already paid for the app so they had no incentive to actually fix the issue.  With public reviews and a rating system the incentive to fix issues brought up is much greater and this is something that will push apps to become better.  Several times this has brought great new features to my apps and alerted me to features that were not as intuitive as I had originally thought.<br />
<P><br />
Like many other Apple enthusiasts I was very excited for the launch of The Daily.  Like many others I was disappointed at the initial product.  I think that a lot of people expected the app to be Apple Great (like Maps, Garage Band etc) because of the hype and media buildup for the app and the apparent endorsement of the app by Apple.  However, the app has several short falls <a href="http://blogs.telegraph.co.uk/technology/shanerichmond/100006286/the-daily-ipad-app-review-a-complete-failure-of-imagination/">which</a> <a href="http://technorati.com/technology/article/ipad-app-review-the-daily/">were</a> <a href="http://www.tuaw.com/2011/02/06/more-thoughts-on-the-daily/">pointed</a> <a href="http://daringfireball.net/linked/2011/02/02/the-daily-in-action">out</a> and <a href="http://daringfireball.net/linked/2011/02/06/brichter-daily">suggestions for improvements</a> with implementation were posted.  I do not understand why the developer of the app would be surprised that the app got a harsh reception when the developer admits himself that there were issues with the app that if they had longer time could have been sorted out.<br />
<P><br />
I hope that the iOS developer community is grown up enough that we can accept criticism of our work and that we can learn from this and all strive towards making excellent if not perfect apps.  </p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.indieiphonedev.com%2F2011%2F06%2F04%2Fon-constructive-critizism%2F&amp;title=On%20constructive%20critizism" id="wpa2a_2"><img src="http://blog.indieiphonedev.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.indieiphonedev.com/2011/06/04/on-constructive-critizism/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to batch change volume of aif files</title>
		<link>http://blog.indieiphonedev.com/2011/01/15/how-to-batch-change-volume-of-aif-files/</link>
		<comments>http://blog.indieiphonedev.com/2011/01/15/how-to-batch-change-volume-of-aif-files/#comments</comments>
		<pubDate>Sat, 15 Jan 2011 17:42:12 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[batch]]></category>
		<category><![CDATA[iPhone app]]></category>
		<category><![CDATA[sounds]]></category>
		<category><![CDATA[sox]]></category>

		<guid isPermaLink="false">http://blog.indieiphonedev.com/?p=265</guid>
		<description><![CDATA[After creating aif files that tells the distance of upto 100 miles in both miles and kilometers (around 50 individual files) I tested the distance announcement while playing music and found that the volume of all my files was too low.  Now I could go in and manually increase the volume on each file &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>After creating aif files that tells the distance of upto 100 miles in both miles and kilometers (around 50 individual files) I tested the distance announcement while playing music and found that the volume of all my files was too low.  Now I could go in and manually increase the volume on each file &#8211; but that would be a bit of a pain and possibly not very consistent.  Besides one of the things computers are good at is doing the same task over and over again.  So I looked for a software solution.  Luckily there is a great open source command line sound manipulation software called &lt;a href=&#8221;http://sox.sourceforge.net/&#8221;&gt;SOX&lt;/a&gt;.  This tool has a function for gain which lets you set the gain of any files in decibels (dB).</p>
<p>To run this program on all files in a folder run the following command from the terminal after copying the sox program to the folder:</p>
<pre class="brush: objc; title: ; notranslate">
for i in *.aif; do ./sox $i ${i%.*}.aiff gain -n 8; done;
</pre>
<p>In the instance above the original files are .aif and they were converted to have the file extension .aiff.  I tried to overwrite the original file &#8211; but that did not work well.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.indieiphonedev.com%2F2011%2F01%2F15%2Fhow-to-batch-change-volume-of-aif-files%2F&amp;title=How%20to%20batch%20change%20volume%20of%20aif%20files" id="wpa2a_4"><img src="http://blog.indieiphonedev.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.indieiphonedev.com/2011/01/15/how-to-batch-change-volume-of-aif-files/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Getting the timezone on the device</title>
		<link>http://blog.indieiphonedev.com/2011/01/09/getting-the-timezone-on-the-device/</link>
		<comments>http://blog.indieiphonedev.com/2011/01/09/getting-the-timezone-on-the-device/#comments</comments>
		<pubDate>Sun, 09 Jan 2011 20:02:41 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[date]]></category>
		<category><![CDATA[iPhone app]]></category>
		<category><![CDATA[objective-C]]></category>
		<category><![CDATA[source code]]></category>
		<category><![CDATA[timezone]]></category>

		<guid isPermaLink="false">http://blog.indieiphonedev.com/?p=258</guid>
		<description><![CDATA[Since the LogYourRun iPhone application will show you your running data in week and month views it is necessary to know the timezone of the user in order to bring up the data for the correct week/month. At first I thought I could use the NSDateFormatter to do this. The documentation says that you can [...]]]></description>
			<content:encoded><![CDATA[<p>Since the LogYourRun iPhone application will show you your running data in week and month views it is necessary to know the timezone of the user in order to bring up the data for the correct week/month.  At first I thought I could use the NSDateFormatter to do this.  The documentation says that you can get timezone informationby using %z or %Z as the format.  The %z should get you the offset in hours while the %Z should get you the name.  However when tested it turned out that the opposite is the case&#8230; </p>
<p>The following code gets you the timezone offset in hours:</p>
<pre class="brush: objc; title: ; notranslate">
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@&quot;Z&quot;]; // error in documentation - the zone in hours should be 'z' not 'Z'
timezoneoffset = (int) [[dateFormatter stringFromDate:[NSDate date]] intValue]/100;
DLog(@&quot;format %@&quot;, [dateFormatter stringFromDate:[NSDate date]]);
[dateFormatter release];
</pre>
<p>(Note the division by 100 is because the timezone is reported in military time so for 30 min offset the final timezone would be read as x.30 which is not really correct &#8211; but for getting a ballpark figure it would suffice).</p>
<p>Since the code is not behaving according to documentation it is not a good idea to use this to get the timezone because the code will break if the code ever starts behaving according to documentation.  </p>
<p>Instead it turns out that there is a very nice NSTimeZone object which will give you the timezone offset from GMT in seconds:</p>
<pre class="brush: objc; title: ; notranslate">
int timezoneoffset = ([[NSTimeZone systemTimeZone] secondsFromGMT] / 3600);
</pre>
<p>Then all you have to do to get the hour difference is divide by 3600 (seconds per hour).  If you cared about the half hour offsets you would make this a float &#8211; but this is plenty for getting a ballpark figure.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.indieiphonedev.com%2F2011%2F01%2F09%2Fgetting-the-timezone-on-the-device%2F&amp;title=Getting%20the%20timezone%20on%20the%20device" id="wpa2a_6"><img src="http://blog.indieiphonedev.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.indieiphonedev.com/2011/01/09/getting-the-timezone-on-the-device/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comparison chart of top GPS enabled running applications for the iPhone</title>
		<link>http://blog.indieiphonedev.com/2010/12/15/comparison-chart-of-top-gps-enabled-running-applications-for-the-iphone/</link>
		<comments>http://blog.indieiphonedev.com/2010/12/15/comparison-chart-of-top-gps-enabled-running-applications-for-the-iphone/#comments</comments>
		<pubDate>Wed, 15 Dec 2010 06:35:57 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[iPhone exercise apps]]></category>
		<category><![CDATA[app review]]></category>
		<category><![CDATA[Exercise]]></category>
		<category><![CDATA[GPS]]></category>
		<category><![CDATA[iPhone app]]></category>
		<category><![CDATA[iPhone marketing]]></category>
		<category><![CDATA[Running app]]></category>

		<guid isPermaLink="false">http://blog.indieiphonedev.com/?p=241</guid>
		<description><![CDATA[The following table shows some of the differences in features between the top 7 GPS enabled iPhone running applications. If I missed a feature that you think is important please let me know in the comments. LogYourRun RunKeeper MapMyRun Nike+ GPS Jog Log Runtastic Runmeter GPS Live updates Via Twitter TweetMyDistcance RunKeeper Live Route view [...]]]></description>
			<content:encoded><![CDATA[<p>The following table shows some of the differences in features between the top 7 GPS enabled iPhone running applications.  If I missed a feature that you think is important please let me know in the comments.</p>
<table style="border-style: solid; border-width: 2px; border-collapse: collapse;" border="2" cellspacing="0" cellpadding="5" width="100%">
<tbody>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt; width: 184pt;" width="184" height="15"></td>
<td style="width: 105px; background-color: #dddddd;" width="105"><a href="http://www.logyourrun.com/iphone"></a>LogYourRun</td>
<td style="width: 105px;" width="105">RunKeeper</td>
<td style="width: 105px; background-color: #dddddd;" width="105">MapMyRun</td>
<td style="width: 105px;" width="105">Nike+ GPS</td>
<td style="width: 105px; background-color: #dddddd;" width="105">Jog Log</td>
<td style="width: 105px;" width="105">Runtastic</td>
<td style="width: 105px; background-color: #dddddd;" width="105">Runmeter</td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">GPS</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">Live updates</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /><br />Via Twitter <a href="http://www.TweetMyDistcance.com">TweetMyDistcance</a></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /><br />RunKeeper Live</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="no" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">Route view</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">In App Elevation</td>
<td style="background-color: #dddddd;">Google</td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td>GPS</td>
<td style="background-color: #dddddd;">GPS</td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">Pedometer</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">Music</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="paid" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/paid.png" alt="paid" width="20" height="20" /></td>
<td style="background-color: #dddddd;">change tracks</td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">Heart rate</td>
<td style="background-color: #dddddd;">fisica, 60beat, voice cues</td>
<td>fisica</td>
<td style="background-color: #dddddd;">fisica</td>
<td>Nike+ system</td>
<td style="background-color: #dddddd;">fisica</td>
<td>fisica, 60beat, voice cues</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">Time in zones</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">Voice cues</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="paid" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">Facebook upload</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">Twitter upload</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">Dailymile upload</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">Email sharing</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="paid" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">Manual entry</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">Integrated website</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">Other types of activities</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;">other apps</td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td  style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">See routes in your area</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">Download training Programs</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="not" width="20" height="20" /></td>
</tr>
<tr style="height: 15pt;" height="15">
<td style="height: 15pt;" height="15">Free version</td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="paid" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="paid" width="20" height="20" /></td>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="20" height="20" /></td>
<td style="background-color: #dddddd;"><img src="/wp-content/uploads/2010/12/not.png" alt="paid" width="20" height="20" /></td>
</tr>
</tbody>
</table>
<h1>Legend</h1>
<table cellpadding="5">
<tbody>
<tr>
<td><img src="/wp-content/uploads/2010/12/ok.png" alt="ok" width="30" height="30" /></td>
<td style="text-align: left;">Feature available in free and paid version</td>
</tr>
<tr>
<td><img src="/wp-content/uploads/2010/12/not.png" alt="ok" width="30" height="30" /></td>
<td style="text-align: left;">Feature not available</td>
</tr>
<tr>
<td><img src="/wp-content/uploads/2010/12/paid.png" alt="ok" width="30" height="30" /></td>
<td style="text-align: left;">Feature available in paid version only</td>
</tr>
</tbody>
</table>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.indieiphonedev.com%2F2010%2F12%2F15%2Fcomparison-chart-of-top-gps-enabled-running-applications-for-the-iphone%2F&amp;title=Comparison%20chart%20of%20top%20GPS%20enabled%20running%20applications%20for%20the%20iPhone" id="wpa2a_8"><img src="http://blog.indieiphonedev.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.indieiphonedev.com/2010/12/15/comparison-chart-of-top-gps-enabled-running-applications-for-the-iphone/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>MGTwitterEngine and Locations</title>
		<link>http://blog.indieiphonedev.com/2010/09/03/mgtwitterengine-and-locations/</link>
		<comments>http://blog.indieiphonedev.com/2010/09/03/mgtwitterengine-and-locations/#comments</comments>
		<pubDate>Sat, 04 Sep 2010 04:35:41 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[GPS]]></category>
		<category><![CDATA[iPhone app]]></category>
		<category><![CDATA[iPhone OS]]></category>
		<category><![CDATA[objective-C]]></category>
		<category><![CDATA[source code]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://blog.indieiphonedev.com/?p=212</guid>
		<description><![CDATA[How to implement location of tweets from iPhone applications using the MGTwitterEngine.]]></description>
			<content:encoded><![CDATA[<p>So Twitter just updated their API to disallow the use of authentication through the REST API.  They were nice enough to announce that in an email 2 days after they turned it off so that meant that I had to learn all about OAuth overnight and scramble to find something that could take over the Twitter functionality of the LogYourRun iPhone app.</p>
<p>Luckily most of the leg work in this are has been done by Matt Gemmell and his <a href="http://mattgemmell.com/2008/02/22/mgtwitterengine-twitter-from-cocoa">Twitter engine</a>.  Some slight modifications are required in order to get it <a href="http://github.com/bengottlieb/Twitter-OAuth-iPhone">running on the iPhone</a> and <a href="http://www.2bros1blog.com/2010/07/switching-from-basic-to-xauth-with-mgtwitterengine-on-iphone/">working with OAuth</a>.  Update:  The guys at iCodeBlog have a <a href="http://icodeblog.com/2010/09/16/dealing-with-the-twitter-oauth-apocalypse/">great tutorial</a> on how to implement the libraries.</p>
<p>With these libraries dropped in the new Twitter authentication system is fairly easy to implement.  The main problem is that the MGTwitterEngine does not support the Twitter location API.  Since this is an important piece of <a href="http://tweetmydistance.com/">TweetMyDistance</a> I modified the MGTwitterEngine.m and added a function for tweeting with location.  The new method takes latitude and longitude as well as the tweet and if this is a reply to a previous tweet.  As you can see from <a href="http://twitter.com/tim221175/statuses/22930742608">my tweet</a> it works great.  The code below should replace the code in MGTwitterEngine and don&#8217;t forget to also update your .h file.</p>
<pre class="brush: objc; title: ; notranslate">
- (NSString *)sendUpdate:(NSString *)status
{
    return [self sendUpdate:status inReplyTo:0];
}

- (NSString *)sendUpdate:(NSString *)status inReplyTo:(unsigned long)updateID
{

	return [self sendUpdate: status inReplyTo: updateID withLatitude: 0.0 andLongitude: 0.0];

}

- (NSString *)sendUpdate:(NSString *)status
			   inReplyTo:(unsigned long)updateID
			withLatitude:(double) lat
			andLongitude: (double) lng
{
	if (!status) {
        return nil;
    }

    NSString *path = [NSString stringWithFormat:@&quot;statuses/update.%@&quot;, API_FORMAT];

    NSString *trimmedText = status;
    if ([trimmedText length] &gt; MAX_MESSAGE_LENGTH) {
        trimmedText = [trimmedText substringToIndex:MAX_MESSAGE_LENGTH];
    }

    NSMutableDictionary *params = [NSMutableDictionary dictionaryWithCapacity:0];
    [params setObject:trimmedText forKey:@&quot;status&quot;];
    if (updateID &gt; 0) {
        [params setObject:[NSString stringWithFormat:@&quot;%u&quot;, updateID] forKey:@&quot;in_reply_to_status_id&quot;];
    }
    if (lat != 0.0 &amp;&amp; lng != 0.0) {
		// lat=%1.6f&amp;long=%1.6f&amp;display_coordinates=true
        [params setObject:[NSString stringWithFormat:@&quot;%1.6f&quot;, lat] forKey:@&quot;lat&quot;];
        [params setObject:[NSString stringWithFormat:@&quot;%1.6f&quot;, lng] forKey:@&quot;long&quot;];
        [params setObject:@&quot;true&quot; forKey:@&quot;display_coordinates&quot;];
    }
    NSString *body = [self _queryStringWithBase:nil parameters:params prefixed:NO];

	DLog(@&quot; twitterbody: %@&quot;, body);

    return [self _sendRequestWithMethod:HTTP_POST_METHOD path:path
                        queryParameters:params body:body
                            requestType:MGTwitterUpdateSendRequest
                           responseType:MGTwitterStatus];
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.indieiphonedev.com/2010/09/03/mgtwitterengine-and-locations/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Converting App from iPhone to Universal</title>
		<link>http://blog.indieiphonedev.com/2010/04/29/converting-app-from-iphone-to-universal/</link>
		<comments>http://blog.indieiphonedev.com/2010/04/29/converting-app-from-iphone-to-universal/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 03:54:47 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone app]]></category>
		<category><![CDATA[objective-C]]></category>
		<category><![CDATA[source code]]></category>

		<guid isPermaLink="false">http://blog.indieiphonedev.com/?p=194</guid>
		<description><![CDATA[With the iPad selling like hot cakes it seems like a good idea to get on the bandwagon and make some apps for the iPad.  The LogYourRun app is not particularly well suited for running on the iPad &#8211; I doubt that people will be strapping their iPads to their arms and run around the [...]]]></description>
			<content:encoded><![CDATA[<p>With the iPad selling like hot cakes it seems like a good idea to get on the bandwagon and make some apps for the iPad.  The LogYourRun app is not particularly well suited for running on the iPad &#8211; I doubt that people will be strapping their iPads to their arms and run around the park.  However, the heart rate app seems like something that people would enjoy using even on iPads.  Since I did not want to have to maintain two separate apps I decided to make the app universal.  This was actually quite an easy process and took only about 10-12 hours (could have been faster if I had known what I was doing &#8211; which is why I wanted to share what I learned).</p>
<p>First step is to make sure you copy your application folder so you will be able to go back to the original application if you mess up.  Then with your newly copied application upgrade your target to work on the iPad in addition to the iPhone.  Click on your target and go into the menu &#8211; under Project you will find an entry that says &#8220;upgrade current target for iPad&#8221;.  Select the &#8220;One Universal application&#8221; option.  This will generate a new group which contains your new iPad version of the MainWindow.xib file &#8211; MainWindow-iPad.xib.  You can use this new nib to load all your iPad specific views.</p>
<p>At this point I went through all my existing nibs and created iPad versions (can be done in the Interface Builder) and saved them as XxxViewController-iPad.xib in the Resources-iPad folder.  For iPad nibs you have to make sure that you have versions of the nib that look decent and are usable in both landscape and horizontal orientations.  This can be tricky if you have a lot of UI elements but is very important since iPad apps have to support all orientations.  Make sure you anchor your UI elements to the right edges and that they scale to look nice.</p>
<p>The heart rate app uses a tab bar.  It took me the longest time to figure out how to get this to rotate.  The reason for this was that I had not read <a href="http://developer.apple.com/iphone/library/featuredarticles/ViewControllerPGforiPhoneOS/TabBarControllers/TabBarControllers.html#//apple_ref/doc/uid/TP40007457-CH102-SW26" target="_blank">Apple&#8217;s documentation</a>.  Turns out that <strong>all</strong> the view controllers that the tab bar links to have to return YES for all shouldAutorotateToInterfaceOrientation: orientations.  This makes sense conceptually.  In addition you need to <a href="http://blog.costan.us/2009/01/auto-rotating-tab-bars-on-iphone.html">set your view controllers</a> to automatically resize when rotation occurs.  Once these are set you will be able to see what the rotation looks like in the iPad simulator (hopefully great).</p>
<p>Loading the iPad specific nibs using the view controller is a great way to get these to show up on the iPad only &#8211; but there are some cases where you will need to load a view controller programatically (in my case when the user clicks on the help button it brings up the help VC).  To make sure that you load the right nib you can check if the app is running on the iPad.  The following code is what I used:</p>
<pre>
<pre class="brush: objc; title: ; notranslate">
- (BOOL) isIPad {
#if (__IPHONE_OS_VERSION_MAX_ALLOWED &gt;= 30200)
  if ([[UIDevice currentDevice] respondsToSelector: @selector(userInterfaceIdiom)])
    return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad);
#endif

  return NO;
}
</pre>
</pre>
<p>This code will check if the iDevice responds to the userInterfaceIdiom selector and if it does it checks if the device is an iPad.  If it is I load the iPad version of the helpVC if not then I load the iPhone version of the helpVC.  Make sure you also put the respondToRotation in these VCs since they will need to respond predictably also.</p>
<p>Finally you will need to create a default image that can be presented on the iPhone.  In your info.plist you can set the &#8220;Launch image (iPad)&#8221; to the base name of the iPad graphic (e.g. Default-iPad.png).  You can then create two images named Default-iPad-Landscape and Default-iPad-Portrait and add them to your project.  The iPad will pick whichever of the default images that fits with the rotation of the device.</p>
<p>When uploading your app &#8211; build the app in OS3.2.  The app will run on both iPhone and iPad from one binary. You will also have to upload screenshots for the iPad version for display in the iPad app store and create two new icons (50&#215;50 and 72&#215;72).  Once you have all that together your app is ready for submission and you can start praying that it will be a speedy path to acceptance.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.indieiphonedev.com%2F2010%2F04%2F29%2Fconverting-app-from-iphone-to-universal%2F&amp;title=Converting%20App%20from%20iPhone%20to%20Universal" id="wpa2a_10"><img src="http://blog.indieiphonedev.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.indieiphonedev.com/2010/04/29/converting-app-from-iphone-to-universal/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Elevation for routes</title>
		<link>http://blog.indieiphonedev.com/2010/04/09/elevation-for-routes/</link>
		<comments>http://blog.indieiphonedev.com/2010/04/09/elevation-for-routes/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 00:57:25 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[core location]]></category>
		<category><![CDATA[google maps]]></category>
		<category><![CDATA[GPS]]></category>
		<category><![CDATA[iPhone app]]></category>

		<guid isPermaLink="false">http://blog.indieiphonedev.com/?p=173</guid>
		<description><![CDATA[I have been playing around with the GPS functionality of the iPhone for a while now and I think I have optimized the collection of in-plane GPS data as best as possible given the limitations of the hardware.  The iPhone was not created to be a garmin forerunner and this especially shines through when you [...]]]></description>
			<content:encoded><![CDATA[<p>I have been playing around with the GPS functionality of the iPhone for a while now and I think I have optimized the collection of in-plane GPS data as best as possible given the limitations of the hardware.  The iPhone was not created to be a garmin forerunner and this especially shines through when you try to get elevation data out of the iPhone GPS.  This became painfully obvious after I built the functionality for collecting and displaying elevation data from the GPS.  Even after creating sophisticated methods for filtering the GPS data and averaging the data and weighing the data by the vertical accuracy the graphs of the running data had no correlation with reality.  At first this was disappointing &#8211; I had created this great code for collecting, saving, and displaying the elevation data but clearly if I released an app which was going to show unrealistic elevation data &#8211; the app would get killed by bad reviews.</p>
<p>So I looked around for other places to get elevation data.  Turns out that the space station has used lasers to measure elevation all over the surface of the earth and that Google has an API which allows you to query that data.  This means much better resolution on the elevation data than a GPS (even a garmin) could ever provide and I can show elevation data for both current routes as well as routes that have been saved which have no elevation data saved with them.  The only issue is that a data connection is required in order to get at this data but the amount of data being sent back and forth is so small that the elevation data shows up almost instantly even on an EDGE connection.  Being a good citizen I only have the app request elevation data if the user is interested in seeing this type of data &#8211; this keeps data usage down and keeps load off Google&#8217;s servers.</p>
<p>The video below shows how the elevation data is displayed within the app.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/UzgwUBM23ww&amp;hl=en_US&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/UzgwUBM23ww&amp;hl=en_US&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.indieiphonedev.com%2F2010%2F04%2F09%2Felevation-for-routes%2F&amp;title=Elevation%20for%20routes" id="wpa2a_12"><img src="http://blog.indieiphonedev.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.indieiphonedev.com/2010/04/09/elevation-for-routes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My take on iPhone vs android phones</title>
		<link>http://blog.indieiphonedev.com/2010/03/30/my-take-on-iphone-vs-android-phones/</link>
		<comments>http://blog.indieiphonedev.com/2010/03/30/my-take-on-iphone-vs-android-phones/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 22:10:47 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Opinion]]></category>
		<category><![CDATA[iPhone app]]></category>

		<guid isPermaLink="false">http://blog.indieiphonedev.com/?p=163</guid>
		<description><![CDATA[The android phone to me is a me-to device.  When meeting people with android phones the first thing that comes to mind is not &#8220;wow cool phone&#8221; it is &#8220;poor guy &#8211; he was not able to get an iPhone&#8221;.  I am in the same boat &#8211; I am on T-mobile and I refuse to [...]]]></description>
			<content:encoded><![CDATA[<p>The android phone to me is a me-to device.  When meeting people with android phones the first thing that comes to mind is not &#8220;wow cool phone&#8221; it is &#8220;poor guy &#8211; he was not able to get an iPhone&#8221;.  I am in the same boat &#8211; I am on T-mobile and I refuse to buy a $300  hand-me-down iPhone on e-bay so I still use my 2 year old blackberry  phone.  I do not believe that anyone goes to their carrier to get a new phone and think &#8220;I really want an android phone&#8221; (except for a few hardcore geeks and lifehackers) &#8211; but people are very excited to get their first iPhone.</p>
<p>Now, I was very excited at the end of 2008 when rumors were that Google was going to launch their new phone and totally change the customer/carrier cell phone relationship.  Obviously I was sorely disappointed when the Nexus One came out and it was still tied to a carrier plan (true it is not absolutely tied but at the price of $500+ for a phone I consider it as such).  In retrospect the interesting thing is that I was not excited to get an android phone &#8211; I was excited to get an iPhone-like phone and to be able to break the contractual relationship between me and my carrier.  Don&#8217;t get me wrong &#8211; I love T-mobile &#8211; that is the only reason why I am still using my old blackberry.  But for a phone to really be revolutionary it would be great to get it without a 2 year jail sentence called a &#8220;contract&#8221;.</p>
<p>Depending on what comes out this summer and for what carrier I may sign up for another go to jail card and finally get the device that I have been developing for for the last 2 years.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.indieiphonedev.com%2F2010%2F03%2F30%2Fmy-take-on-iphone-vs-android-phones%2F&amp;title=My%20take%20on%20iPhone%20vs%20android%20phones" id="wpa2a_14"><img src="http://blog.indieiphonedev.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.indieiphonedev.com/2010/03/30/my-take-on-iphone-vs-android-phones/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using audio services to play alert sound</title>
		<link>http://blog.indieiphonedev.com/2010/03/22/using-audio-services-to-play-alert-sound/</link>
		<comments>http://blog.indieiphonedev.com/2010/03/22/using-audio-services-to-play-alert-sound/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 04:24:36 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[iPhone app]]></category>
		<category><![CDATA[objective-C]]></category>
		<category><![CDATA[sounds]]></category>
		<category><![CDATA[source code]]></category>

		<guid isPermaLink="false">http://blog.indieiphonedev.com/?p=150</guid>
		<description><![CDATA[Some times it your application may inadvertently quit with out the user meaning to quit your app.  For example people run with the running/GPS app and the iPhone may be in a pocket / arm band / hand where the square button could be pressed unintentionally.  If the app quits while running it will not [...]]]></description>
			<content:encoded><![CDATA[<p>Some times it your application may inadvertently quit with out the user meaning to quit your app.  For example people run with the running/GPS app and the iPhone may be in a pocket / arm band / hand where the square button could be pressed unintentionally.  If the app quits while running it will not collect running data for the rest of the run and the user will be very disappointed.  To avoid this I have setup an alert which will make a sound if the user quits the app while the app is collecting running data.  I was able to find the original apple alert aiff files via Google and I chose to implement the Indigo sound as the alert &#8211; the cricket is not really loud enough to be an alert sound.</p>
<p>By implementing the playback of the sound as an alert sound the sound will be played even on the 1st gen iPod Touch which does not have a speaker.  Alert sounds can also be set to finish playback after the app finishes &#8211; which is an important feature for this use.  I was able to find how to set this property on <a href="http://nagano.monalisa-au.org/?p=721">Nagano&#8217;s blog</a>.  Not sure what most of the page says but the language of Objective C is universal. Remember to add the audiotoolbox to your project.</p>
<pre class="brush: objc; title: ; notranslate">

#include &amp;lt;AudioToolbox/AudioToolbox.h&amp;gt;
</pre>
<p>I then load the sound in the viewDidLoad init function for the view controller where I want to play the sound &#8211; this way you are not trying to load the sound as the app is quitting.  The soundFileObject isa global for this VC.</p>
<pre class="brush: objc; title: ; notranslate">
// SOUNDS
 NSString *path = [[NSBundle mainBundle] pathForResource:@&amp;quot;Indigo&amp;quot; ofType:@&amp;quot;aiff&amp;quot;];
 NSURL *fileURL = [NSURL fileURLWithPath:path];

 OSStatus err;
 err = AudioServicesCreateSystemSoundID((CFURLRef)fileURL, &amp;amp;soundFileObject);
 if(err) {
   DLog(@&amp;quot;AudioServicesCreateSystemSoundID err = %d&amp;quot;,err);
   exit(1);
 }

 UInt32 flag = 1;
 err = AudioServicesSetProperty(kAudioServicesPropertyCompletePlaybackIfAppDies,
     sizeof(UInt32),
     &amp;amp;soundFileObject,
     sizeof(UInt32),
     &amp;amp;flag);
 if(err){
   DLog(@&amp;quot;AudioServicesSetProperty err = %d&amp;quot;,err);
 }
</pre>
<p>Then under viewWillDisappear I have the following:</p>
<pre class="brush: objc; title: ; notranslate">
 if (runActivity.isStarted) {
   // play alert sound if exiting while running
   AudioServicesPlayAlertSound (self.soundFileObject);
 }
</pre>
<p>This way the sound will play if the view is unloading while the user is expecting the app to be collecting data.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.indieiphonedev.com%2F2010%2F03%2F22%2Fusing-audio-services-to-play-alert-sound%2F&amp;title=Using%20audio%20services%20to%20play%20alert%20sound" id="wpa2a_16"><img src="http://blog.indieiphonedev.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.indieiphonedev.com/2010/03/22/using-audio-services-to-play-alert-sound/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Driving traffic to your app by launching free tools</title>
		<link>http://blog.indieiphonedev.com/2010/03/16/driving-traffic-to-your-app-by-launching-free-tools/</link>
		<comments>http://blog.indieiphonedev.com/2010/03/16/driving-traffic-to-your-app-by-launching-free-tools/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 18:13:46 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[iPhone marketing]]></category>
		<category><![CDATA[advertisement]]></category>
		<category><![CDATA[app store]]></category>
		<category><![CDATA[free app]]></category>
		<category><![CDATA[iPhone app]]></category>

		<guid isPermaLink="false">http://blog.indieiphonedev.com/?p=147</guid>
		<description><![CDATA[LogYourRun is a site for active people &#8211; runners, hikers, and cyclists.  To generate interest and app sales for the paid version of the LogYourRun iPhone app I have decided to launch a series of free running tools.  The hope is that the target audience of LogYourRun will be looking for apps that can solve [...]]]></description>
			<content:encoded><![CDATA[<p>LogYourRun is a site for active people &#8211; runners, hikers, and cyclists.  To generate interest and app sales for the paid version of the LogYourRun iPhone app I have decided to launch a series of free running tools.  The hope is that the target audience of LogYourRun will be looking for apps that can solve simple problems for them &#8211; such as measure heart rate and calculate heart rate zones and calculate pace based on distance and time &#8211; and they download these apps they will see advertisement for the paid LogYourRun app which will potentially dive sales of this app.</p>
<p>Here are the free apps:</p>
<ol>
<li>A free version of the GPS/pedometer app.</li>
<li>A free heart rate measurement tool.</li>
<li>A free Pace Calculator</li>
</ol>
<p>All of these are tools that runners might look for on the app store and all of these apps have links to the full LogYourRun app and the YouTube video showing what a great app that is.</p>
<p>The LYR Free (GPS/pedometer) has been in the app store for several months but interestingly has not  been hugely successful maybe because of the lack of brand name  recognition or because the paid version is so cheap</p>
<p>The Heart Rate tool (HR) has proved to be hugely successful &#8211; probably because it is one of the few free apps that will let you measure your heart rate and calculate your heart rate zones.  I still need to integrate pinch analytics to see if this is actually driving traffic to the full app &#8211; but since the HR app has launched the sales for the full app has gone up 3 fold.</p>
<p>The Pace Calculator will go live this week and I look forward to seeing the response to this app.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.indieiphonedev.com%2F2010%2F03%2F16%2Fdriving-traffic-to-your-app-by-launching-free-tools%2F&amp;title=Driving%20traffic%20to%20your%20app%20by%20launching%20free%20tools" id="wpa2a_18"><img src="http://blog.indieiphonedev.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.indieiphonedev.com/2010/03/16/driving-traffic-to-your-app-by-launching-free-tools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

