<?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.feedburner.com/~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>iDeveloper TV</title>
	
	<link>http://blog.ideveloper.tv</link>
	<description>Training, Tutorials and Conferences for OS X and iOS Developers</description>
	<lastBuildDate>Tue, 18 Jun 2013 18:00:46 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/idevelopertv" /><feedburner:info uri="idevelopertv" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Podcast 88 – WWDC Round Up and Oxygene</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/u9prlJD7VR0/</link>
		<comments>http://blog.ideveloper.tv/podcast88/#comments</comments>
		<pubDate>Tue, 18 Jun 2013 17:59:34 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=941</guid>
		<description><![CDATA[Scotty sums his thoughts on WWDC 13 and chats with Marc Hoffman of RemObjects about their cross platform Pascal based language called Oxygene. Links Oxygene Sugar You can get 25% of Oxygene using coupon code idtv. Guest Details Marc Hoffman from RemObjects, Twitter: @dwarfland Scotty from iDeveloper Podcast, Twitter: @macdevnet, App.Net: Scotty John Fox from [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty sums his thoughts on WWDC 13 and chats with Marc Hoffman of RemObjects about their cross platform Pascal based language called Oxygene.<br />
<span id="more-941"></span></p>
<h2>Links</h2>
<ul>
<li><a title="Oxygene Web Page" href="http://www.remobjects.com/oxygene/">Oxygene</a></li>
<li><a title="Sugar on GitHub" href="https://github.com/remobjects/sugar">Sugar</a></li>
</ul>
<p>You can get 25% of Oxygene using coupon code <strong>idtv</strong>.</p>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Marc Hoffman from <a title="RemObjects Website" href="http://remobjects.com">RemObjects</a>, Twitter: <a title="Marc Hoffman on Twitter" href="https://twitter.com/dwarfland">@dwarfland</a><a href="http://twitter.com/atomkirk"><br />
</a></li>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a href="http://memoryminer.com">Memory Miner</a>, Twitter: <a href="http://twitter.com/djembe">@djembe</a>, App.net: <a href="http://alpha.app.net/djembe">djembe</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloper088.m4a">here</a><br />
Or <a href="http://itunes.apple.com/gb/podcast/ideveloper-live/id400664935">Subscribe</a> in iTunes.</p>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p>Use Coupon Code  <strong>IDEVTV-2013</strong> to get $200 off.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" alt="Invasivecode Logo" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/u9prlJD7VR0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast88/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast88/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/QDc3mLLc0gE/ideveloper088.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloper088.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 087: MTAnimation and WWDC Predictions</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/96g9EWENcR0/</link>
		<comments>http://blog.ideveloper.tv/podcast087/#comments</comments>
		<pubDate>Tue, 04 Jun 2013 18:01:36 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=933</guid>
		<description><![CDATA[Scotty and John chat with Adam Kirk of Mysterious Trousers about his open source UIView Animation Framework MTAnimation Links Visceral Apps and You (Blog Post) MTAnimation (GitHub) iDeveloper TV / Invasive Code WWDC Party Guest Details Adam Kirk from Mysterious Trousers, Twitter: @atomkirk Scotty from iDeveloper Podcast, Twitter: @macdevnet, App.Net: Scotty John Fox from Memory [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty and John chat with Adam Kirk of Mysterious Trousers about his open source UIView Animation Framework MTAnimation<br />
<span id="more-933"></span></p>
<h2>Links</h2>
<ul>
<li><a title="Visceral Apps and You" href="http://mysterioustrousers.com/news/2013/3/25/visceral-apps-and-you">Visceral Apps and You</a> (Blog Post)</li>
<li><a title="MTAnimation on GitHub" href="https://github.com/mysterioustrousers/MTAnimation">MTAnimation</a> (GitHub)</li>
<li><a title="iDeveloper TV / Invasive Code WWDC Party" href="http://www.wwdc-bash-mini.com/">iDeveloper TV / Invasive Code WWDC Party</a></li>
</ul>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Adam Kirk from <a title="Mysterious Trousers" href="http://mysterioustrousers.com/">Mysterious Trousers</a>, Twitter: <a href="http://twitter.com/atomkirk">@atomkirk</a></li>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a href="http://memoryminer.com">Memory Miner</a>, Twitter: <a href="http://twitter.com/djembe">@djembe</a>, App.net: <a href="http://alpha.app.net/djembe">djembe</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloper087.m4a">here</a><br />
Or <a href="http://itunes.apple.com/gb/podcast/ideveloper-live/id400664935">Subscribe</a> in iTunes.</p>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p>Use Coupon Code  <strong>IDEVTV-2013</strong> to get $200 off.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" alt="Invasivecode Logo" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/96g9EWENcR0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast087/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast087/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/yuhSjNIca8o/ideveloper087.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloper087.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 086: Briefs With Rob Ryhne</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/VtgA6MATqF0/</link>
		<comments>http://blog.ideveloper.tv/podcast086/#comments</comments>
		<pubDate>Tue, 28 May 2013 16:39:04 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=931</guid>
		<description><![CDATA[Scotty and John chat with MartianCraft CEO Rob Rhyne about the technical challenges they faced developing their new product BRIEFS Links BRIEFS Guest Details Ron Rhyne from MartianCraft, Twitter: @capttaco Scotty from iDeveloper Podcast, Twitter: @macdevnet, App.Net: Scotty John Fox from iDeveloper Podcast, Twitter: @djembe, App.Net: @djembe Please follow our guests on twitter / App.net [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty and John chat with MartianCraft CEO Rob Rhyne about the technical challenges they faced developing their new product BRIEFS<br />
<span id="more-931"></span></p>
<h2>Links</h2>
<ul>
<li><a href="http://giveabrief.com">BRIEFS</a></li>
</ul>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Ron Rhyne from <a href="http://martiancraft.com">MartianCraft</a>, Twitter: <a href="http://twitter.com/capttaco">@capttaco</a><a href="http://twitter.com/matmanferdini"><br />
</a></li>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="iDeveloper Live" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">@djembe</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloper086.m4a">here</a><br />
Or <a href="http://itunes.apple.com/gb/podcast/ideveloper-live/id400664935">Subscribe</a> in iTunes.</p>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p>Use Coupon Code  <strong>IDEVTV-2013</strong> to get $200 off.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" alt="Invasivecode Logo" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/VtgA6MATqF0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast086/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast086/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/ODkcKJQInog/ideveloper086.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloper086.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Concurrent Debug, Beta and App Store Builds</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/_3ruNtRQhjA/</link>
		<comments>http://blog.ideveloper.tv/concurrent-debug-beta-and-app-store-builds/#comments</comments>
		<pubDate>Tue, 21 May 2013 08:33:38 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=929</guid>
		<description><![CDATA[While following Hockey App&#8217;s advice on multiple builds Simon Wolf found it all a little confusing so clarified things for himself and the rest of us by writing an excellent article about it.]]></description>
				<content:encoded><![CDATA[<p>While following <a title="Hockey App" href="http://hockeyapp.net/">Hockey App&#8217;s</a> advice on multiple builds <a href="http://twitter.com/sgaw">Simon Wolf</a> found it all a little confusing so clarified things for himself and the rest of us by writing an <a href="http://swwritings.com/post/2013-05-20-concurrent-debug-beta-app-store-builds">excellent article</a> about it.</p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/_3ruNtRQhjA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/concurrent-debug-beta-and-app-store-builds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/concurrent-debug-beta-and-app-store-builds/</feedburner:origLink></item>
		<item>
		<title>How to Know When Apple Finally Gets iCloud Right</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/Y3IIe0z0fPI/</link>
		<comments>http://blog.ideveloper.tv/how-to-know-when-apple-finally-gets-icloud-right/#comments</comments>
		<pubDate>Tue, 21 May 2013 08:31:03 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=928</guid>
		<description><![CDATA[Gus Mueller of Flying Meat Software has published a great article on what he believes Apple need to do to iCloud before developers can trust it.]]></description>
				<content:encoded><![CDATA[<p><a href="http://twitter.com/ccgus">Gus Mueller</a> of <a title="Flying Meat Software" href="http://flyingmeat.com/">Flying Meat Software</a> has published a <a title="Gus Muller Article" href="http://shapeof.com/archives/2013/5/how_to_know_when_apple_finally_gets_icloud_right.html">great article</a> on what he believes Apple need to do to iCloud before developers can trust it.</p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/Y3IIe0z0fPI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/how-to-know-when-apple-finally-gets-icloud-right/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/how-to-know-when-apple-finally-gets-icloud-right/</feedburner:origLink></item>
		<item>
		<title>Core Data Libraries and Utilities</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/6eppsWIWYkM/</link>
		<comments>http://blog.ideveloper.tv/core-data-libraries-and-utilities/#comments</comments>
		<pubDate>Tue, 21 May 2013 08:28:05 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=927</guid>
		<description><![CDATA[Matt Thompson at NSHipster has released a blog post looking at libraries that enhance and improve Core Data.  If you are looking for a little extra umph! for your Core Data apps then take a read.]]></description>
				<content:encoded><![CDATA[<p><a title="Matt Thompson" href="http://mattt.me/">Matt Thompson</a> at NSHipster has released a <a title="Core Data Article" href="http://nshipster.com/core-data-libraries-and-utilities/">blog post</a> looking at libraries that enhance and improve Core Data.  If you are looking for a little extra umph! for your Core Data apps then take a read.</p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/6eppsWIWYkM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/core-data-libraries-and-utilities/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/core-data-libraries-and-utilities/</feedburner:origLink></item>
		<item>
		<title>Full Text Search – Using SQLite along side Core Data</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/bRIe84sxJXs/</link>
		<comments>http://blog.ideveloper.tv/full-text-search-using-sqlite-along-side-core-data/#comments</comments>
		<pubDate>Mon, 06 May 2013 16:33:25 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=902</guid>
		<description><![CDATA[Simon Wolf has written some excellent articles on his blog expanding on the blitz talk he gave at NSConference on how to implement fast full text searching in your application by using SQLite alongside Core Data. 1. Searching For Speedy Searching 2. Testing For FTS in SQLite 3. Diacritics and FTS]]></description>
				<content:encoded><![CDATA[<p>Simon Wolf has written some excellent articles on his <a title="Simon Wolfs Blog" href="http://swwritings.com/">blog </a>expanding on the blitz talk he gave at <a title="NSConference" href="http://nsconference.com">NSConference</a> on how to implement fast full text searching in your application by using SQLite alongside Core Data.</p>
<p>1. <a title="Searching For Speedy Searching" href="http://swwritings.com/post/2013-04-30-searching-for-speedy-searching">Searching For Speedy Searching</a></p>
<p>2. <a title="Testing For FTS in SQLite" href="http://swwritings.com/post/2013-05-04-testing-for-fts-in-sqlite">Testing For FTS in SQLite</a></p>
<p>3. <a title="Diacritics and FTS" href="http://swwritings.com/post/2013-05-04-diacritics-and-fts">Diacritics and FTS</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/bRIe84sxJXs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/full-text-search-using-sqlite-along-side-core-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/full-text-search-using-sqlite-along-side-core-data/</feedburner:origLink></item>
		<item>
		<title>A New Home Called Software Indie</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/G0EAu3DpUdY/</link>
		<comments>http://blog.ideveloper.tv/a-new-home-called-software-indie/#comments</comments>
		<pubDate>Mon, 29 Apr 2013 22:49:24 +0000</pubDate>
		<dc:creator>ideveloper</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=900</guid>
		<description><![CDATA[On the podcast for the last few months we have been talking about focussing more on business and less on tech. On the whole the response to this has been really positive, however there have also been a significant number of people pleading for things to remain as they are. After thinking this through I [...]]]></description>
				<content:encoded><![CDATA[<p>On the podcast for the last few months we have been talking about focussing more on business and less on tech. On the whole the response to this has been really positive, however there have also been a significant number of people pleading for things to remain as they are.</p>
<p>After thinking this through I have decided to move the business stuff out into it&#8217;s own podcast and leave the iDeveloper Podcast as it is.</p>
<p>However as I am now producing two podcasts and my current passion is to see indie&#8217;s become better business owners I am making it known that the iDeveloper Podcast will, at least for the time being, be operating on an intermittent schedule rather than it&#8217;s current weekly(ish) one.</p>
<p>Doing things this way will allow me to still look at things outside of business that interest me or are currently causing a stir without upsetting the people looking for business stuff. As we say about software so often it&#8217;s about doing one thing and doing it well.</p>
<p>So my new <a title="Software Indie " href="http://softwareindie.com">Software Indie</a> Blog and Podcast will cover business, marketing and productivity while the iDeveloper Podcast will cover technology. Please head over the <a title="Software Indie " href="http://softwareindie.com">http://softwareindie.com</a> and check the new stuff out as it begins to develop.</p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/G0EAu3DpUdY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/a-new-home-called-software-indie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/a-new-home-called-software-indie/</feedburner:origLink></item>
		<item>
		<title>Podcast 85 – Mac Software Business Year One + 5</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/bgP6vj76Axc/</link>
		<comments>http://blog.ideveloper.tv/podcast85/#comments</comments>
		<pubDate>Mon, 29 Apr 2013 19:41:52 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=896</guid>
		<description><![CDATA[This week John is given a reprieve as the old gang from the Mac Software Business Year One podcast get back together for a reunion 5 years after their original first episode. Links Mercury Mover Highbrow Grocery List Voodoo Pad Acorn Moneywell NSConference TrackTime Guest Details Keith Aperin from Heliumfoot Software, Twitter: @kalperin, App.Net: kalperin [...]]]></description>
				<content:encoded><![CDATA[<p>This week John is given a reprieve as the old gang from the Mac Software Business Year One podcast get back together for a reunion 5 years after their original first episode.</p>
<p><span id="more-896"></span></p>
<h2>Links</h2>
<ul>
<li><a href="http://www.heliumfoot.com/mercurymover/">Mercury Mover</a></li>
<li><a href="http://www.heliumfoot.com/highbrow">Highbrow</a></li>
<li><a href="http://www.heliumfoot.com/grocerylist">Grocery List</a></li>
<li><a href="http://flyingmeat.com/voodoopad/">Voodoo Pad</a></li>
<li><a href="http://www.flyingmeat.com/acorn/">Acorn</a></li>
<li><a href="http://nothirst.com/moneywell/">Moneywell</a></li>
<li><a href="http://nsconference.com">NSConference</a></li>
<li><a href="http://gettracktime.com">TrackTime</a></li>
</ul>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Keith Aperin from <a title="Heliumfoot Software" href="http://helliumfoot.com">Heliumfoot Software</a>, Twitter: <a href="http://twitter.com/kalperin">@kalperin</a>, App.Net: <a href="http://alpha.app.net/kalperin">kalperin</a></li>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>,  Blog: <a href="http://wafflewithmeaning.com/" title="Waffle With Meaning">Waffle With Meaning</a> Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>Gus Mueller from <a title="Flying Meat Software" href="http://flyingmeat.com">Flying Meat Software</a>, Blog: <a href="http://shapeof.com/" title="The Shape of Everything">The Shape of Everything</a>  Twitter: <a href="http://twitter.com/ccgus">@ccgus</a>, App.Net: <a href="http://alpha.app.net/ccgus">ccgus</a></li>
<li>Kevin Hoctor from <a title="NoThirst Software" href="http://nothirst.com">Nothirst Software</a>, Blog: <a href="http://kevinhoctor.blogspot.co.uk/" title="Entrepreneurial Seduction">Entrepreneurial Seduction</a> Twitter: <a href="http://twitter.com/kevinhoctor">@kevinhoctor</a>, App.Net: <a href="http://alpha.app.net/kevinhoctor">KevinHoctor</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloper85.m4a">here</a><br />
Or <a href="http://itunes.apple.com/gb/podcast/ideveloper-live/id400664935">Subscribe</a> in iTunes.</p>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p>Use Coupon Code  <strong>IDEVTV-2013</strong> to get $200 off.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" alt="Invasivecode Logo" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/bgP6vj76Axc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast85/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast85/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/p08Hkg6QLpo/ideveloper85.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloper85.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 84 – I Wanted To Develop An Educational Game</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/jtatVJtw2qc/</link>
		<comments>http://blog.ideveloper.tv/podcast84/#comments</comments>
		<pubDate>Tue, 23 Apr 2013 18:37:06 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=894</guid>
		<description><![CDATA[Scotty and John chat with Matteo Manferdini about his experience being part of a team developing an educational game. Links Lemure Chemistry Pure Creek Software Guest Details Matteo Manferdini from Pure Creek, Twitter: @matmanferdini Scotty from iDeveloper Podcast, Twitter: @macdevnet, App.Net: Scotty John Fox from iDeveloper Podcast, Twitter: @djembe, App.Net: @djembe Please follow our guests [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty and John chat with Matteo Manferdini about his experience being part of a team developing an educational game.<br />
<span id="more-894"></span></p>
<h2>Links</h2>
<ul>
<li><a href="http://le.mu.rs/">Lemure Chemistry</a></li>
<li><a href="http://purecreek.com/">Pure Creek Software</a></li>
</ul>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Matteo Manferdini from <a title="Pure Creek" href="http://purecreek.com/">Pure Creek</a>, Twitter: <a href="http://twitter.com/matmanferdini">@matmanferdini</a></li>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="iDeveloper Live" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">@djembe</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloper084.m4a">here</a><br />
Or <a href="http://itunes.apple.com/gb/podcast/ideveloper-live/id400664935">Subscribe</a> in iTunes.</p>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p>Use Coupon Code  <strong>IDEVTV-2013</strong> to get $200 off.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" alt="Invasivecode Logo" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/jtatVJtw2qc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast84/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast84/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/TYQemcFs3KY/ideveloper084.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloper084.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 83 – WWDC, Jury and The Future</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/b0-yqKQwn_0/</link>
		<comments>http://blog.ideveloper.tv/podcast83/#comments</comments>
		<pubDate>Thu, 04 Apr 2013 17:29:14 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=891</guid>
		<description><![CDATA[Scotty and John discuss WWDC, Michael Jurewitz&#8217;s rapid release of blog posts before returning to Apple and a new direction for the iDeveloper Podcast. Links Invasive Code Coupon Code :  IDEVTV-2013 App Store Pricing &#8211; Part 1 App Store Pricing &#8211; Part 2 App Store Pricing &#8211; Part 3 App Store Pricing &#8211; Part 4 [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty and John discuss WWDC, Michael Jurewitz&#8217;s rapid release of blog posts before returning to Apple and a new direction for the iDeveloper Podcast.<br />
<span id="more-891"></span></p>
<h2>Links</h2>
<ul>
<li>Invasive Code Coupon Code : <strong> IDEVTV-2013</strong></li>
<li><a href="http://jury.me/blog/2013/3/31/understanding-app-store-pricing-part-1">App Store Pricing &#8211; Part 1</a></li>
<li><a href="http://jury.me/blog/2013/3/31/understanding-app-store-pricing-part-2">App Store Pricing &#8211; Part 2</a></li>
<li><a href="http://jury.me/blog/2013/3/31/understanding-app-store-pricing-part-3">App Store Pricing &#8211; Part 3</a></li>
<li><a href="http://jury.me/blog/2013/3/31/understanding-app-store-pricing-part-4">App Store Pricing &#8211; Part 4</a></li>
<li><a href="http://jury.me/blog/2013/3/31/understanding-app-store-pricing-part-5">App Store Pricing &#8211; Part 5</a></li>
<li><a href="http://www.hyperink.com/Sell-More-Software-Website-Conversion-Optimization-For-Software-Developers-b9B393B465B">Sell More Software E-Book</a></li>
</ul>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="iDeveloper Live" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">@djembe</a><a href="http://alpha.app.net/casademora">demora</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloperlive083.m4a">here</a><br />
Or <a href="http://itunes.apple.com/gb/podcast/ideveloper-live/id400664935">Subscribe</a> in iTunes.</p>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p>Use Coupon Code  <strong>IDEVTV-2013</strong> to get $200 off.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" alt="Invasivecode Logo" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/b0-yqKQwn_0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast83/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast83/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/QQIU67w8tvM/ideveloperlive083.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloperlive083.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 82 – NSConference Review</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/BtROgj1_7Pw/</link>
		<comments>http://blog.ideveloper.tv/podcast82/#comments</comments>
		<pubDate>Wed, 20 Mar 2013 15:00:16 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=890</guid>
		<description><![CDATA[Scotty and John review NSConference Links Invasive Code Coupon Code :  IDEVTV-2013 NSConference Guest Details Scotty from iDeveloper Podcast, Twitter: @macdevnet, App.Net: Scotty John Fox from iDeveloper Podcast, Twitter: @djembe, App.Net: @djembedemora Please follow our guests on twitter / App.net and show them some developer love. Audio can be downloaded here Or Subscribe in iTunes. [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty and John review NSConference<br />
<span id="more-890"></span></p>
<h2>Links</h2>
<ul>
<li>Invasive Code Coupon Code : <strong> IDEVTV-2013</strong></li>
<li><a href="http://nsconference.com">NSConference</a></li>
</ul>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="iDeveloper Live" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">@djembe</a><a href="http://alpha.app.net/casademora">demora</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloperlive082.m4a">here</a><br />
Or <a href="http://itunes.apple.com/gb/podcast/ideveloper-live/id400664935">Subscribe</a> in iTunes.</p>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p>Use Coupon Code  <strong>IDEVTV-2013</strong> to get $200 off.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" alt="Invasivecode Logo" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/BtROgj1_7Pw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast82/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast82/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/CAwBz6tYh3M/ideveloperlive082.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloperlive082.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 81 – What is an Indie?</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/BWQLHwzjKrE/</link>
		<comments>http://blog.ideveloper.tv/podcast81/#comments</comments>
		<pubDate>Thu, 28 Feb 2013 11:14:26 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=886</guid>
		<description><![CDATA[After upsetting many people the week before Scotty explains to John why he beleives we need to re-focus our view of what it means to be indie. Links Invasive Code Coupon Code :  IDEVTV-2013 Johns Appsterdam Talk &#8211; Alternative Paths to Living The Indie Dream Guest Details Scotty from iDeveloper Podcast, Twitter: @macdevnet, App.Net: Scotty [...]]]></description>
				<content:encoded><![CDATA[<p>After upsetting many people the week before Scotty explains to John why he beleives we need to re-focus our view of what it means to be indie.<br />
<span id="more-886"></span></p>
<h2>Links</h2>
<ul>
<li>Invasive Code Coupon Code : <strong> IDEVTV-2013</strong></li>
<li>Johns Appsterdam Talk &#8211; <a href="http://www.youtube.com/watch?v=n1-OKPmQyh4">Alternative Paths to Living The Indie Dream</a></li>
</ul>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="iDeveloper Live" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">@djembe</a><a href="http://alpha.app.net/casademora">demora</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloperlive081.m4a">here</a><br />
Or <a href="http://itunes.apple.com/gb/podcast/ideveloper-live/id400664935">Subscribe</a> in iTunes.</p>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p>Use Coupon Code  <strong>IDEVTV-2013</strong> to get $200 off.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" alt="Invasivecode Logo" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/BWQLHwzjKrE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast81/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/lzk14ArUvZk/ideveloperlive081.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloperlive081.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 80 – Selling Isn’t Sleazy</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/ZGErRvUjOKw/</link>
		<comments>http://blog.ideveloper.tv/podcast80/#comments</comments>
		<pubDate>Wed, 20 Feb 2013 16:00:20 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=883</guid>
		<description><![CDATA[Scotty , John and Saul Mora follow up on last weeks podcast by discussing &#8221;Is Selling Sleazy?&#8221; Links Startups For The Rest Of Us Podcast MicroConf Conference MicroConf 2012 Videos KickOffApp Invasive Code Coupon Code :  IDEVTV-2013 Guest Details Scotty from iDeveloper Podcast, Twitter: @macdevnet, App.Net: Scotty John Fox from iDeveloper Podcast, Twitter: @djembe, App.Net: @djembe Saul [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty , John and Saul Mora follow up on last weeks podcast by discussing &#8221;Is Selling Sleazy?&#8221;<br />
<span id="more-883"></span></p>
<h2>Links</h2>
<ul>
<li><a title="Startups For The Rest Of Us Podcast" href="http://www.startupsfortherestofus.com/">Startups For The Rest Of Us Podcast</a></li>
<li><a href="http://www.microconf.com/">MicroConf Conference</a></li>
<li><a href="http://www.microconf.com/videos-2012.html">MicroConf 2012 Videos</a></li>
<li><a href="http://kickoffapp.com/">KickOffApp</a></li>
<li>Invasive Code Coupon Code :  IDEVTV-2013</li>
</ul>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="iDeveloper Live" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">@djembe</a></li>
<li>Saul Mora from <a href="http://nsbrief.com/">NSBrief Podcast</a>,  Twitter: <a href="http://twitter.com/casademora">@casademora</a>, App.Net: <a href="http://alpha.app.net/casademora">@casademora</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloperlive080.m4a">here</a><br />
Or <a href="http://itunes.apple.com/gb/podcast/ideveloper-live/id400664935">Subscribe</a> in iTunes.</p>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p>Use Coupon Code  <strong>IDEVTV-2013</strong> to get $200 off.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" alt="Invasivecode Logo" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/ZGErRvUjOKw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast80/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast80/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/GJmgEG2zeY8/ideveloperlive080.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloperlive080.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 79 – Stop Listening</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/s3NYBATHy7w/</link>
		<comments>http://blog.ideveloper.tv/podcast79/#comments</comments>
		<pubDate>Tue, 12 Feb 2013 16:00:54 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=882</guid>
		<description><![CDATA[Scotty , John and Simon Wolf discuss how indie developers should stop spending so much time working on code and start focusing on their business skills. Links Startups For The Rest Of Us Podcast Guest Details Scotty from iDeveloper Podcast, Twitter: @macdevnet, App.Net: Scotty John Fox from iDeveloper Podcast, Twitter: @djembe, App.Net: @djembe Simon Wolf [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty , John and Simon Wolf discuss how indie developers should stop spending so much time working on code and start focusing on their business skills.<br />
<span id="more-882"></span></p>
<h2>Links</h2>
<ul>
<li><a title="Startups For The Rest Of Us Podcast" href="http://www.startupsfortherestofus.com/">Startups For The Rest Of Us Podcast</a></li>
</ul>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="iDeveloper Live" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">@djembe</a></li>
<li>Simon Wolf from <a href="http://www.ottersoftware.com/">Otter Software</a>, Blog: <a href="http://swwritings.com/">Simon Wolfs Writings</a> Twitter: <a href="http://twitter.com/sgaw">@sgaw</a>, App.Net: <a href="http://alpha.app.net/sw">@sw</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloperlive079.m4a">here</a><br />
Or <a href="http://itunes.apple.com/gb/podcast/ideveloper-live/id400664935">Subscribe</a> in iTunes.</p>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" alt="Invasivecode Logo" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/s3NYBATHy7w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast79/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast79/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/bTJoTe0yk8I/ideveloperlive079.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloperlive079.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 78 – Your Software Is Not The Centre of The Universe</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/blrV1s37B80/</link>
		<comments>http://blog.ideveloper.tv/podcast78/#comments</comments>
		<pubDate>Wed, 06 Feb 2013 15:40:35 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=876</guid>
		<description><![CDATA[Scotty and John talk with developer old timer Georg Tuparev to talk about think about our software in a far more joined up way. Links Plants Guest Details Scotty from iDeveloper Podcast, Twitter: @macdevnet, App.Net: Scotty John Fox from iDeveloper Podcast, Twitter: @djembe, App.Net: @djembe Georg Tuparev from Tuparev Technologies, Twitter: @tuparev, App.Net: @tuparev Please [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty and John talk with developer old timer Georg Tuparev to talk about think about our software in a far more joined up way.<br />
<span id="more-876"></span></p>
<h2>Links</h2>
<ul>
<li><a title="Plants in the App Store" href="https://itunes.apple.com/gb/app/plants/id323980051?mt=8">Plants</a></li>
</ul>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="iDeveloper Live" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">@djembe</a></li>
<li>Georg Tuparev from <a title="Tuparev Technologies" href="http://tuparev.com/">Tuparev Technologies</a>, Twitter: <a href="https://twitter.com/tuparev">@tuparev</a>, App.Net: <a href="https://alpha.app.net/tuparev">@tuparev</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloperlive078.m4a">here</a><br />
Or <a href="http://itunes.apple.com/gb/podcast/ideveloper-live/id400664935">Subscribe</a> in iTunes.</p>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" alt="Invasivecode Logo" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/blrV1s37B80" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast78/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast78/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/0w_OmoNRDsE/ideveloperlive078.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloperlive078.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>NSProxy Demystified</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/i1bEwY7BtLE/</link>
		<comments>http://blog.ideveloper.tv/nsproxy-demystified/#comments</comments>
		<pubDate>Wed, 30 Jan 2013 09:36:18 +0000</pubDate>
		<dc:creator>Saul Mora</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[NSProxy]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=869</guid>
		<description><![CDATA[NSProxy is most likely one of the least understood classes in the Cocoa framework. In order to understand the intended uses for this class, we must first take a step back and examine the objective c language. By looking at how messages are passed between objects, we can examine how a proxy can help in [...]]]></description>
				<content:encoded><![CDATA[<p>NSProxy is most likely one of the least understood classes in the Cocoa framework. In order to understand the intended uses for this class, we must first take a step back and examine the objective c language. By looking at how messages are passed between objects, we can examine how a proxy can help in certain scenarios. Hopefully, by the end of this article, you&#8217;ll have a better understanding of NSProxy, and perhaps can find ways to use NSProxy and add another tool in your developer tool belt.<br />
<span id="more-869"></span></p>
<h2>The Proxy Pattern</h2>
<p>While the proxy pattern may have been around for quite a number of years, the most influential formal definition of the proxy pattern is in the classic book &#8220;<a href="http://en.wikipedia.org/wiki/Design_Patterns" rel="nofollow">Design Patterns</a>&#8221; by the Gang of Four, Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. The <a href="http://en.wikipedia.org/wiki/Proxy_pattern" rel="nofollow">Proxy pattern</a> is a simple pattern that defines an object that stands in for another object. But behind this simple concept lie some interesting tricks. Looking through the other patterns, we also notice that the proxy pattern is key for implementing a <a href="http://en.wikipedia.org/wiki/Flyweight_pattern" rel="nofollow">flyweight pattern</a>.</p>
<p>I sometimes think of proxy objects as a middle object between the source and destination objects. Indeed, when you extend this thought to everyday (for developers like us) concepts such as a Proxy Server for your Web Browser, you are telling Safari that there is a server on your local network that is allowed to send and receive requests to the wider Internet on your behalf. Indeed the network proxy server is very analogous to a proxy object in a language rooted in the concept of message passing. When you send a message to another object, this is like sending a network request to a site on the Internet. And, just like the network proxy, your proxy object can intercept the request, translate it, alter it, or simply deny the request altogether. Proxy objects can keep your app running, and not crashing, when the intended receiver either doesn&#8217;t exist, or is separated from your app&#8217;s process space by time or distance. That is, proxies are useful for sending delayed requests to other objects either in the same process, or in other processes and memory spaces. The way Objective C plays into this role is due to its nature as a message passing language.</p>
<h2>Message Passing</h2>
<p>One of the key differences between Objective-C and its subset counterpart, C is the fundamental method of calling functions or methods. At first glance, there seems to be no difference other than syntax. Indeed, it&#8217;s actually a good thing that this difference is subtle. This familiarity allows new developers to easily catch on to the mechanics of the language and get to writing apps. But the fundamental difference between message passing and method or function calling is quite important, and vital to our understanding of why NSProxy exists, and how it works.</p>
<p>When you call a function in a language like C or C++, the function call goes onto the call stack. When you call a method, or rather, send a message to an object in Objective-C, the message gets interpreted by a series of methods to determine how the message should be handled. This is where the difference between static and dynamic languages lie.</p>
<p>Normally in Objective-C, when a message is passed, the message leads to a method call on the object that received the message. This is the most common case in everyday coding. It&#8217;s easy to see why message passing seems the same as function or method calling. However, since the object is receiving a message, the object to which the message is sent has the opportunity to figure out what it really wants to do with the message. It can interpret the message, forward it, or simply drop the message.</p>
<p>The NSObject protocol defines some methods that allow the object to handle the message how it chooses. This ability to handle the message is why message passing is not the same as method or function calling. An excellent and detailed explanation of how an object resolves messages is on this <a href="http://stackoverflow.com/a/4574563/5619" rel="nofollow">Stack Overflow question</a>.</p>
<p>One caveat to message forwarding is that methods that have variable arguments are not forwarded. That means methods such as <strong>stringWithFormat:</strong> on NSString cannot be forwarded. (See comment in Apple Code Sample <a href="https://developer.apple.com/library/mac/samplecode/ForwardInvocation/Listings/main_m.html#//apple_ref/doc/uid/DTS40008833-main_m-DontLinkElementID_4" rel="nofollow">ForwardInvocation</a>)</p>
<h2>NSDistantObject</h2>
<p>Before we get into explaining NSProxy itself, it is useful to explain an example implementation in the Cocoa Framework.</p>
<p>The <a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DistrObjects/DistrObjects.html#//apple_ref/doc/uid/10000102-SW1" rel="nofollow">Cocoa Distributed Object Programming Guide</a> introduces the mechanism for connecting separate processes via a series of objects forming a communication pipeline to a separate (eg. server) process. Indeed, if you take a look at these objects, the nomenclature seems similar to that of a network with terms like &#8216;connection&#8217; and &#8216;port&#8217; right in the class names.</p>
<p><img title="" alt="Cocoa Distributed Objects Architecture" src="https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/DistrObjects/Concepts/Art/messageflow.gif" /></p>
<p><a href="https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDistantObject_Class/Reference/Reference.html#//apple_ref/doc/uid/20000411" rel="nofollow">NSDistantObject</a> is a concrete implementation of NSProxy that defines proxies for objects in other applications or threads. The default implementation of NSDistantObject is to forward any messages passed to it on to an object at the other end of the <a href="https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSConnection_Class/Reference/Reference.html#//apple_ref/doc/uid/20000410" rel="nofollow">NSConnection</a>. NSDistantObject also defines the method <strong>setProtocolForProxy:</strong> that establishes the set of methods the remote object implements. This is primarily for optimization as you can still pass messages not in the protocol, but there will be some communication involved to determine if the remote object does indeed respond to that message.</p>
<p><a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSProtocolChecker_Class/Reference/Reference.html#//apple_ref/doc/uid/20000422">NSProtocolChecker</a> is another concrete subclass of NSProxy that also accepts any message from other objects. However, as the name implies, NSProtocolChecker will only accept messages that are part of a given protocol.</p>
<p>NSDistantObject is an example of a message proxy in that it doesn&#8217;t implement any methods itself save for those that create and establish the proxy connection. NSDistantObject can handle any message that is passed to it. The effect is that an instance of NSDistantObject looks and acts just like the remote object. If the remote object ever became local, the caller would likely not know the difference at runtime.</p>
<p>There are several other objects in the collection of objects that support Cocoa distributed object architecture. I won&#8217;t spoil the fun here, but I do recommend reading the <a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DistrObjects/DistrObjects.html#//apple_ref/doc/uid/10000102-SW1" rel="nofollow">Cocoa Distributed Object Programming Guide</a> for more information.</p>
<h2>NSProxy</h2>
<p><a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSProxy_Class/Reference/Reference.html" rel="nofollow">NSProxy</a> is a special class since it lives next to another popular object, NSObject. Like NSObject, NSProxy is a root level object, meaning that it has no parents. But while NSProxy does not extend from NSObject, it does implement the <a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intf/NSObject" rel="nofollow">NSObject protocol</a>. This may be perplexing until you remember what we&#8217;ve just learned about NSDistantObject. NSDistantObject is an object that accepts messages on behalf of another, remote object. (Remote or distant in these terms means an object that is separate from your app by time or distance.) Thus, NSProxy is intended to be a class that gives you the absolute minimum functionality in order to accept any Objective-C message on behalf of another object.</p>
<p>One of the other peculiarities of NSProxy is that it does not have an <strong>init</strong> method. That means, when you&#8217;re implementing a subclass, you don&#8217;t have to implement the standard Objective C initialization code pattern:</p><pre class="crayon-plain-tag">- (id)init
{
self = [super init];
if (self)
{
//do init stuff here
}
return self;
}</pre><p>This reveals that NSProxy is a lighter-weight version of NSObject. As there is nothing to initialize in the base class, it implies that you get a collection of methods at your disposal that help your object implement the NSObject protocol, and nothing else. This means you don&#8217;t get default methods for Objective-C message handling.</p>
<p>As Objective-C developers, there is no doubt you&#8217;ve run across the following error message when debugging your app:</p><pre class="crayon-plain-tag">Object does not implement selector: [MyObject someNonExistantMethod]</pre><p>This error occurs because the default behavior of NSObject is such that when it is passed a message that is not a method, this exception is thrown, and your app crashes.</p>
<p><strong>(What happens when we send an unimplemented method to an NSProxy subclass without any message handling methods?).</strong></p>
<h2>Using NSProxy</h2>
<p>It&#8217;s important to keep in mind when you decide to use NSProxy, the class that inherits from NSProxy should accept any and all messages, especially messages that don&#8217;t directly correlate to a method in your subclass. Any dropped messages should be due to your own internal message handling logic. With that in mind, let&#8217;s take a quick look at creating a class that simply accepts messages, and logs them to the console.</p>
<p><strong>(Example NSProxy subclass)</strong></p><pre class="crayon-plain-tag">// MesageInterceptor.h
@interface MessageInterceptor : NSProxy

@property (nonatomic, readonly) NSArray *interceptedMessages;

@end

// MessageInterceptor.m
@interface MessageInterceptor ()

@property (nonatomic, readonly) NSMutableArray *interceptedMessageStrings;

@end

@implementation MessageInterceptor

- (id) init
{
//no need for [super init], it does not exist
if (self)
{
_interceptedMessageStrings = [NSMutableArray array];
}
return self;
}

- (void) forwardInvocation:(NSInvocation *)invocation;
{
NSString *message = NSStringFromSelector([invocation selector]);
[self.interceptedMessageStrings addObject:message];

[invocation invokeWithTarget:nil];
}

@end</pre><p></p>
<h2>When to use NSProxy?</h2>
<p>Chances are, you&#8217;ll use NSProxy very little as its uses are limited and very specialized. But I&#8217;ve scoured the Internet for a couple of examples to share, as well as come up with one I&#8217;ve found useful myself.</p>
<h3>Mock Object Libraries</h3>
<p>When writing unit tests for your apps, you&#8217;ve no doubt run across the need for a mock object. Mock Objects are object stand-ins that respond to messages of real objects in your app. Mock objects are useful because they look and act like a real implementation save for the fact that any complex setup or external dependency (like network or database connections) doesn&#8217;t exist in a mock object.</p>
<p>If you&#8217;ve unit tested code in Cocoa and Objective-C, you&#8217;ve no doubt used <a href="http://ocmock.org" rel="nofollow">OCMock</a>. OCMock is a useful set of objects and routines that let you mock your objects as previously explained. Another mock object library for Objective C testing is <a href="https://github.com/jonreid/OCMockito" rel="nofollow">OCMockito</a> by Jon Reid (<a href="http://twitter.com/qcoding" rel="nofollow">@qcoding</a>) of <a href="http://qualitycoding.org" rel="nofollow">QualityCoding.com</a>.</p>
<p>Have a look at the <a href="https://github.com/erikdoe/ocmock/blob/master/Source/OCMock/OCMockObject.m" rel="nofollow">OCMockObject.m</a> file in the OCMock project, or the <a href="https://github.com/jonreid/OCMockito/blob/master/Source/OCMockito/MKTBaseMockObject.m" rel="nofollow">MKTBaseMockObject.m</a> file for examples on how mock objects work using NSProxy.</p>
<h3>Delegate manager</h3>
<p>In researching example uses of NSProxy, I came across the <a href="http://borkware.com/rants/agentm/elegant-delegation/" rel="nofollow">MDelegateManger</a> by <a href="http://borkware.com" rel="nofollow">@borkware</a>. The delegate manager solves a simple set of problems when implementing the delegate pattern in your own code.</p>
<p>When implementing your own delegates, you have to verify that an object responds to the delegate message every time a delegate message is passed to a delegate. Often times during development you&#8217;ll forget this check. In many cases it just seems like boilerplate, repeated code and should be extracted elsewhere. By adding a proxy between the source object and the delegate, you can extract the boilerplate code, and treat your delegate like any other local object. There are also other nice things you can add such as logging when an object doesn&#8217;t implement a delegate method, or even that the delegate has not been set in the first place! Since you have a proxy object that is always present, when the delegate is not, you can have something to check that there is an object to which to send messages.</p>
<h2>Conclusion</h2>
<p>While the NSProxy class has some rather handy features such as being its own root level class, your use of NSProxy will likely be minimal, if ever. The need for a proxy object in your apps probably doesn&#8217;t arise often. The delegate manager and mock object libraries are great predefined uses of NSProxy. However, it&#8217;s worth noting that if you think you ever need an object to stand in, and accept messages on behalf of another object, then NSProxy is still a great tool to keep in your developer toolbox.</p>
<h2>About the Author:</h2>
<div class="aboutTheAuthor"><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2013/01/Saul_Mora.jpg"><br />
<img class="authorImage" title="Saul Mora" alt="Photo of Saul Mora" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2013/01/Saul_Mora.jpg" width="128" height="128" /><br />
</a></p>
<h2 class="authorName">Saul Mora</h2>
<p>A software journeyman, Saul thrives on creating well crafted code on his continuous quest to become a Master Developer. Saul is an active member of the Cocoa developer community and contributes by blogging, producing <a href="http://nsbrief.com/" rel="nofollow">NSBrief</a>, a Cocoa developer podcast, contributing to open source projects, and helping to teach others about the wonders and methods of developing applications. Saul’s software development business, <a href="http://magicalpanda.com/" rel="nofollow">Magical Panda Software</a>, seeks to create well crafted and productive applications for the Mac and iOS platforms. Saul is also an avid cyclist and has recently relocated to Denver.</p>
<p class="authorContact">Twitter: <a title="Saul Mora on twitter" href="http://twitter.com/casedemora" rel="nofollow">@caasedemora</a><br />
App.net: <a title="Saul Mora on app.net" href="https://alpha.app.net/saulmora" rel="nofollow">@saulmora</a><br />
Website: <a title="Magical Panda" href="http://ideveloper.tv" rel="nofollow">iDeveloper.tv</a></p>
</div>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/i1bEwY7BtLE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/nsproxy-demystified/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/nsproxy-demystified/</feedburner:origLink></item>
		<item>
		<title>Podcast 77 – To Re-Write or Not To Re-Write. That is the Question</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/pBWhA11G0PI/</link>
		<comments>http://blog.ideveloper.tv/podcast77/#comments</comments>
		<pubDate>Tue, 29 Jan 2013 16:00:30 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=874</guid>
		<description><![CDATA[Scotty , John , Uli Kusterer and Martin Pilkington discuss if it&#8217;s ever acceptable to totally rewrite a software product for it&#8217;s next release. Recorded on Jan the 8th but wasn&#8217;t edited for a few weeks. Guest Details Scotty from iDeveloper Podcast, Twitter: @macdevnet, App.Net: Scotty John Fox from iDeveloper Podcast, Twitter: @djembe, App.Net: @djembe [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty , John , Uli Kusterer and Martin Pilkington discuss if it&#8217;s ever acceptable to totally rewrite a software product for it&#8217;s next release.<br/><br />
           Recorded on Jan the 8th but wasn&#8217;t edited for a few weeks.</p>
<p><span id="more-874"></span></p>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="iDeveloper Live" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">@djembe</a></li>
<li>Uli Kusterer. Website: <a title="Zathras" href="http://zathras.de/angelweb/home.htm">Zathras</a>, Twitter: <a href="https://twitter.com/uliwitness">@uliwitness</a>, App.Net: <a href="https://alpha.app.net/uliwitness">@uliwitness</a></li>
<li>Martin Pilkington from <a title="MCubed Software" href="http://www.mcubedsw.com/">MCubed Software</a>, Twitter: <a href="http://twitter.com/pilky">@pilky</a>, App.Net: <a href="http://alpha.app.net/pilky">@pilky</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloperlive077.m4a">here</a><br />
Or <a href="http://itunes.apple.com/gb/podcast/ideveloper-live/id400664935">Subscribe</a> in iTunes.</p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/pBWhA11G0PI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast77/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast77/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/klBixC3-j_Y/ideveloperlive077.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloperlive077.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>NSConf 5 tickets are now on sale…</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/r7VqOJSDE3Y/</link>
		<comments>http://blog.ideveloper.tv/nsconf5tickets/#comments</comments>
		<pubDate>Thu, 03 Jan 2013 15:46:51 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[NSConference]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=868</guid>
		<description><![CDATA[This is the 5th NSConference and we think it’s going to be the biggest and best yet. We’ve got an international set of super speakers lined up, a stunning venue &#038; lots of opportunities to network with peers. By the end of it, we think you’ll feel like you can take on the world. One [...]]]></description>
				<content:encoded><![CDATA[<p>This is the 5th NSConference and we think it’s going to be the biggest and best yet. We’ve got an international set of super speakers lined up, a stunning venue &#038; lots of opportunities to network with peers. By the end of it, we think you’ll feel like you can take on the world. One app at a time.</p>
<p>So get put your cape on, grab a ticket and we’ll see you there.</p>
<p>Visit the <a href="http://nsconference.com" title="NSConference 5 Website">NSConference site</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/r7VqOJSDE3Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/nsconf5tickets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/nsconf5tickets/</feedburner:origLink></item>
		<item>
		<title>Podcast 76 – The Christmas Special</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/ZTRBa5yioIY/</link>
		<comments>http://blog.ideveloper.tv/podcast76/#comments</comments>
		<pubDate>Thu, 20 Dec 2012 01:26:49 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=862</guid>
		<description><![CDATA[Scotty and John close out the podcast year by getting together with 4 other podcasters, Brent Simmons , Saul Mora, Guy English and Manton Reece to chew the fat on all things 2012 and make dodgy predictions for 2013. Guest Details Scotty from iDeveloper Podcast, Twitter: @macdevnet, App.Net: Scotty John Fox from iDeveloper Podcast, Twitter: [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty and John close out the podcast year by getting together with 4 other podcasters, Brent Simmons , Saul Mora, Guy English and Manton Reece to chew the fat on all things 2012 and make dodgy predictions for 2013.</p>
<p><span id="more-862"></span></p>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="iDeveloper Live" href="http://ideveloper.tv/podcast/ideveloperlive.html">iDeveloper Podcast</a>, Twitter: <a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">@djembe</a></li>
<li>Saul Mora from <a title="NSBrief" href="http://nsbrief.com/">NSBrief</a>, Twitter: <a href="http://twitter.com/casademora">@casademora</a>, App.Net: <a href="http://alpha.app.net/casademora">@casademora</a></li>
<li>Brent Simmons from <a title="Identical Cousins" href="http://identicalcousins.net/">Identical Cousins</a>, Twitter: <a href="http://twitter.com/brentsimmons">@brentsimmons</a>, App.Net: <a href="http://alpha.app.net/brentsimmons">@brentsimmons</a></li>
<li>Guy English from <a title="Debug" href="https://itunes.apple.com/gb/podcast/debug/id578812394">DEBUG</a>, Twitter: <a href="http://twitter.com/gte">@gte</a>, App.Net: <a href="http://alpha.app.net/gte">@gte</a></li>
<li>Manton Reece from <a title="Core Intuition" href="http://www.coreint.org/">Core Intuition</a>, App.Net: <a href="http://alpha.app.net/manton">@manton</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloperlive076.m4a">here</a><br />
Or <a href="http://itunes.apple.com/gb/podcast/ideveloper-live/id400664935">Subscribe</a> in iTunes.</p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/ZTRBa5yioIY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast76/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast76/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/DqLqWJQTxXo/ideveloperlive076.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloperlive076.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Introduction To UI State Preservation &amp; Restoration In iOS6</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/Yt_hVoePRLI/</link>
		<comments>http://blog.ideveloper.tv/introduction-to-ui-state-preservation-restoration-in-ios6/#comments</comments>
		<pubDate>Thu, 13 Dec 2012 16:28:58 +0000</pubDate>
		<dc:creator>Matt Tancock</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=856</guid>
		<description><![CDATA[**Update 3 Jan 2013 : There was a bug in the third gist, where I was encoding the whole textview, rather than just the text of the textview. This has now been updated. Thanks to fcy for spotting the bug!** The UI state restoration API was introduced into UIKit in iOS 6. This is Apple&#8217;s [...]]]></description>
				<content:encoded><![CDATA[<p>**Update 3 Jan 2013 : There was a bug in the third gist, where I was encoding the whole textview, rather than just the text of the textview. This has now been updated. Thanks to <a title="fcy on app.net" href="https://alpha.app.net/fcy" rel="nofollow">fcy</a> for spotting the bug!**</p>
<p>The UI state restoration API was introduced into UIKit in iOS 6. This is Apple&#8217;s way of making it easier (and hence encouraging developers) to have applications restored to their previous state, regardless of whether the app was in the background or terminated. Watching the WWDC video (Session 208, 2012) really gives the impression that they would like <strong>all</strong> apps to adhere to this, and therefore users will come to expect this kind of behaviour in apps.</p>
<p>This article will cover an overview of the process and a gentle introduction to the basics; the basics will get you reasonably far, although there is a lot to consider &#8211; the Apple doc for state preservation and restoration approaches 6000 words on the subject. This isn&#8217;t supposed to be a step-by-step tutorial. If people are interested in this topic, and would like more indepth coverage of this, <a href="http://twitter.com/idevelopertv" rel="nofollow">let us know</a> and we&#8217;ll look at making a course on this.<br />
<span id="more-856"></span></p>
<h2>Plan First</h2>
<p>Before you start implementing preservation and restoration in your application, it&#8217;s important to consider how the app works currently; specifically how the different view controllers are created.</p>
<p>The API demonstrates (again) Apple pushing storyboards as <strong><em>the</em></strong> way to implement UI using interface builder. If you&#8217;re using storyboards, a section of work is removed, specifically UIKit can use the storyboard (whose state is preserved by UIKit, when app state is preserved) to find or recreate the view controllers, rather than requiring it to be provided either by the app delegate, or by using the restoration class protocol.</p>
<h2>Don&#8217;t like storyboards?</h2>
<p><em>Aside: We&#8217;ll discuss this in more detail later, but the restoration class is a protocol to enable you to preserve/restore view-controllers which weren&#8217;t created from a storyboard e.g they were loaded programatically or from a NIB in the course of the app&#8217;s execution.</em></p>
<p>You are still able to specify a restoration class for a view controller, even if it was created from a storyboard, the order of priority means that UIKit will search the saved storyboard information last.</p>
<p>Priority of searching for restoration Info:</p>
<ol>
<li>Restoration Class</li>
<li>App Delegate</li>
<li>Existing VC with correct Restoration Path</li>
<li>Saved Storyboard</li>
</ol>
<p>So when you&#8217;ve thought about where your view controllers come from, and therefore the type of preservation/restoration that will be required, you can start implementing it!</p>
<h2>Implementation</h2>
<p>Opening interface builder, the most noticable thing about this addition to iOS is the presence of the Restoration ID field in the Identity Inspector. This field is fairly important: When examining what to restore, the operating system will ignore any control, view etc. which has not been assigned a Restoration ID. This is the first way to indicate what you want to happen when your application is restored. Additionally the parent view controller of any view must have a Restoration ID, or the child object will not be restored (Restoration ID or not!).</p>
<p>This is important, because how you want to implement restoration, and the precise nature of what needs to be restored will determine which views need restoration IDs.</p>
<p>To take a simple example:</p>
<p>A simple, single view app, with a UITextView.</p>
<p><img class="alignnone size-full wp-image-859" title="simpleApp" alt="simple app in interface builder" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/12/simpleApp.png" width="658" height="400" /></p>
<p>The viewcontroller has a restoration ID; the UITextView does not.</p>
<p>First of all, I need to opt into state preservation/restoration, by implementing the following two methods in my AppDelegate</p>
<script src="https://gist.github.com/4276826.js?file=file1.m"></script><noscript><pre><code class="language-objective-c objective-c">-(BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder
{
return YES;
}

-(BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder
{
return YES;
}</code></pre></noscript>
<p>I then need to perform some kind of preservation. Assigning my viewController a restoration ID means it is opted into preservation, but it currently doesn&#8217;t contain any state which requires restoring.</p>
<p>My UITextView potentially does; if you look at the documentation of <a href="http://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextView_Class/Reference/UITextView.html#//apple_ref/doc/uid/TP40006898-CH3-SW24" rel="nofollow">UITextView</a> however,  you&#8217;ll notice that two properties are saveable/restorable &#8211; the range of selected text, and the current editing state of the view. Not the text that is in the process of being entered when the application is terminated.</p>
<p>Preserving and restoring that text is the responsibility of the view controller:</p>
<p>In the viewController I need to implement two methods to preserve and restore any necessary state:</p>
<script src="https://gist.github.com/4276991.js"></script><noscript><pre><code class="language-objective-c objective-c">- (void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
}

- (void)decodeRestorableStateWithCoder:(NSCoder *)coder
{
}</code></pre></noscript>
<p>These methods can be used to encode any necessary state information. Apple is very keen to stress that only information which can&#8217;t be recreated in other ways should be restored e.g. information which is already saved by the app, or is part of the standard setup of a view controller.</p>
<p>Apple&#8217;s documentation on this is quite useful, and I&#8217;m not just going to regurgitate it here &#8211; it&#8217;s worth <a href="http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW165" rel="nofollow">checking out</a>.</p>
<p>For my UITextView, I want to be able to save any text that is in the process of being entered. (Any objects being encoded must adopt NSCoding)</p>
<script src="https://gist.github.com/4276998.js"></script><noscript><pre><code class="language-objective-c objective-c">#define kSomeText @&quot;someText&quot;

[super encodeRestorableStateWithCoder:coder];
[coder encodeObject:self.textView1 forKey:kSomeText];</code></pre></noscript>
<p>The corresponding implementation of <code>decodeRestorableStateWithCode</code> should therfore be fairly obvious:</p>
<script src="https://gist.github.com/4277004.js"></script><noscript><pre><code class="language-objective-c objective-c">[super decodeRestorableStateWithCoder:coder];
[[self tv1] setText:[coder decodeObjectForKey:kSomeText]];</code></pre></noscript>
<p>It&#8217;s worth noting at this point the potential difficulties in establishing if your preservation/restoration is actually working, for a couple of reasons:</p>
<ol>
<li>Sometimes when apps enter the background and are immediately restored, their state is preserved without any of this (subject to memory).</li>
<li>The most obvious way of clearing an app from memory, for testing this, doesn&#8217;t work as you&#8217;d expect:</li>
</ol>
<p>Using the double-tap on the home button, to force quit your app, will not demonstrate your lovely new state preservation code. When an app is forced to quit, any preserved state is deleted. It&#8217;s clear why if you think about it: the current state of the app causes it to lock up. Leaving and returning to the app just restores that state. If force-quitting also restored the state, the app could never return to a usable state without deleting the app (and therefore all user data) and reinstalling.</p>
<p>Apple&#8217;s advice is to either use Xcode to stop the running app, or to programmatically exit your app. So far, in my experience it hasn&#8217;t always been easy to debug these behaviours, and identify exactly what is happening behind the scenes, and real device testing is probably far superior to testing using the simulator.</p>
<p>The final thing I&#8217;m going to briefly look at, is the restoration class. As mentioned earlier, if you&#8217;re using storyboards for all of your view controllers, this may not be necessary (although it adds a lot of power and flexibility). If you&#8217;re not using storyboards, either for all or even part of your app, you&#8217;ll need to get familiar with the restoration class.</p>
<p>My view controller (that isn&#8217;t from a storyboard) needs to adhere to the <code>UIViewControllerRestoration</code> protocol.</p>
<p>It has one required method, which is to return the requested viewController:<br />
<code>+ (UIViewController *) viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder</code>. The viewController also needs to specify it&#8217;s <code>restorationClass</code> (usually itself) and <code>restorationIdentifier</code>.</p>
<p>The restoration class is passed an array giving the full ancestry of viewControllers for the required viewController, and the keyed archive of all saved state for the app.</p>
<p>The simplest example of using a restoration class would just be to restore to the actual viewController itself e.g from a nib file or storyboard, so that the app can be restored in the same state it was left in.</p>
<p>E.g if a viewController is loaded programtically, from a nib file. The restoration class could be just recreating the viewController from the nib, and then returning it.</p>
<p>Apple&#8217;s documentation on the protocol is <a href="http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewControllerRestoration_protocol/Reference/Reference.html#//apple_ref/doc/uid/TP40011990-CH1-DontLinkElementID_1" rel="nofollow">here</a>:</p>
<p>Finally, it&#8217;s worth mentioning, if you need to maintain state where it relates to a data source e.g the selection in a UITableView, tableViews and collectionViews are able to preserve the information as long as the data source implements `UIDataSourceModelAssociation`.<br />
Again, I&#8217;m not going to regurgitate the Docs here, so if this applies to you &#8211; go and <a href="http://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/StatePreservation/StatePreservation.html#//apple_ref/doc/uid/TP40007072-CH11-SW8" rel="nofollow">check them out</a>!</p>
<p>Hopefully this has been a useful overview of the features Apple has added to iOS6 in this area. If you have a large and complex app, you&#8217;re probably not going to be running out to switch wholesale to this new system, but as you start new projects, or even add new features to existing apps, it&#8217;s worth checking out. Don&#8217;t forget to let us know if you&#8217;d be interested in seeing this topic get the full iDTV <a href="http://ideveloper.tv" rel="nofollow">video course treatment</a>.</p>
<h2>About the Author:</h2>
<div class="aboutTheAuthor"><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/me128.jpg"><br />
<img class="authorImage" title="Matt Tancock" alt="Photo of Matt Tancock" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/me128.jpg" width="128" height="128" /><br />
</a></p>
<h2 class="authorName">Matt Tancock</h2>
<p>After spending many years as a teacher and hobby developer Matt has now made his way full time into iOS and OSX development as a researcher and developer for iDeveloper TV.</p>
<p class="authorContact">Twitter: <a title="Matt Tancock on twitter" href="http://twitter.com/mtancock">@mtancock</a><br />
App.net: <a title="Matt Tancock on app.net" href="https://alpha.app.net/mtancock">@mtancock</a><br />
Website: <a title="iDeveloper.tv" href="http://ideveloper.tv">iDeveloper.tv</a></p>
</div>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/Yt_hVoePRLI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/introduction-to-ui-state-preservation-restoration-in-ios6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/introduction-to-ui-state-preservation-restoration-in-ios6/</feedburner:origLink></item>
		<item>
		<title>Podcast 075 – C and Self Publishing</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/hCxSJQNKf8s/</link>
		<comments>http://blog.ideveloper.tv/podcast75/#comments</comments>
		<pubDate>Thu, 13 Dec 2012 14:42:19 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=855</guid>
		<description><![CDATA[Scotty starts of chatting with Bill Dudney about C but it quickly turns into a discussion on self publishing with iBooks Author. Links  All The C You Need Top To Bottom; Bottom To Top (Blog Post) Masters of The Void C Tutorial Guest Details Scotty from iDeveloper TV, Twitter: @macdevnet, App.Net: Scotty Bill Dudney, Twitter: [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty starts of chatting with Bill Dudney about C but it quickly turns into a discussion on self publishing with iBooks Author.</p>
<p><span id="more-855"></span></p>
<h2 id="links">Links</h2>
<ul>
<li> <a title="iBookstore for All The C You Need" href="https://itunes.apple.com/us/book/all-the-c-you-need-to-know/id581989356?mt=11">All The C You Need</a></li>
<li><a title="Top to bottom; bottom to top" href="http://blog.andymatuschak.org/post/18851823748/top-to-bottom-bottom-to-top">Top To Bottom; Bottom To Top</a> (Blog Post)</li>
<li><a title="C Tutorial" href="http://masters-of-the-void.com/">Masters of The Void C Tutorial</a></li>
</ul>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv">iDeveloper TV</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>Bill Dudney, Twitter: <a href="http://twiiter.com/bdudney">@bdudney</a>, Bill&#8217;s <a title="Bill's Website" href="http://bill.dudney.net/roller/objc/">Website</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloperlive075.m4a">here</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/hCxSJQNKf8s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast75/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast75/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/N0Jh7vs6KiA/ideveloperlive075.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloperlive075.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Understanding the Anchor Point</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/OBZX6oPGw3o/</link>
		<comments>http://blog.ideveloper.tv/understanding-the-anchor-point/#comments</comments>
		<pubDate>Mon, 10 Dec 2012 16:02:38 +0000</pubDate>
		<dc:creator>David Rönnqvist</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=537</guid>
		<description><![CDATA[The geometry of layers We’re all familiar with the geometry of views. Usually we interact with them by setting or getting the frame to have the view appear where we want it on screen. The frame is actually a derived property, stored as the bounds and center of the view. When you set the frame [...]]]></description>
				<content:encoded><![CDATA[<h2>The geometry of layers</h2>
<p>We’re all familiar with the geometry of views. Usually we interact with them by setting or getting the frame to have the view appear where we want it on screen. The frame is actually a derived property, stored as the bounds and center of the view. When you set the frame of a view it sets the bounds and the center and when you later ask for the frame it gets calculated from those values.</p>
<p>Layers work almost the same, they have properties for the frame (derived), bounds, position and anchor point. By default the anchor point is in the center of the layer, in which case the position corresponds to the center property of the view. But the anchor point can be moved and then the above statement is no longer true.</p>
<p>The anchor point is defined in the unit coordinate space of the bounds which means that its x and y value both go from 0 to 1 within the bounds of the layer. The x value is 0 at the left edge of the layer and 1 at the right edge and similarly for the y value. Note that the screen coordinate space is different between iOS and OS X. On iOS, y increases downwards while it increases upwards on OS X. So the anchor point (0, 0) is either in the <em>top</em> left or <em>bottom</em> left depending on your platform.<span id="more-537"></span></p>
<h2>Why is there an anchor point?</h2>
<p>All transforms are applied relative to the anchor point, by default it is the center of the layer. Scaling down makes the layer shrink in all directions keeping the same position. Applying a rotation makes the view turn around the center. This is the same behavior as you get when applying an affine transform on a view but layers are more powerful than that. If the anchor point was changed to the lower left corner and the same scale and rotation transforms were applied we would get very different effects.</p>
<figure><img src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/scaling-example.svg" alt="How changing the anchor point affects scaling" /><br />
<figcaption>How changing the anchor point affects scaling. In the first example (to the left) the layer keeps its center as the view scales down. In the second example (to the right) the lower left corner is anchored and the layer scales down towards that point.</figcaption>
</figure>
<p>&nbsp;</p>
<figure><img src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/rotation-example.svg" alt="How changing the anchor point affects rotation" /><br />
<figcaption>How changing the anchor point affects rotation. In the first example (to the left) the layer rotates around its center. In the second example (to the right) the layer rotates around the lower left corner.</figcaption>
</figure>
<p>&nbsp;</p>
<p>Layers also support 3D transforms so you could move the anchor point to the edge and apply a rotation around the y axis (hold your open hand straight up and twist it back and forth) to create an effect that looks like an opening door.</p>
<h2>But something else is happening…</h2>
<p>If you’ve experimented with the anchor point before you may have been confused by one thing. When you change the anchor point, the layer actually moves as well. This is because the anchor point and the position is always the same point, only in different coordinate spaces (the anchor point in the bounds’s unit coordinate space and the position in the superlayer’s coordinate space). Since the frame (where the layer appears on screen) is being calculated from the bounds, position and anchor point and only one of them changes then the frame will also have to change.</p>
<figure><img src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/changing-anchor-point.svg" alt="How the frame changes when the anchor points changes" /><br />
<figcaption>How the frame changes when the anchor point changes. When the anchor point changes to the lower left corner, the layer visually moves so that the anchor point is in the right place without moving the anchor<em>ed</em> point relative to the superlayer.</figcaption>
</figure>
<p>&nbsp;</p>
<p>We can’t have the anchor point move to the corner <em>and</em> the frame stay the same without changing the position so that the frame calculations still are valid. We could calculate and set the correct position ourselves but if we know the frame then we can simply set it and have the correct position (given our anchor point) be calculated for us. Now the layer appears where we want it and the anchor point has moved to the corner.</p>
<p>It may seem strange and stupid that the frame should change if all you wanted was to change the point that the layer transforms relative to. You could argue over whether it makes more sense that the position changes or that the frame changes. You could also argue over whether or not the anchor point should affect the frame calculation at all. Couldn’t the layer have a frame, bounds and center, just like the view so that the anchor point would only be related to the transform? If you stop and think about it for a while the current way starts to make more and more sense.</p>
<p>Say for example that you wanted to make an analog clock inside your app. After having set the anchor point of the hands, setting their position to anything <em>other</em> than the center of the clock-face would simply feel wrong. The hands (in the coordinate space of the clock-face) are anchored in the center, just as they would be in the physical world.</p>
<h3>Not only for transforms</h3>
<p>As indicated by the clock example above, sometimes the center is not the anchor point you want to use. Have you ever subtracted half the width or height to calculate the position of that layer (or view)? By setting the anchor points to the edge and the positions to the same point you can align multiple layers no matter the size of their content. If the size increases or decreases you can still be sure that the views will stay aligned.</p>
<figure><img src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/aligning-layers.svg" alt="" /></p>
<figcaption>Three layers (or views) that are aligned using their anchor points. As their sizes change they still stay aligned using their anchor points.</figcaption>
</figure>
<p>&nbsp;</p>
<h2>iPhoto for iOS</h2>
<p>iPhoto for iOS gives us two beautiful examples of rotation around non-center anchor points. When choosing what kind of effect to apply to an image, the effect controls fan out like a swatch book and on selection they rotate back leaving you with the selected effect control visible at the bottom of the screen.</p>
<figure><img src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/iphoto-effects.svg" alt="The swatch book of effects in iPhoto for iOS" /><br />
<figcaption>The swatch book of effects in iPhoto for iOS. The black frame indicates the iPad screen and the tool bar.</figcaption>
</figure>
<p>&nbsp;</p>
<p>There is a similar rotation for brushes. By default all brushes lie next to each other on the tool bar and when it comes to selecting a brush they all fan together. A rotation is applied to each brush and all their positions are changed to the same point. This makes them look like a fan. This example is slightly more advanced since it involved more movement (both position and rotation). When selecting a brush the rotation is reversed and each brush gets their own position again so that they end up next to each other.</p>
<figure><img src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/iphoto-brushes.svg" alt="The two states of the brushes in iPhoto for iOS" /><br />
<figcaption>The two states of the brushes in iPhoto for iOS. All brushes on the tool bar (to the left) and all brushes in a fan (to the right). The black frame indicates the iPad screen and the tool bar.</figcaption>
</figure>
<p>&nbsp;</p>
<figure><!-- LeadPlayer video embed code start [ video: 50AA2BE1DEFF8 ] --><div><script type="text/javascript" src="http://s3.amazonaws.com/cdn.leadbrite.com/leadplayer/r0032/js/leadplayer.js"></script></div><div id="leadplayer_video_element_50AA2BE1DEFF8" style="width:640px;height:360px" itemscope itemtype="http://schema.org/VideoObject"><meta itemprop="embedUrl" content="http://www.youtube.com/embed/DsKsAuXY8WY?loop=0&amp;autoplay=0&amp;controls=1&amp;modestbranding=1&amp;showsearch=0&amp;showinfo=0&amp;hd=0" /><meta itemprop="name" content="iPhoto Brushes Animation" /><meta itemprop="description" content="Video showing animation of brushes in iPhoto for iOS" /><meta itemprop="width" content="640" /><meta itemprop="height" content="360" /><meta itemprop="thumbnailUrl" content="https://img.youtube.com/vi/DsKsAuXY8WY/hqdefault.jpg" /><iframe type="text/html" width="640" height="360" src="https://www.youtube.com/embed/DsKsAuXY8WY?loop=0&amp;autoplay=0&amp;controls=1&amp;modestbranding=1&amp;showsearch=0&amp;showinfo=0&amp;hd=0" frameborder="0" allowfullscreen></iframe></div><div><script type="text/javascript">jQLeadBrite("#leadplayer_video_element_50AA2BE1DEFF8").leadplayer(false, "eyJnYSI6dHJ1ZSwib3ZlcmxheSI6ZmFsc2UsInBvd2VyZWRfYnkiOmZhbHNlLCJwb3dlcmVkX2J5X2xpbmsiOiJodHRwOlwvXC93d3cubGVhZHBsYXllci5jb21cLyIsImNvbG9yMSI6IiNGNUJCMEMiLCJjb2xvcjIiOiIjMTc5OENEIiwiY29sb3IzIjoiI0Y1QkIwQyIsInR4dF9zdWJtaXQiOiJTVUJNSVQiLCJ0eHRfcGxheSI6IlBMQVkiLCJ0eHRfZW1sIjoiWW91ciBFbWFpbCBBZGRyZXNzIiwidHh0X25hbWUiOiJZb3VyIE5hbWUiLCJ0eHRfaW52YWxpZF9lbWwiOiJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCIsInR4dF9pbnZhbGlkX25hbWUiOiJQbGVhc2UgZW50ZXIgeW91ciBuYW1lIiwibHBfc291cmNlIjoiV1AgUGx1Z2luIDEuNC4xLjYgVW5saW1pdGVkIiwiaWQiOiI1MEFBMkJFMURFRkY4Iiwid2lkdGgiOjY0MCwiaGVpZ2h0IjozNjAsInRodW1ibmFpbCI6IiIsInRpdGxlIjoiaVBob3RvIEJydXNoZXMgQW5pbWF0aW9uIiwiZGVzY3JpcHRpb24iOiJWaWRlbyBzaG93aW5nIGFuaW1hdGlvbiBvZiBicnVzaGVzIGluIGlQaG90byBmb3IgaU9TIiwiYXV0b3BsYXkiOmZhbHNlLCJzaG93X3RpbWVsaW5lIjp0cnVlLCJlbmFibGVfaGQiOmZhbHNlLCJvcHQiOmZhbHNlLCJjdGEiOmZhbHNlLCJ5bSI6IkRzS3NBdVhZOFdZIn0=");</script></div><!-- LeadPlayer video embed code end [ video: 50AA2BE1DEFF8 ] --></p>
<figcaption>The actual animation between the two states of the brushes in iPhoto for iOS.</figcaption>
</figure>
<p>&nbsp;</p>
<h2>Thinking outside the box</h2>
<p>So far the anchor point has always been within the bounds of the layer but it doesn’t have to. Within the bounds of the layer the values go from 0 to 1.</p>
<p>What would a x-value of 2 mean? Starting from the left edge, 1 is the full width of the layer so a value of 2 would mean 2 full widths of the layer to the right from the left edge. This is the same as 1 full width of the layer to the right from the right edge. Similarly a value of –1 would mean being anchored the full width of the layer to the left of the left edge. As mentioned above, the frame of the layer moves when the anchor point changes so it is quite easy to accidentally move the layer off-screen when using anchor points outside the range of 0 to 1.</p>
<p>All this doesn’t make much sense for positioning, we very rarely want to align things a distance proportional to their size from a point but we sometimes want to <em>transform</em> relative to a points outside our own bounds. Doing a rotation around a points outside the bound without using the anchor point would require calculating the circular path ourselves and using a key-frame animation for the position with that path. For a true rotation we would also have to apply a rotation of the layer (relative to its center). If we instead changed the anchor point we would only rotate and be done with it.</p>
<figure><img src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/rotating-outside.svg" alt="Rotation relative to a point outside the layers bounds" /><br />
<figcaption>Rotation relative to a point outside the layers bounds.</figcaption>
</figure>
<p>&nbsp;</p>
<p>We could also scale a layer relative to an outside point but we would have to keep in mind that everything about the layer scales relative to the anchor point, both the size and the distance. This means that if we scale to twice the size the distance would also double.</p>
<figure><img src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/scaling-outside.svg" alt="Scaling relative to a point outside the layers bounds" /><br />
<figcaption>Scaling relative to a point outside the layers bounds.</figcaption>
</figure>
<p>&nbsp;</p>
<h2>The anchor point is animatable</h2>
<p>If you read through the documentation you will see that the anchor point is actually animatable. This means that you can have a fixed point in space (if the position doesn’t change) that you can push the layer trough. You could of course do the same thing by animating the position instead (as long as transforms are not involved) but the anchor points allows you to describe the movement relative to the size, e.g. “I want the layer to move from the center all the way to the bottom”.</p>
<h2>Finishing up</h2>
<p>If you didn’t know of the anchor point before reading this post, I hope that you learned enough to know when to use it.</p>
<p>If you’ve used the anchor point before but felt that its behavior was strange and have avoided using it since, I hope that this post explained some of that behavior and caused you to reconsider.</p>
<p>Finally, if you knew all this, good for you!</p>
<h2>About the Author:</h2>
<div class="aboutTheAuthor"><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/12/davidronnqvist.png"><br />
<img class="authorImage" title="David Rönnqvist" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/12/davidronnqvist.png" alt="Photo of David Rönnqvist" width="128" height="128" /><br />
</a></p>
<h2 class="authorName">David Rönnqvist</h2>
<p>David is a graphics and animations development enthusiast from Stockholm, Sweden. He fell in love with Mac and iOS development with the introduction of OS X 10.5 Leopard and the iPhone SDK. When he is not writing code he practices and teaches kung fu.</p>
<p class="authorContact">Twitter: <a title="David Rönnqvist on twitter" href="http://twitter.com/davidronnqvist">@davidronnqvist</a><br />
Website: <a title="David's Blog" href="http://ronnqvist.tumblr.com/">David&#8217;s Blog</a></p>
</div>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/OBZX6oPGw3o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/understanding-the-anchor-point/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/understanding-the-anchor-point/</feedburner:origLink></item>
		<item>
		<title>Is In-App Purchase Right For Your App?</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/CX4tGPiZ2lE/</link>
		<comments>http://blog.ideveloper.tv/in-app-purchase-right-for-your-app/#comments</comments>
		<pubDate>Thu, 06 Dec 2012 16:00:22 +0000</pubDate>
		<dc:creator>Mathew Waters</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=786</guid>
		<description><![CDATA[Introduction Developing your app to support in-app purchase will* increase your revenue. * okay; may. When Apple opened the App Store to developers in 2008 developers could sell software either with an up-front cost or for free. Apple rules state that each app must be functional. Demo (or time-limited) software wasn&#8217;t and still isn&#8217;t allowed [...]]]></description>
				<content:encoded><![CDATA[<h2>Introduction</h2>
<p>Developing your app to support in-app purchase will* increase your revenue.</p>
<p>* okay; may.</p>
<p>When Apple opened the App Store to developers in 2008 developers could sell software either with an up-front cost or for free. Apple rules state that each app must be functional. Demo (or time-limited) software wasn&#8217;t and still isn&#8217;t allowed in the store. There was no option to sell anything else from within the app. That came later, announced at WWDC in 2009. But only for paid apps. Many apps dropped in price to &#8220;tier 1&#8243; ($0.99 USD), enabling them to offer in-app purchase. Then in October Apple removed the restriction, allowing free apps to offer paid content or features.</p>
<p><span id="more-786"></span><br />
To be accepted into the store at all, even a free app needs to offer <em>some</em> functionality. Inside the app you can sell <em>additional</em> functionality, or &#8220;premium features&#8221;. Now you&#8217;re giving the app away it&#8217;s a statistics game: what percentage of your users will make purchases?</p>
<h2>Why Use In-App Purchase?</h2>
<p>Selling software is more difficult if your users can&#8217;t give it a try first. Reputable developers such as Apple can charge a higher price for theirs because people know the quality they produce. But what if you&#8217;re not widely known? Are enough people going to take a gamble on you? If they have to pay you a <em>reasonable</em> price probably not. Outside the App Store we&#8217;re used to 30-day trial software, we&#8217;ve had it for years. This allows people to see whether your software is worth what you say its worth without taking a risk up-front. But as Apple don&#8217;t allow demo software, they expect people to gamble their money on apps based purely on screenshots and user reviews. I use the number of reviews as a gauge for how many copies have been sold. Ever noticed how many reviews there are for higher-priced apps? And by higher-priced I mean $10. Not many. I believe this situation has contributed to the &#8220;race to the bottom&#8221; as developers lowered prices to a point where users would be prepared to lose the money just to try it out. If the software was decent, they got an excellent deal.</p>
<p>By allowing the app to install for free, users can experience the quality of your work as a developer without risk. It gives them confidence to purchase what you have to offer in-app. Even some negative reviews might not hurt your sales because people can judge for themselves without cost. You can price more fairly (to you) having taken away the risk to the user.</p>
<h2>When In-App Purchase Works (and when it doesn&#8217;t)</h2>
<p>I develop <a title="Easy Books: Financial Accounting and Bookkeeping for iOS and Mac" href="http://easybooksapp.com" rel="nofollow">Easy Books</a>, a bookkeeping app for iOS and Mac for contractors and small businesses. It&#8217;s free to download and uses in-app purchase for different elements of the app. Not everyone uses all the features. I could have produced three different apps, but I decided to make one app and charge separately for the features people want. It&#8217;s worked well for me because it keeps the cost down for users who only need basic bookkeeping, while allowing others to make use of invoicing and time tracking.</p>
<p>The model works really well if your app behaves in a fully functional way, so in the case of a game you may get the first 10 levels and purchase more later. Personally I don&#8217;t like to see it used in kid&#8217;s games though.</p>
<p>If your app does one thing, or is likely to be used only once, it probably won&#8217;t make good sense to add in-app purchase.</p>
<p>If you already have a paid app in the store, it&#8217;s probably not a good idea to add in-app purchase, unless you&#8217;re adding a new feature to the app. It isn&#8217;t possible to tell when your app was first purchased, so it isn&#8217;t possible to unlock features to users who paid the full price if you want to move to a free + paid in-app purchase model.</p>
<p>You can only sell virtual goods (see <a title="Apple Documentation for StoreKit" href="http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction/Introduction.html" rel="nofollow">Apple Developer Documentation for StoreKit</a>). So selling real-world products and services such as customer support isn&#8217;t allowed by Apple. Specifically they say &#8220;You must deliver a digital good or service within your application. Do not use In-App Purchase to sell real-world goods and services&#8221;.</p>
<p>The same revenue split applies when selling in-app purchase items. After taking off any VAT, Apple keep 30% and pay developers 70%, paid monthly.</p>
<p>As a developer you receive a daily report from Apple in iTunes Connect that lists the in-app purchase products and the numbers sold. It isn&#8217;t possible to determine who purchased what, or even whether the same user purchased more than one of your in-app purchase items. You can however break down sales by region. It&#8217;s worth mentioning this because many people falsely assume their relationship is with you the developer, whereas in fact it&#8217;s with Apple. This is most likely to become a problem if a user contacts you directly about getting a refund: developers have no way of telling whether the user has paid for anything and have no power to credit a user&#8217;s Apple ID. I recommend directing people to <a title="Apple Support" href="http://www.apple.com/support/itunes/contact/" rel="nofollow">Apple&#8217;s support page</a> because Apple offer refunds if the purchase was made <em>by mistake</em>.</p>
<p>Be aware that making your app free to download means any user can leave a review for your app without paying anything. You&#8217;ll get a lot more reviews this way, but it can skew your star rating because you&#8217;ll tend to get more negative reviews if it cost your users nothing (see <a title="Post-purchase rationalization" href="http://en.wikipedia.org/wiki/Post-purchase_rationalization" rel="nofollow">Post Purchase Rationalisation</a>).</p>
<h2>Types of In App Purchases</h2>
<table>
<thead id="thead">
<tr>
<td>Type</td>
<td>iOS</td>
<td>Mac</td>
<td>Comments</td>
<td></td>
</tr>
</thead>
<tbody>
<tr>
<td class="nobreak">Non-consumable</td>
<td>Y</td>
<td>Y</td>
<td>Can be purchased once and will be restored to each device.</td>
</tr>
<tr>
<td class="nobreak">Consumable</td>
<td>Y</td>
<td>Y</td>
<td>Can be purchased more than once, is not restored to other devices.</td>
</tr>
<tr>
<td class="nobreak">Non-renewing Subscription</td>
<td>Y</td>
<td></td>
<td>Just like a consumable, except the user is presented with the option to renew/extend if they&#8217;ve purchased it previously.</td>
</tr>
<tr>
<td class="nobreak">Auto-renewing Subscription</td>
<td>Y</td>
<td></td>
<td>Subscriptions are renewed by Apple, you can request an updated receipt from any of the past receipts and provide content as long as the latest receipt is valid.</td>
</tr>
</tbody>
</table>
<p>There is also now a free subscription for Newsstand apps.</p>
<h2>Okay, How do I Start?</h2>
<p>The <a title="Apple Documentation for StoreKit" href="http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction/Introduction.html" rel="nofollow">Apple Documentation</a> is good and provides some code examples. Essentially you&#8217;ll need to follow these steps, and I&#8217;m assuming here that you are already an iOS developer, familiar with Xcode, App IDs, Provisioning Profiles and setting up a product in iTunes Connect.</p>
<ul>
<li>Create an explicit App ID (not a wildcard App ID). In-App Purchases cannot be made from an app associated with a wildcard App ID.</li>
<li>Create the In-App Purchase item in iTunes Connect from your app&#8217;s detail page. The Product Identifier is what you&#8217;ll refer to in your code.</li>
<li>Write an app.</li>
<li>Validate the receipt received from StoreKit (optional).</li>
<li>Provide content/premium feature.</li>
</ul>
<p>Writing the app is obviously the hard part. I can&#8217;t really help you there. For the in-app purchase code, see the example code shown in the Apple docs which I suggest following.</p>
<h3>Reachability Class</h3>
<p>While I recommend using the Apple example code, I also make use of the <a title="Reachability" href="http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html" rel="nofollow">Reachability Class</a> provided by Apple. Combine the call to <code>[SKPaymentQueue canMakePayments]</code> with a check on the reachability state. If your app has network connectivity, go ahead and request the products in your call to <code>[[SKProductsRequest alloc] initWithProductIdentifiers:]</code>. If not, the store is not available. The Reachability class will call you back if the network becomes available, and you can request the products then.</p>
<p>When the list of products is returned to you in the delegate method <code>productsRequest:didReceiveResponse:</code> you should keep hold of them because you&#8217;ll need each <code>SKProduct</code> object later when purchasing. I prefer to make the calls when the app starts (and each time it returns from the background) because you&#8217;ll have the current prices and product descriptions available when the user visits your purchasing screen. The user experience is better if they don&#8217;t have to wait for prices to appear.</p>
<h3>Transaction Observer</h3>
<p>You should register as a transaction observer so that StoreKit can call your implementation of the delegate methods when purchases are successful, products are restored and so on. When you register a transaction observer with StoreKit, do not be tempted to un-register. I used to register as an observer when the product list was returned, then de-register if the network became unreachable. Doing this on a Mac App causes the app to crash if the network is intermittent. And there really isn&#8217;t any need to de-register, so just register once and leave it at that.</p>
<h3>Handling Purchases</h3>
<p>When the user taps (or clicks) your buy button, update the UI to show a spinner or give some feedback that you&#8217;re in the process of purchasing the product they&#8217;ve tapped on. Call <code>[[SKPaymentQueue defaultQueue] addPayment:payment]</code> and wait. StoreKit will call your delegate methods. On failure, inform the user and return the button to its &#8220;buy&#8221; state because they may be able to fix the problem and try again. On success, your implementation of <code>paymentQueue:updatedTransactions:</code> will be called with an array of <code>SKPaymentTransaction</code> objects. For each one, determine the product identifier from <code>transaction.payment.productIdentifier</code>. It is your choice now whether to provide the content/feature straight away, or whether to validate the receipt first.</p>
<h3>Validating Receipts</h3>
<p>A Russian hacker set up a server, explained how to install a root certificate and change the DNS settings so he could provide access to in-app purchase items for free. Quite what he had to gain from this, nobody knows. One has to hope he will one day appear at <a title="NSConference" href="http://ideveloper.tv/nsconference/">NSConference</a> to explain how clever it all was. Anyway, Apple responded by trying to shut down his system, and <a title="Validating Receipts" href="http://developer.apple.com/library/ios/#releasenotes/StoreKit/IAP_ReceiptValidation" rel="nofollow">explained to developers</a> what they should do in their apps. The vulnerability affects iOS 5.1 and earlier. Apps running on iOS 6 cannot be hacked using this method.</p>
<p>You may wish to validate receipts on your server, especially if you provide access to content at a cost to yourself, perhaps by licensing costs or access to web services. This is not trivial to do, and requires you set up a protocol between your app and your server. <code>NSURLConnection</code> is probably going to come in handy here. Assuming you have that set up, here are the basic steps to validate an in-app purchase receipt on iOS.</p>
<p>The transaction receipt is an <code>NSData</code> object that exists for each transaction passed to you in <code>paymentQueue:updatedTransactions:</code>. This data should be encoded in <code>base64</code> format and passed to your server. Your server should follow <a title="Verifying StoreKit Receipts" href="http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStoreReceipts/VerifyingStoreReceipts.html" rel="nofollow">Apple&#8217;s recommended steps</a> by creating a JSON object containing the <code>base64</code> encoded receipt and sending it to https://buy.itunes.apple.com/verifyReceipt or https://sandbox.itunes.apple.com/verifyReceipt. It is useful to try the production URL first, and if that fails to try the sandbox URL. When your app is in review, Apple test using the sandbox so trying both is a good idea to avoid rejection.</p>
<p>The response from Apple is a decode of the receipt (if valid). This gives access to some key properties:</p>
<ul>
<li><code>bid</code>. Bundle ID. Check this is your app.</li>
<li><code>transaction_id</code>. Check this hasn&#8217;t been used for verification before.</li>
<li><code>product_id</code>. This is your product identifier.</li>
<li><code>original_purchase_date</code>. This is the date of purchase.</li>
</ul>
<p>If everything looks good, return a positive response to the device. The device should then take this as a cue to unlock the feature.</p>
<p>Validating in-app purchases on Mac is slightly different. Apple documentation states the process is the same, but many of us were confused because there is no <code>transactionReceipt</code> property returned in the method <code>paymentQueue:updatedTransactions:</code>. I used one of my DTS tickets to find out more and wrote about what I found on <a title="Validating In App Purchases from the Mac App Store " href="http://stackoverflow.com/questions/7598047/online-receipt-validation-for-in-app-purchases-for-mac/7650443#7650443" rel="nofollow">StackOverflow</a>. Essentially the process <em>is</em> the same, except that your Mac app&#8217;s receipt file is updated with each purchase. This binary file should be <code>base64</code> encoded as before and passed to your server. Note the format returned by Apple is different from the iOS receipts, which contain one in-app purchase product. The Mac App Store receipt file contains information about the app itself, plus an array of in-app purchases. Also note the different names of the properties such as <code>Bundle_ID</code> on Mac App Store as compared to iOS App Store.</p>
<ul>
<li><code>bundle_id</code></li>
<li><code>in_app[n]-&gt;transaction_id</code></li>
<li><code>in_app[n]-&gt;product_id</code></li>
<li><code>in_app[n]-&gt;original_purchase_date</code></li>
</ul>
<p><img style="float: right; padding-left: 20px; padding-bottom: 10px;" src="https://d1gzr3dqhsu728.cloudfront.net/temp/mac_app_store_receipt_file_in_finder.png" alt="" />If you&#8217;re interested in testing this process for Mac App Store receipts, follow these steps:</p>
<ul>
<li>Find an app you&#8217;ve downloaded from the Mac App Store in your Applications folder.</li>
<li>Use &#8220;Show package contents&#8221; to find the receipt file in the folder Contents/_MASReceipt.</li>
<li>Start Terminal and use the command <code>base64 -i &lt;path-to-receipt-file&gt;</code></li>
<li>Next type <code>curl -d '{ "receipt-data":"&lt;base64-text-from-above&gt;" }' https://buy.itunes.apple.com/verifyReceipt</code></li>
<li>You should get a response from Apple&#8217;s server that looks something like this:<br />
<code>{"status":0, "environment":"Production", "receipt":{"adam_id":"408921426", "bundle_id":"com.apple.Aperture", "application_version":"3.4.3", "download_id":"80001897676463", "in_app":[]}}</code></li>
</ul>
<h3>Unlocking Features</h3>
<p>On iOS, users don&#8217;t have easy access to the file system and it&#8217;s safe just to store the fact that a product has been purchased by an entry in <code>NSUserDefaults</code> or as a file stored in the app library.</p>
<p>On the Mac, users can easily edit a text file, perhaps changing the user default for their purchases from N to Y. So if you want to lock this down a little, you could consider obfuscating the storage of this flag. Perhaps couple the value with a hash of the machine&#8217;s unique identifier, preventing the file from being simply passed to other users and copied to another machine. Or have a look at my initial modifications on <a title="AquaticPrime, modified for OS X Lion" href="https://github.com/mwaters/AquaticPrime" rel="nofollow">AquaticPrime</a>. I started this work to remove the hundred or so warnings when building with AquaticPrime on Lion. Apple deprecated the openssl framework APIs when linked dynamically, so it was either update the code to remove the warnings or statically link openssl. I opted for the former because I didn&#8217;t want to add to the size of the binary. The resulting AquaticPrime class now uses the Apple Security Framework instead and can validate AquaticPrime license files (but has problems producing them: that still needs to be done elsewhere).</p>
<h2>Problems</h2>
<p>When thinking about moving from a paid app to a free app with in-app purchase there are potential problems. You&#8217;re adding a lot of complexity.</p>
<p>This is especially true if you&#8217;re validating receipts on your own server: now you need to implement a transfer mechanism to pass the receipt to your server and handle the response. What if your server is down? Now you&#8217;ll need to store the receipt somewhere and implement a queue so they get passed to your server later. For the consumable product type you don&#8217;t have the option of asking the user to use the restore button if the purchase succeeded but your server failed to validate it.</p>
<p>There are other things that can go wrong too:</p>
<h3>Didn&#8217;t I Purchase this Already?</h3>
<p>Expect to provide a lot more support. Users have a hard time understanding why their purchases are not automatically available on all devices. Come to think about it so do I. It should be possible for Apple to call your delegate methods, passing past purchases through to your app without your user needing to do anything. But for whatever reason this isn&#8217;t how it works. You&#8217;ll need to add a restore button somewhere in your user interface. Users can tap that to restore their past purchases if they&#8217;ve purchased non-consumable products. They will be asked for their Apple ID password though, so you can&#8217;t perform the tap on their behalf.</p>
<h3>Too Many Apple IDs</h3>
<p>When a user installs your app they enter their Apple ID and password to begin the download. Any in app purchases must also be from this same Apple ID. People seem to be using more than one Apple ID more often, and this causes quite a few support issues along the lines of &#8220;I can&#8217;t seem to purchase add-ons&#8221;.</p>
<h3>I Disabled In-App Purchases. Why I Can&#8217;t Purchase In App?</h3>
<p>On iOS, users can disable in-app purchases globally on the device. This is a system setting under <strong>Settings</strong> &gt; <strong>General</strong> &gt; <strong>Restrictions</strong>. With this restriction setting turned on, you cannot purchase anything via StoreKit. But you also cannot restore past purchases either. Quite a few support discussions have eventually turned out to be due to the user turning this setting on.</p>
<h3>Validate All Your Incoming Data</h3>
<p>Of course that&#8217;s just good general advice. But I&#8217;ve made this mistake in the past and it bit me on 21 June 2012. If you were trying to use my app on that day it crashed shortly after launch. The problem was traced to the delegate method <code>productsRequest:didReceiveResponse:</code> and specifically the <code>localizedTitle</code> property of each <code>SKProduct</code> object in the array passed from Apple&#8217;s StoreKit. It suddenly started to be passed as a nil value, and since I was using it as the key in an <code>NSMutableDictionary</code>, both the iOS and Mac app crashed when they received the response from StoreKit. Apple fixed the problem at their end towards the end of the day. It was our busiest day at work; we just answered support questions and tried to keep everyone updated with what we were doing to fix it. The app had a number of one-star reviews that day too, and I believe it&#8217;s unusual, but Apple agreed to remove them. They also credited my DTS incident back to me.</p>
<h2>Conclusion</h2>
<p>By adding IAP to your app, you can start small and add features as time goes on. That should get you into the store sooner so you can start making some money to fund all those other features you wanted to add. But be careful to avoid bloating your app: most iOS apps are tightly focused on doing one thing well.</p>
<p>From my own experience, carving the app into modules of different (but related) functionality has allowed me to set the price for each feature so people don&#8217;t need to make a big purchase at the start. They may later have a need for &#8211; and decide to buy &#8211; something else from me.</p>
<p>Implementing in-app purchase for free apps is a great way to increase the number of downloads. The more people try it out the better for you. Even if your app isn&#8217;t right for someone, they may show someone else who later becomes a customer. By taking away the initial risk barrier, you go some way to level the field between you and established developers: if you take reputation out of the buying decision, you can compete on the quality of your app.</p>
<h2>About the Author:</h2>
<div class="aboutTheAuthor"><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/12/MathewWaters128.jpeg"><br />
<img class="authorImage" title="Mathew Waters" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/12/MathewWaters128.jpeg" alt="Photo of Mathew Waters" width="128" height="128" /><br />
</a></p>
<h2 class="authorName">Mathew Waters</h2>
<p>Mathew has had a passion for technology ever since he began to take things apart. Having left corporate life a few years ago, he now concentrates on developing for iOS and the Mac. He has recently discovered that the &#8220;i&#8221; in iDeveloper stands for indie, is easily excited by shiny new things, and enjoys flying R22 and R/C helicopters.</p>
<p class="authorContact">Twitter: <a title="Mathew Waters on twitter" href="http://twitter.com/mathew_waters" rel="nofollow">@mathew_waters</a><br />
App.net: <a title="Mathew Waters on app.net" href="https://alpha.app.net/muddy" rel="nofollow">@muddy</a><br />
Website: <a title="Geode Software" href="http://geode.co.uk/" rel="nofollow">Geode Software</a></p>
</div>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/CX4tGPiZ2lE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/in-app-purchase-right-for-your-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/in-app-purchase-right-for-your-app/</feedburner:origLink></item>
		<item>
		<title>Podcast 74 – Objective-C in the Cloud</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/0Gwof0gLm8g/</link>
		<comments>http://blog.ideveloper.tv/podcast74/#comments</comments>
		<pubDate>Wed, 05 Dec 2012 15:20:01 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://ideveloper.wpengine.com/?p=852</guid>
		<description><![CDATA[Scotty and John talk with Amin Negm-Awad and Christian Kienle about their new project, Objective-Cloud. Objective-Cloud allows you to create cloud based RESTful web services using Objective-C. Links Objective Cloud Objective-Cloud FAQ Some Objective-Cloud Sample Code Guest Details Scotty from iDeveloper TV, Twitter: @macdevnet, App.Net: Scotty John Fox from Memory Miner, Twitter:@djembe, App.Net: djembe Amin [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty and John talk with Amin Negm-Awad and Christian Kienle about their new project, Objective-Cloud. Objective-Cloud allows you to create cloud based RESTful web services using Objective-C.</p>
<p><span id="more-852"></span></p>
<h2 id="links">Links</h2>
<ul>
<li><a title="Objective-Cloud" href="http://objective-cloud.com">Objective Cloud</a></li>
<li><a title="Objective-Cloud FAQ" href="http://objective-cloud.com/faq/">Objective-Cloud FAQ</a></li>
</ul>
<h2>Some Objective-Cloud Sample Code</h2>
<script src="https://gist.github.com/4206842.js"></script><noscript><pre><code class="language-shell shell">curl --header &quot;Content-Type:application/json&quot; -d &quot;{ \&quot;teamIdentifierPrefix\&quot; : \&quot;local\&quot;, \&quot;bundleIdentifier\&quot; : \&quot;com.company.CloudApp\&quot;, \&quot;message\&quot; :  { \&quot;selector\&quot; : \&quot;dictionaryWithObject:forKey:\&quot;, \&quot;arguments\&quot; : [ \&quot;firstName\&quot;, \&quot;Amin\&quot; ] }, \&quot;signature\&quot; : \&quot;dddddd\&quot; }&quot;  localhost:8080/</code></pre><pre><code class="language-objective-c objective-c">+ (NSString*)uppercaseStringFromString:(NSString*)string
{
  return [string uppercaseString];
}

+ (NSString*)sayHello
{
  return @&quot;Hello&quot;;
}

+ (NSString*)sayHelloToPersonInDictionary:(NSDictionary*)personDictionary
{
  return [NSString stringWithFormat:@&quot;Hello %@ %@&quot;, personDictionary[@&quot;firstName&quot;], personDictionary[@&quot;lastName&quot;]];
}

+ (NSDictionary*)dictionaryWithObject:(NSString*)object forKey:(NSString*)key
{
  return [NSDictionary dictionaryWithObject:object forKey:key];
}
@end</code></pre></noscript>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv">iDeveloper TV</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="MemoryMiner Website" href="http://memoryminer.com">Memory Miner</a>, Twitter:<a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">djembe</a></li>
<li>Amin Negm-Awad, Twitter: <a href="http://twitter.com/cocoading">@cocoading</a>, Amin&#8217;s <a href="http://cocoading.de/">Website</a></li>
<li>Christian Kienle, Twitter: <a href="http://twitter.com/cocoapimper">@cocoapimper</a>, Christian&#8217;s  <a href="http://christian-kienle.de/CoreDataEditor">Website</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloperlive074.m4a">here</a></p>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" alt="Invasivecode Logo" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/0Gwof0gLm8g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast74/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast74/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/TaTOJuSEYCk/ideveloperlive074.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloperlive074.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>The Code Lifecycle of Shindig Using Git and GitHub</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/mP2khddcZ8M/</link>
		<comments>http://blog.ideveloper.tv/codelifecycle/#comments</comments>
		<pubDate>Mon, 03 Dec 2012 16:01:14 +0000</pubDate>
		<dc:creator>Michael Zornek</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=597</guid>
		<description><![CDATA[Hello everyone. My name is Mike Zornek (@zorn) and today I&#8217;d like to talk a little about the code review process we&#8217;ve introduced at Shindig to help improve code quality. To get started I feel like I need to give you a short pitch to explain what we do and the complexities of our environment: [...]]]></description>
				<content:encoded><![CDATA[<p>Hello everyone. My name is Mike Zornek (<a title="Mike Zorn on Twitter" href="http://twitter.com/zorn" rel="nofollow">@zorn</a>) and today I&#8217;d like to talk a little about the code review process we&#8217;ve introduced at <a href="http://shindig.io">Shindig</a> to help improve code quality.</p>
<p>To get started I feel like I need to give you a short pitch to explain what we do and the complexities of our environment:</p>
<blockquote><p>Shindig is a platform for events like conferences, festivals or student orientations that let&#8217;s you produce mobile apps for your attendees. These mobile apps are true native experiences for iPhone, iPad, Android and HTML. They empower attendees to browse schedules, sessions, speakers, venues, maps, and more. Our apps have features for custom itineraries, push notification and real-time updates that you&#8217;d make through our Shindig Manager web application.</p></blockquote>
<p>So the Shindig product itself is pretty vast. It&#8217;s implemented over a number of sub-projects using Rails (Manager), Sinatra (API), Objective-C (iPhone, iPad), Java (Android) and Ruby (various tools). We have five founders who make up the skill set that implement this code base.</p>
<p>Shindig started as a very small, one event, one platform project back in 2010 and over time has grown fairly organically. In the fall of 2011 we made plans to invest more time into the company leading into January of 2012 where we became an LLC. During this transition we assigned various rolls to the five founders and I took over as Project Manager. As Project Manager I wanted to see us become more mature in how we handled the code we wrote.</p>
<p><span id="more-597"></span><br />
Certain members of the team had already embraced unit testing and I wanted to see that expand to everyone. I also wanted to expand our testing into functional tests of the user experience. There was no need to do a full stop and add testing for everything, but the idea was it should become a natural part of new code additions and refactoring.</p>
<p>Team members and the projects they were working on were very isolated. Most people didn&#8217;t have a firm understanding of how their coworkers were implementing things. I wanted to introduce a code review process that would have team members evaluate one another&#8217;s code before it was introduced into the main development branch. The purpose here is to help us find bugs and infrastructure problems early on and to make it clear that code is owned by the team and not a single individual.</p>
<p>Finally we were going to be more formal with our quality assurance practices, including consistent code repository management styles and a release procedure that contained feature freezes and proper testing environments.</p>
<p>This article will review what we came up with, how it&#8217;s working for us, and some of our ideas for the future.</p>
<h2>Repo Design</h2>
<p>We use <a title="Git" href="http://git-scm.com/" rel="nofollow">Git</a> and <a title="Git Hub" href="https://github.com/">GitHub</a> for our source control management though I suspect similar patterns can be had in others like SCMs like <a href="http://mercurial.selenic.com/" rel="nofollow">Mercurial</a> and other hosts like <a title="Beanstalk" href="http://beanstalkapp.com/">Beanstalk</a>.</p>
<p>For each repo we have the following branches:</p>
<ul>
<li> Master &#8212; what is deployed to the public.</li>
<li>Testing &#8212; what is deployed to our testing environment (pre-public launch)</li>
<li>Development &#8212; what is deployed to our development environment</li>
<li>Feature(s) &#8212; feature branches being worked on for future integration into development</li>
</ul>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/four_branches_thumb.png"><img class="alignnone size-full wp-image-598" title="four_branches_thumb" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/four_branches_thumb.png" alt="" width="458" height="356" /></a></p>
<h2>Ideal Feature Branch Workflow</h2>
<p>Let&#8217;s say we have a feature we are ready to work on. The typical workflow for this would be to create a branch off of development and start coding. The general goal is to have the feature scoped so it doesn&#8217;t take longer than 1-3 days, and the shorter the better. We dislike large changesets since they are harder to review and since many features interact with one another it&#8217;s good to get them into development as soon as possible so we notice problems faster.</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/ideal_feature_branch_p1_thumb.png"><img class="alignnone size-full wp-image-599" title="ideal_feature_branch_p1_thumb" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/ideal_feature_branch_p1_thumb.png" alt="" width="458" height="356" /></a>!</p>
<p>After the feature is done a pull request is made requesting integration into development. Making a pull request in GitHub is pretty simple. From the repo page click Pull Request:</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/pull_request_button_thumb.png"><img class="alignnone size-full wp-image-600" title="pull_request_button_thumb" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/pull_request_button_thumb.png" alt="" width="458" height="154" /></a></p>
<p>To define a pull request you choose the destination branch and the source branch:</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/new_pull_request_thumb.png"><img class="alignnone size-full wp-image-601" title="new_pull_request_thumb" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/new_pull_request_thumb.png" alt="" width="458" height="225" /></a></p>
<p>Once created you can assign a pull request to a specific person. (GitHub will actually email everyone on the repo&#8217;s team when the pull request is made. Sadly, there is no way to assign someone during pull request creation.)</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/pull_request_details_thumb.png"><img class="alignnone size-full wp-image-602" title="pull_request_details_thumb" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/pull_request_details_thumb.png" alt="" width="458" height="434" /></a></p>
<p>The pull request detail page also has helpful sections for all the commits that are contained within this pull request as well as a master diff for the entire pull request.</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/pull_request_diffs_thumb.png"><img class="alignnone size-full wp-image-604" title="pull_request_diffs_thumb" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/pull_request_diffs_thumb.png" alt="" width="458" height="433" /></a></p>
<h2>How Reviews Work</h2>
<p>For our team we have five people and we use the buddy system to pair off people and repos, assigning who will do which reviews. The idea is over time we&#8217;ll switch things up every so often so the same people aren&#8217;t reviewing the same code all the time.</p>
<p>While there is one person assigned to the pull request it&#8217;s not uncommon to see people stop by to answer questions or offer feedback. For us it&#8217;s a great way to make sure the team is all on the same page early in the development cycle. GitHub is particularly good about notifying people when we using their `@name` shorthand in a comment.</p>
<p>Approving a pull request generally involves:</p>
<ul>
<li>Checking out the branch</li>
<li>Building the product to make sure the new feature or enhancement works as expected.</li>
<li>Review the new code and tests for overall quality and style.</li>
<li>Verify all tests pass.</li>
</ul>
<p>If there is something wrong or not understood there will be a back and forth between the coder and the reviewer. Any new code added to the branch is automatically appended to the pull request. If there has been significant changes on development that might disallow a clean merge the pull request page will say so. To fix this usually all that is usually required is merging development back into the feature branch and working out any conflicts.</p>
<p>Once everything is good to go you can hit the <strong>Merge</strong> button right on GitHub to merge the feature branch into development.</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/ideal_feature_branch_p2_thumb.png"><img class="alignnone size-full wp-image-605" title="ideal_feature_branch_p2_thumb" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/ideal_feature_branch_p2_thumb.png" alt="Ideal Feature Branch P2 Thumb" width="458" height="356" /></a></p>
<h2>Dependent Feature Branches</h2>
<p>Sometimes (particularly early in the lifespan of a project) features are dependent on one another and so you&#8217;ll end up with a branch tree where features are dependent on one another like this:</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/dependant_feature_branches_thumb.png"><img class="alignnone size-full wp-image-606" title="dependant_feature_branches_thumb" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/dependant_feature_branches_thumb.png" alt="Dependent Feature Branches Thumb" width="458" height="356" /></a></p>
<p>There is nothing inherently wrong here but the practice is discouraged when possible. The problem this introduces for a code reviewer is that now we have to approve the pull requests in order and if there is a hang up in one pull request it will delay the others.</p>
<p>The other thing you&#8217;ll probably want to do is if there are features X, Y and Z to review and X gets approved you&#8217;ll want to update the Y branch to get the feature X changes out of the diff (as they are already in development). To do this go into the Y branch and merge in the updated development. This will make it so the Y feature pull request only shows the real changes that Y will introduce to development and remove all the X changes which have already been approved. (This sounds more complex than it is.)</p>
<h2>Testing and Release Workflow</h2>
<p>When we are approaching a release we&#8217;ll merge development into a testing branch. There it will be the source of our testing environment and is considered under feature freeze. While we can still fix bugs on this branch they are held under a higher scrutiny and once applied will reset our testing procedures to make sure the bug fix hasn&#8217;t broken other things.</p>
<p>One must also make sure to apply the bug fix to testing as well as development.</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/testing_branch_flow_thumb.png"><img class="alignnone size-full wp-image-607" title="testing_branch_flow_thumb" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/testing_branch_flow_thumb.png" alt="Testing Branch Flow Thumb" width="458" height="356" /></a></p>
<h2>Hotfix Workflow</h2>
<p>Sometime we discover bugs that are causing system availability problems or data corruption and for these we have a hotfix workflow. It&#8217;s very similar to our other practices but is done directly on master. Obviously these are discouraged and only used under special circumstances.</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/hotfix_branch_flow_thumb.png"><img class="alignnone size-full wp-image-609" title="hotfix_branch_flow_thumb" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/hotfix_branch_flow_thumb.png" alt="Hotfix Branch Flow Thumb" width="458" height="356" /></a></p>
<h2>Room for Improvement</h2>
<p>We&#8217;ve been executing this for a while now and overall are pretty pleased with it. We do have some things we&#8217;d like to improve.</p>
<h3>Automated deployment for master/development</h3>
<p>Particularly for our web systems, we want it so when a pull request is approved and merged into development or master the deployment just happens. Our deployments are scripted so they aren&#8217;t terribly difficult but this is something that deserves to be automated.</p>
<p>In time we&#8217;d like to completely automate our iOS internal builds.</p>
<h3>Automated testing for pull requests</h3>
<p>Part of the review process is to run all tests. For some of our more mature products with lots of tests this can take longer than is comfortable. We&#8217;d like to see our Jenkins server (which we already use for running tests on development nightly) auto test pull requests. This does require a little more scripting between GitHub and Jenkins but is doable and on our calendar to do so.</p>
<hr />
<p>Hopefully you&#8217;ve found this article helpful and informative. Even if you are a solo coder I would encourage you to reach out to friends (maybe through a local meet up like <a title="CocoaHeads" href="http://cocoaheads.org/">CocoaHeads</a> and try to set up some sort of peer code review process. Even if it&#8217;s only on a fifth of your code changes I think you&#8217;ll be surprised in how much you can learn having your code reviewed and reviewing others as well.</p>
<p>If you have any feedback or questions let me know. Thanks.</p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/mP2khddcZ8M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/codelifecycle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/codelifecycle/</feedburner:origLink></item>
		<item>
		<title>An Introduction to Localization with Auto Layout</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/0IJvjpuCbiI/</link>
		<comments>http://blog.ideveloper.tv/localization-with-auto-layout/#comments</comments>
		<pubDate>Thu, 29 Nov 2012 16:03:58 +0000</pubDate>
		<dc:creator>Matt Tancock</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=495</guid>
		<description><![CDATA[One of the things that we didn&#8217;t really get a chance to cover in our Auto layout video course was localization. The good news: It&#8217;s actually relatively straight forward! With Auto layout, Apple has introduced a way of reducing some of the previous pain in this process. Generally, localized xibs should be a thing of [...]]]></description>
				<content:encoded><![CDATA[<p>One of the things that we didn&#8217;t really get a chance to cover in our <a title="Auto Layout course" href="http://ideveloper.tv/video/autolayoutcourse.html">Auto layout video course</a> was localization. The good news: It&#8217;s actually relatively straight forward!</p>
<p>With Auto layout, Apple has introduced a way of reducing some of the previous pain in this process. Generally, localized xibs should be a thing of the past. Or at least only required in exceptional circumstances.</p>
<p><span id="more-495"></span></p>
<h2>String Localization</h2>
<p>It&#8217;s not usually the translation part of the process that causes the pain, it&#8217;s those words you get back from your translator (whether that is someone you&#8217;ve paid, a friend or relative or google translate).</p>
<p>Sometimes the words are much longer than the originals. German is often singled out for this, but several languages have longer words. Likewise the reverse can be true, going from a language that has longer words to one which is shorter. These are often design problems that need thinking about early, not as an afterthought just before submitting your app for review. If your&#8217;re planning on localizing your app, the interface needs to be designed with the necessary fluidity from the beginning.</p>
<p>With that in place, along with the use of auto layout, localization can become reasonably straight forward. You still need to have localized strings, but you don&#8217;t need a separately compiled nib for each language.</p>
<p>The single most important step in getting this to work effectively is to avoid hard-coding the widths of controls which contain localized strings. This can be a large task in itself. (See <a title="Auto Layout &amp; Interface Builder Tutorial: Solving some common problems" href="http://blog.ideveloper.tv/auto-layout-interface-builder-tutorial/">my previous article</a> for some tips &#8211; but no promises!)</p>
<p>I&#8217;ve created a very basic app to demonstrate. Here you can see the interface. I&#8217;ve managed to avoid hard-coding the widths of the views, although some have a &gt;= width on to ensure clipping doesn&#8217;t occur.</p>
<p><img class="alignnone size-full wp-image-523" title="IB layout" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/IB-layout.png" alt="The layout in IB" width="398" height="638" /></p>
<p>I&#8217;m going to localize this into three languages &#8211; English, French &amp; Arabic. The iDeveloper.tv translator is on holiday this week, so I&#8217;m going to have to rely on Google Translate and hope it does a reasonable job!</p>
<p><img class="alignnone size-full wp-image-516" title="l10n_initial" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/l10n_initial.png" alt="localization settings initial" width="741" height="424" /></p>
<p>In project settings, navigate to Localizations. I started off by ticking the Use Base Internationalization, to avoid the multiple xibs, and then added the other languages I wanted. Auto Layout is going to take care of the rest.</p>
<p><img class="alignnone size-full wp-image-522" title="l10n_final" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/l10n_final.png" alt="After localizations are added" width="741" height="424" /></p>
<p>This is what I&#8217;ve ended up with.</p>
<p>A word of warning: It seems that the strings generated are based on whatever strings are in your xib files at the point of performing this option. That means if you start by adding your languages, and then set-up your layout, the strings files will not contain all of the necessary strings, and you&#8217;ll have to regenerate those files.</p>
<p>Your strings files will be grouped under your xib files. Initially, their values will all be the same as the base &#8211; whatever strings you included when creating the xib file.</p>
<p>Here are my final localized strings files:</p>
<p>English:</p>
<script src="https://gist.github.com/4078528.js"></script><noscript><pre><code class="language- ">/* Class = &quot;IBUILabel&quot;; text = &quot;Localized&quot;; ObjectID = &quot;8&quot;; */
&quot;8.text&quot; = &quot;Localized&quot;;

/* Class = &quot;IBUIButton&quot;; normalTitle = &quot;Button 1&quot;; ObjectID = &quot;11&quot;; */
&quot;11.normalTitle&quot; = &quot;Button 1&quot;;

/* Class = &quot;IBUIButton&quot;; normalTitle = &quot;Button 2&quot;; ObjectID = &quot;21&quot;; */
&quot;21.normalTitle&quot; = &quot;Button 2&quot;;
</code></pre></noscript>
<p>French:</p>
<script src="https://gist.github.com/4078532.js"></script><noscript><pre><code class="language- ">/* Class = &quot;IBUILabel&quot;; text = &quot;Localized&quot;; ObjectID = &quot;8&quot;; */
&quot;8.text&quot; = &quot;Localis&Atilde;&copy;e&quot;;

/* Class = &quot;IBUIButton&quot;; normalTitle = &quot;Button 1&quot;; ObjectID = &quot;11&quot;; */
&quot;11.normalTitle&quot; = &quot;Bouton Bouton 1&quot;;

/* Class = &quot;IBUIButton&quot;; normalTitle = &quot;Button 2&quot;; ObjectID = &quot;21&quot;; */
&quot;21.normalTitle&quot; = &quot;Bouton Bouton 2&quot;;</code></pre></noscript>
<p>Arabic:</p>
<script src="https://gist.github.com/4078537.js"></script><noscript><pre><code class="language- ">/* Class = &quot;IBUILabel&quot;; text = &quot;Localized&quot;; ObjectID = &quot;8&quot;; */
&quot;8.text&quot; = &quot;&Ugrave;
<p>And that&#8217;s all you need to do.</p>
<p>You may need to do a clean/build cycle to clear the cache when you&#8217;re running on the simulator, but now switching languages should give you the localized app, and the interface should adapt to the length of the strings.</p>
<p>To demonstrate this more effectively, I&#8217;ve doubled the length of the strings on the French version to make the layout changes more obvious.</p>
<p>English:</p>
<p><img class="alignnone size-full wp-image-520" title="English" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/English.png" alt="English layout screenshot" width="744" height="396" /></p>
<p>French:</p>
<p><img class="alignnone size-full wp-image-519" title="French" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/French.png" alt="French Layout" width="744" height="396" /></p>
<p>Notice how, with the double length strings, the buttons expand, and the textfields contract.</p>
<h2>Left to right or Right to left</h2>
<p>One thing we did mention in the course was the use of leading &amp; trailing as well as left and right when defining relationships between views. Leading and trailing will be reversed for languages that are read from the opposite side of the page. This allows interfaces to be defined which can adapt automatically to localization without developers needing to think about it. If the design is such that when you say left you mean left e.g the layout is in no way dependent on the direction of reading, you can use the &#8216;left&#8217; attribute.</p>
<p>But be careful. If you start mixing your lefts and your leadings, and your rights and your trailings you could end up with a real mess of an interface when a locale that has the opposite reading direction uses your app.</p>
<p>You can alter this setting on a per constraint basis in IB in the inspector:</p>
<p><img class="alignnone size-full wp-image-517" title="LTR" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/LTR.png" alt="Selecting leading to trailing" width="260" height="265" /></p>
<p>When you run your app in a language that reads right to left:</p>
<p>E.g Arabic:</p>
<p><img class="alignnone size-full wp-image-518" title="Arabic" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Arabic.png" alt="Arabic Layout" width="744" height="396" /></p>
<p>The order changes as you&#8217;d expect. Buttons first, followed by text fields.</p>
<p>Hopefully this demonstrates the potential simplicity of localization when combined with auto layout.</p>
<p>Two Final tips:</p>
<ol>
<li>If you want to test your layout works, and you&#8217;re not at the point of being able to add translated strings, rather than just doubling manually as I did above, you can pass a launch argument. In your scheme you want to pass: -NSDoubleLocalizedStrings YES.</li>
<li>If you&#8217;re testing by changing the language either on an actual device or in the simulator, it&#8217;s probably a good idea to memorize the steps to get to the language settings, so you can change your language back without too much hassle. Just saying.</li>
</ol>
<h2>Related:</h2>
<p>For more on Auto Layout: <strong>iDeveloper.tv</strong> has a course available which covers using Interface Builder and creating constraints in code as well as introducing the debugging tools which are available. All sample code is included. You can see a sample and purchase the course <a href="http://ideveloper.tv/video/autolayoutcourse.html">here</a></p>
<h2>About the Author:</h2>
<div class="aboutTheAuthor"><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/me128.jpg"><br />
<img class="authorImage" title="Matt Tancock" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/me128.jpg" alt="Photo of Matt Tancock" width="128" height="128" /><br />
</a></p>
<h2 class="authorName">Matt Tancock</h2>
<p>After spending many years as a teacher and hobby developer Matt has now made his way full time into iOS and OSX development as a researcher and developer for iDeveloper TV.</p>
<p class="authorContact">Twitter: <a title="Matt Tancock on twitter" href="http://twitter.com/mtancock">@mtancock</a><br />
App.net: <a title="Matt Tancock on app.net" href="https://alpha.app.net/mtancock">@mtancock</a><br />
Website: <a title="iDeveloper.tv" href="http://ideveloper.tv">iDeveloper.tv</a></p>
</div>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/0IJvjpuCbiI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/localization-with-auto-layout/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/localization-with-auto-layout/</feedburner:origLink></item>
		<item>
		<title>Getting Started With Automated UI Testing For iOS</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/SnL3WT_oLLg/</link>
		<comments>http://blog.ideveloper.tv/automated-ui-testing-for-ios/#comments</comments>
		<pubDate>Mon, 26 Nov 2012 16:00:02 +0000</pubDate>
		<dc:creator>Chris Cornelis</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=223</guid>
		<description><![CDATA[UIAutomation basics The UI Automation API has been part of the iOS SDK since version 4.0. It supports running automated tests in Instruments using Javascript. If your app already has accessibility/VoiceOver support, I have some good news: UI Automation uses the UIAccessibility protocol to trigger events. Getting Started There are basically 2 ways to create [...]]]></description>
				<content:encoded><![CDATA[<h2>UIAutomation basics</h2>
<p>The UI Automation API has been part of the iOS SDK since version 4.0. It supports running automated tests in Instruments using Javascript.</p>
<p>If your app already has accessibility/VoiceOver support, I have some good news: UI Automation uses the UIAccessibility protocol to trigger events.</p>
<p><span id="more-223"></span></p>
<h2>Getting Started</h2>
<p>There are basically 2 ways to create a test script. You either record a test scenario or you program it manually. This post concentrates on the programming option. I will use Apple&#8217;s sample <a title="simpleDrillDown App" href="http://developer.apple.com/library/ios/#samplecode/SimpleDrillDown/Introduction/Intro.html">SimpleDrillDown</a> sample app as a starting point.</p>
<p>Open the SimpleDrillDown project in XCode. The start screen of the app looks like this:</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/playsview.png"><img class="alignnone size-full wp-image-231" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/playsview.png" alt="screenshot of simple drop down " width="322" height="482" /></a></p>
<p>In order for the UI elements to be easily accessible from Javascript, we use the <code>accessibilityLabel</code> property to give them a meaningful name.</p>
<p>RootViewController.m:</p>
<script src="https://gist.github.com/4058674.js"></script><noscript><pre><code class="language-objective-c objective-c">- (void)viewDidLoad {
    [super viewDidLoad];
	self.title = NSLocalizedString(@&quot;Plays&quot;, @&quot;Master view navigation title&quot;);
	//Following line added
	self.tableView.accessibilityLabel = NSLocalizedString(@&quot;RootTable&quot;, @&quot;Accessibility label to describe RootTable&quot;);
}</code></pre></noscript>
<p>DetailViewController.m:</p>
<script src="https://gist.github.com/4058682.js"></script><noscript><pre><code class="language-objective-c objective-c">- (void)viewDidLoad {
    [super viewDidLoad];
    //Following line added
    self.tableView.accessibilityLabel = NSLocalizedString(@&quot;DetailTable&quot;, @&quot;Accessibility label for the detailTable&quot;);
}</code></pre></noscript>
<p>Select Profile from the build button to launch Instruments and select the Automation template￼</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/selectprofile.png"><img class="alignnone size-full wp-image-228" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/selectprofile.png" alt="screenshot of selecting instruments (profile)" width="184" height="205" /></a></p>
<p>Immediately stop the recording. Create a new test script by clicking on the Add button in the Scripts panel and select “Create&#8230;” from the popup menu.</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/addscript.png"><img class="alignnone size-full wp-image-229" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/addscript.png" alt="screenshot of select create from add script menu" width="213" height="180" /></a></p>
<p>Name the script whatever you want by double clicking on its name. In the Script editor right click on the main panel to export the script (preferably to a location inside the Xcode project folder structure).</p>
<p>To get a feeling with the different UI elements that are available, <code>logElementTree()</code> is your best friend. Paste the following code in the Script editor:</p>
<script src="https://gist.github.com/4058689.js"></script><noscript><pre><code class="language-javascript javascript">// Setup  
var target = UIATarget.localTarget();  
var app = target.frontMostApp(); 
var mainWindow = app.mainWindow();

function initialScreenTest() {  
    var testname = &quot;Initial screen test&quot;;  
    UIALogger.logStart(testname);  
    
	mainWindow.logElementTree();
    
    UIALogger.logPass(testname);  
}  

initialScreenTest();
</code></pre></noscript>
<p>When you run the script (⌘R) the trace log contains the following output:</p>
<p>￼<a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/tracelog.png"><img class="alignnone size-full wp-image-230" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/tracelog.png" alt="screenshot of initial tracelog" width="750" height="231" /></a></p>
<p>As expected, the table view name is “RootTable”. This makes it easy to access the table in Javascript. We have enough info to add some checks to the script:</p>
<script src="https://gist.github.com/4058694.js"></script><noscript><pre><code class="language-javascript javascript">UIALogger.logStart(testname);  
    
var rootTable = mainWindow.tableViews()[&quot;RootTable&quot;];
if (rootTable.cells().length != 5) {
	throw(&quot;The root table does not have the expected number of rows.&quot;);
}
if (rootTable.cells()[0].name() != &quot;Julius Caesar&quot;) {
    	throw(&quot;Row 1 of the root table does not have the expected content.&quot;);
}
    
UIALogger.logPass(testname); </code></pre></noscript>
<p>To avoid duplication of the same test code over and over again, it’s best to add a helper function to the script.<br />
The test script now looks like this:</p>
<script src="https://gist.github.com/4058706.js"></script><noscript><pre><code class="language-javascript javascript">// Setup  
var target = UIATarget.localTarget();  
var app = target.frontMostApp(); 
var mainWindow = app.mainWindow()

//=================
// Helper functions  
//=================

function assertEquals(expected, actual, message) {
    if (expected != actual) {
        if (message) {
            throw(message + &quot;  [expected = &quot; + expected + &quot; actual = &quot; + actual + &quot;]&quot;);
        } else {
            throw(&quot;assertEquals failed: expected = &quot; + expected + &quot; actual = &quot; + actual);
        }
    }
}

//=================
// Test functions  
//=================

function initialScreenTest() {  
    var testname = &quot;Initial screen test&quot;;  
    UIALogger.logStart(testname);  
    
	var rootTable = mainWindow.tableViews()[&quot;RootTable&quot;];
     assertEquals(5, rootTable.cells().length);
	assertEquals(&quot;Julius Caesar&quot;, rootTable.cells()[0].name());
	assertEquals(&quot;King Lear&quot;, rootTable.cells()[1].name());
	assertEquals(&quot;Othello&quot;, rootTable.cells()[2].name());
	assertEquals(&quot;Henry IV, Pt 1&quot;, rootTable.cells()[3].name());
	assertEquals(&quot;The Tempest&quot;, rootTable.cells()[4].name());
	
    UIALogger.logPass(testname);  
}  

initialScreenTest();</code></pre></noscript>
<p>If you run the test script again, you have a basic automated UI test. It’s that easy!</p>
<h2>Simulate gestures</h2>
<p>The next part of the test selects a play and checks if the detail table is correctly shown.<br />
Simulating a tap on e.g. the “Othello” row is just one line of code:</p>
<script src="https://gist.github.com/4058737.js"></script><noscript><pre><code class="language-javascript javascript">rootTable.cells()[&quot;Othello&quot;].tap();</code></pre></noscript>
<p>Then wait 1 second for the animation to be finished before checking the detail table groups/rows:</p>
<script src="https://gist.github.com/4058745.js"></script><noscript><pre><code class="language-javascript javascript">target.delay(1);</code></pre></noscript>
<p>After the delay add some more checks. The extended test function should now looks like this:</p>
<script src="https://gist.github.com/4058719.js"></script><noscript><pre><code class="language-javascript javascript">function initialScreenTest() {  
    var testname = &quot;Initial screen test&quot;;  
    UIALogger.logStart(testname);  
    
	var rootTable = mainWindow.tableViews()[&quot;RootTable&quot;];
	assertEquals(5, rootTable.cells().length);
	assertEquals(&quot;Julius Caesar&quot;, rootTable.cells()[0].name());
	assertEquals(&quot;King Lear&quot;, rootTable.cells()[1].name());
	assertEquals(&quot;Othello&quot;, rootTable.cells()[2].name());
	assertEquals(&quot;Henry IV, Pt 1&quot;, rootTable.cells()[3].name());
	assertEquals(&quot;The Tempest&quot;, rootTable.cells()[4].name());

	//Following code added
	rootTable.cells()[&quot;Othello&quot;].tap();	
	target.delay(1);
	var detailTable = mainWindow.tableViews()[&quot;DetailTable&quot;];
	assertEquals(3, detailTable.groups().length);
	assertEquals(&quot;Date&quot;, detailTable.groups()[0].name());
	assertEquals(&quot;Genre&quot;, detailTable.groups()[1].name());
	assertEquals(&quot;Main Characters&quot;, detailTable.groups()[2].name());
	// Check some rows
	assertEquals(&quot;1604&quot;, detailTable.cells()[0].name());
	assertEquals(&quot;Tragedy&quot;, detailTable.cells()[1].name());
	assertEquals(&quot;Bianca&quot;, detailTable.cells()[2].name());

    UIALogger.logPass(testname);  
}  
</code></pre></noscript>
<p>If you want to simulate other gestures than just a simple tap, take a look at the following functions:<br />
<code>touchAndHold()</code>, <code>doubleTap()</code>, <code>twoFingerTap()</code>, <code>tapWithOptions()</code>, <code>dragInsideWithOptions()</code>, <code>flickInsideWithOptions()</code> and <code>scrollToVisible()</code>.</p>
<h2>Simulate typing</h2>
<p>Another common action in an iOS app, is typing text in a UITextField. It’s easy to set the value of the UITextField with the <code>setValue()</code> function, but that doesn’t generate any keyboard events. Simulating typing on the keyboard used to be pretty complicated, but since iOS 5.0 a new function was introduced: <code>typeString()</code>.</p>
<p>To simulate a real life situation where a user actually uses the keyboard to type, you need something like this:</p>
<script src="https://gist.github.com/4058771.js"></script><noscript><pre><code class="language-javascript javascript">//activate text field
urlTextField.tap();
//wait for onscreen keyboard to appear
target.delay(1);

app.keyboard().typeString(&quot;Some text&quot;);
app.keyboard().buttons().firstWithName(&quot;return&quot;).tap();</code></pre></noscript>
<h2>Other tidbits &amp; advice</h2>
<p>With the above script sample code, you can already test quite a lot of the functionality of most iOS apps. However it’s worth mentioning that other user actions are also pretty easy to simulate.</p>
<p>Rotate the device:</p>
<script src="https://gist.github.com/4058778.js"></script><noscript><pre><code class="language-javascript javascript">target.setDeviceOrientation(UIA_DEVICE_ORIENTATION_LANDSCAPERIGHT);</code></pre></noscript>
<p>Send an app to the background and return after a delay:<br />
<script src="https://gist.github.com/4058780.js"></script><noscript><pre><code class="language-javascript javascript">target.deactivateAppForDuration(10);</code></pre></noscript></p>
<p>Don’t forget to put delays in your test code whenever an animation occurs or when the app downloads data from e.g. a web service:<br />
<script src="https://gist.github.com/4058745.js"></script><noscript><pre><code class="language-javascript javascript">target.delay(1);</code></pre></noscript></p>
<p>When you’re stuck writing your test, remember that <code>logElementTree()</code> and <code>logElement()</code> are your best friends. These functions are available for all UI elements, so you don’t always have to log the complete main window tree.</p>
<p>While writing your tests, keep in mind that you’ll have to maintain them as your app evolves over time. Your test code deserves as much attention as your app code:</p>
<ul>
<li>Split your test code in logical test functions</li>
<li>Use helper functions to avoid writing the same test code over and over again</li>
<li>Use comments whenever needed</li>
</ul>
<p>Personally, I always run my tests on a real device, preferably the least performant one I have. That’s usually also the device that generates memory warnings more often than when you run the tests on the latest and greatest device.</p>
<p>It’s a good habit to run UI tests regularly when you make changes to your app. That way you’ll detect bugs shortly after you made the change that causes the bug.</p>
<p>The UI tests for my PhotoMeta app require 20 minutes to run (on a first generation iPad) and I run them at least twice a day. Once during lunch and once in the evening.</p>
<h2>Useful links</h2>
<p><a title="UI Automation Reference" href="https://developer.apple.com/library/ios/#documentation/DeveloperTools/Reference/UIAutomationRef/Introduction/Introduction.html">UI Automation Reference</a><br />
<a title="UIAElement Class Reference" href="http://developer.apple.com/library/ios/#documentation/ToolsLanguages/Reference/UIAElementClassReference/UIAElement/UIAElement.html">UIAElement Class Reference</a></p>
<h2>About the Author:</h2>
<div class="aboutTheAuthor"><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/me128.jpg"><br />
<img class="authorImage" title="Chris Cornelis" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/chriscornelis128.png" alt="Photo of Chris Cornelis" width="128" height="128" /><br />
</a></p>
<h2 class="authorName">Chris Cornelis</h2>
<p>Chris is a software engineer with over 20 years of experience encompassing many different technologies. His projects have included a traffic simulation tool, database middleware, a front-end tool for digital presses, a container terminal management system and a SaaS platform for personalised marketing.</p>
<p>In 2008, when the App Store launched, he founded Galarina. Galarina specializes in the development of unique and useful photography related solutions for the iOS platform with 5 apps in the App Store. Chris is also a freelance iOS engineer currently pushing the Everest app to new heights.</p>
<p class="authorContact">Twitter: <a title="Chris Cornelis on twitter" href="http://twitter.com/GalarinaDev">@GalarinaDev</a><br />
Website: <a title="Chris's Website" href="http://www.galarina-apps.com/">Chris&#8217;s Website </a></p>
</div>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/SnL3WT_oLLg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/automated-ui-testing-for-ios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/automated-ui-testing-for-ios/</feedburner:origLink></item>
		<item>
		<title>A Look Back: Foundations of Objective-C – André Pang – NSConf 2009</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/KG04loieIfs/</link>
		<comments>http://blog.ideveloper.tv/a-look-back-foundations-of-objective-c-andre-pang-nsconf-2009/#comments</comments>
		<pubDate>Thu, 22 Nov 2012 16:00:18 +0000</pubDate>
		<dc:creator>Matt Tancock</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[NSConference]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=647</guid>
		<description><![CDATA[@quanganhdo requested access to this video in our archives. It had previously been available for free but had been retired, so I got Dave to dig it out and we&#8217;ve uploaded it again. This is André Pang, and it&#8217;s back from the very first NSConference. (Can you believe that next year&#8217;s NSConf will be the 5th?) &#160; [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://twitter.com/quanganhdo" rel="nofollow">@quanganhdo</a> requested access to this video in our archives. It had previously been available for free but had been retired, so I got Dave to dig it out and we&#8217;ve uploaded it again.</p>
<p>This is André Pang, and it&#8217;s back from the very first NSConference. (Can you believe that <a href="http://ideveloper.tv/nsconference/">next year&#8217;s NSConf</a> will be the 5th?)<br />
<span id="more-647"></span><br />
<!-- LeadPlayer video embed code start [ video: 50AA50CE4F9C9 ] --><div><script type="text/javascript" src="http://s3.amazonaws.com/cdn.leadbrite.com/leadplayer/r0032/js/leadplayer.js"></script></div><div id="leadplayer_video_element_50AA50CE4F9C9" style="width:640px;height:360px" itemscope itemtype="http://schema.org/VideoObject"><meta itemprop="embedUrl" content="http://www.youtube.com/embed/FXD4dNhU764?loop=0&amp;autoplay=0&amp;controls=1&amp;modestbranding=1&amp;showsearch=0&amp;showinfo=0&amp;hd=0" /><meta itemprop="name" content="Foundations of Objective-C - André Pang - NSConf 2009" /><meta itemprop="description" content="André Pang talks about the Foundations of Objective-C at the very first NSConf back in 2009" /><meta itemprop="width" content="640" /><meta itemprop="height" content="360" /><meta itemprop="thumbnailUrl" content="https://img.youtube.com/vi/FXD4dNhU764/hqdefault.jpg" /><iframe type="text/html" width="640" height="360" src="https://www.youtube.com/embed/FXD4dNhU764?loop=0&amp;autoplay=0&amp;controls=1&amp;modestbranding=1&amp;showsearch=0&amp;showinfo=0&amp;hd=0" frameborder="0" allowfullscreen></iframe></div><div><script type="text/javascript">jQLeadBrite("#leadplayer_video_element_50AA50CE4F9C9").leadplayer(false, "eyJnYSI6dHJ1ZSwib3ZlcmxheSI6ZmFsc2UsInBvd2VyZWRfYnkiOmZhbHNlLCJwb3dlcmVkX2J5X2xpbmsiOiJodHRwOlwvXC93d3cubGVhZHBsYXllci5jb21cLyIsImNvbG9yMSI6IiNGNUJCMEMiLCJjb2xvcjIiOiIjMTc5OENEIiwiY29sb3IzIjoiI0Y1QkIwQyIsInR4dF9zdWJtaXQiOiJTVUJNSVQiLCJ0eHRfcGxheSI6IlBMQVkiLCJ0eHRfZW1sIjoiWW91ciBFbWFpbCBBZGRyZXNzIiwidHh0X25hbWUiOiJZb3VyIE5hbWUiLCJ0eHRfaW52YWxpZF9lbWwiOiJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCIsInR4dF9pbnZhbGlkX25hbWUiOiJQbGVhc2UgZW50ZXIgeW91ciBuYW1lIiwibHBfc291cmNlIjoiV1AgUGx1Z2luIDEuNC4xLjYgVW5saW1pdGVkIiwiaWQiOiI1MEFBNTBDRTRGOUM5Iiwid2lkdGgiOjY0MCwiaGVpZ2h0IjozNjAsInRodW1ibmFpbCI6IiIsInRpdGxlIjoiRm91bmRhdGlvbnMgb2YgT2JqZWN0aXZlLUMgLSBBbmRyXHUwMGU5IFBhbmcgLSBOU0NvbmYgMjAwOSIsImRlc2NyaXB0aW9uIjoiQW5kclx1MDBlOSBQYW5nIHRhbGtzIGFib3V0IHRoZSBGb3VuZGF0aW9ucyBvZiBPYmplY3RpdmUtQyBhdCB0aGUgdmVyeSBmaXJzdCBOU0NvbmYgYmFjayBpbiAyMDA5IiwiYXV0b3BsYXkiOmZhbHNlLCJzaG93X3RpbWVsaW5lIjp0cnVlLCJlbmFibGVfaGQiOmZhbHNlLCJvcHQiOmZhbHNlLCJjdGEiOmZhbHNlLCJ5bSI6IkZYRDRkTmhVNzY0In0=");</script></div><!-- LeadPlayer video embed code end [ video: 50AA50CE4F9C9 ] --></p>
<p>&nbsp;</p>
<p>I thought I should give it a watch:</p>
<p>In his presentation, André starts with the foundations of Objective-C, how things are stored in memory and then goes on to look at the philosophy of programming.</p>
<p>Although the tools, the operating systems and the devices may all have changed since this talk, the principles that he considers are still important:</p>
<p>André talks about Small Talk, Lambda calculas, why assignment is bad, uniformity, functional programming and Haskell and the lessons we can learn for programming in Objective-C.</p>
<p>If you were there, watch and reminisce; if you weren&#8217;t, see what you missed (and put the dates for <a href="http://ideveloper.tv/nsconference/">NSConf 2013</a> into Calendar!)</p>
<p>(Oh and our production values have improved significantly since our first conference.)</p>
<h2>About the Author:</h2>
<div class="aboutTheAuthor"><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/me128.jpg"><br />
<img class="authorImage" title="Matt Tancock" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/me128.jpg" alt="Photo of Matt Tancock" width="128" height="128" /><br />
</a></p>
<h2 class="authorName">Matt Tancock</h2>
<p>After spending many years as a teacher and hobby developer Matt has now made his way full time into iOS and OSX development as a researcher and developer for iDeveloper TV.</p>
<p class="authorContact">Twitter: <a title="Matt Tancock on twitter" href="http://twitter.com/mtancock" rel="nofollow">@mtancock</a><br />
App.net: <a title="Matt Tancock on app.net" href="https://alpha.app.net/mtancock" rel="nofollow">@mtancock</a><br />
Website: <a title="iDeveloper.tv" href="http://ideveloper.tv">iDeveloper.tv</a></p>
</div>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/KG04loieIfs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/a-look-back-foundations-of-objective-c-andre-pang-nsconf-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/a-look-back-foundations-of-objective-c-andre-pang-nsconf-2009/</feedburner:origLink></item>
		<item>
		<title>Stuff yourself this Thanksgiving</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/aiyT2aYqDY4/</link>
		<comments>http://blog.ideveloper.tv/stuff-yourself-this-thanksgiving/#comments</comments>
		<pubDate>Wed, 21 Nov 2012 17:45:22 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=776</guid>
		<description><![CDATA[ What is the biggest turkey you’ve ever eaten in one sitting? Whatever it is, we reckon Matt – one of our trainers here at iDeveloper TV – could out eat you… Here at iDeveloper TV our aim is to make you better developers. All our training videos and conferences are focused around this one goal. [...]]]></description>
				<content:encoded><![CDATA[<h2> What is the biggest turkey you’ve ever eaten in one sitting? Whatever it is, we reckon Matt – one of our trainers here at iDeveloper TV – could out eat you…</h2>
<p style="text-align: center;"><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/me-polaroid-turkey_trans.png"><img class="aligncenter size-full wp-image-787" title="me polaroid turkey_trans" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/me-polaroid-turkey_trans.png" alt="" width="477" height="596" /></a></p>
<p style="text-align: left;">Here at iDeveloper TV our aim is to make you better developers.</p>
<p>All our training videos and conferences are focused around this one goal.</p>
<p>So when we had a meeting here in the shed (that’s what we call the cold lean-to garage we’ve moved into here in the UK) about what we should do for a Black Friday sale, Matt said – “why not just let our amazing customers have access to all our content?” (Well this is almost exactly what he said after going on and on about eating turkey…)</p>
<p>This thanksgiving we’ve put together a very tasty bundle that will get your mouth watering…</p>
<p>In it you will find a $150 voucher that can be redeemed against any of the great videos we’ve got coming out in 2013. You don&#8217;t have to spend the voucher all at once and it will never expire. On top of this we’re throwing in ALL of the training and conference videos currently available in our store (and even some that aren’t) – these alone are worth over $640.</p>
<p><strong>So this delicious bundle contains over $790 worth of value and we are going to let you stuff yourself with all this techie goodness for just $99!</strong></p>
<p>So that we don’t go out of business, we have only a limited number of these deals available until midnight on Monday 26th November, PST.</p>
<p>So this Thanksgiving you can sit back, grab a massive turkey leg and a carafe of your favorite gravy and watch as much iDeveloper TV as you want.</p>
<p>(Just make sure you spend some time with family too, ok?)</p>
<p><a title="Thanksgiving Link" href="http://ideveloper.tv/index.html?utm_source=iDTV&amp;utm_medium=blog&amp;utm_campaign=thanksgiving">Grab this deal now, before it’s too late</a></p>
<p>Happy Thanksgiving,</p>
<p>Scotty</p>
<p>p.s. also, as it’s a time of Thanksgiving, to say thanks if you buy this deal we’ll send you a coupon to give to a friend that will get them a copy of Josh Clark’s NSConf mini session – “Buttons are a hack” for free.</p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/aiyT2aYqDY4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/stuff-yourself-this-thanksgiving/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/stuff-yourself-this-thanksgiving/</feedburner:origLink></item>
		<item>
		<title>Podcast 73 – The Best of iOS 6</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/CaUgnP1ip4M/</link>
		<comments>http://blog.ideveloper.tv/podcast-73/#comments</comments>
		<pubDate>Wed, 21 Nov 2012 17:38:03 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=774</guid>
		<description><![CDATA[Scotty talks with author and blogger Erica Sadun about her favorite bits of iOS 6. Links The Unofficial Apple Weblog Core Cookbook an Amazon Core Cookbook Early Preview Advanced Cookbook on Amazon (Pre-Order) CORE Constraints Digital Short ADVANCED Documents Guest Details Scotty from iDeveloper TV, Twitter: @macdevnet, App.Net: Scotty Erica Sadun, Blog: Erica Sadun , [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty talks with author and blogger Erica Sadun about her favorite bits of iOS 6.</p>
<p><span id="more-774"></span></p>
<h2 id="links">Links</h2>
<ul>
<li><a title="The Unofficial Apple Weblog" href="http://www.tuaw.com">The Unofficial Apple Weblog</a></li>
<li><a href="http://www.amazon.com/Core-Developers-Cookbook-Edition-Library/dp/0321884213/ref=sr_1_1?ie=UTF8&amp;qid=1353519169&amp;sr=8-1&amp;keywords=ios+6+cookbook">Core Cookbook an Amazon</a></li>
<li><a href="http://www.informit.com/store/product.aspx?isbn=9780133361704">Core Cookbook Early Preview</a></li>
<li><a href="http://www.amazon.com/Advanced-Developers-Cookbook-Edition-Library/dp/0321884221/ref=sr_1_2?ie=UTF8&amp;qid=1353519169&amp;sr=8-2&amp;keywords=ios+6+cookbook">Advanced Cookbook on Amazon (Pre-Order)</a></li>
<li><a href="http://www.informit.com/store/product.aspx?isbn=9780133364415">CORE Constraints Digital Short</a></li>
<li><a href="http://www.informit.com/store/documents-and-data-sharing-the-advanced-ios-6-developers-9780133376173">ADVANCED Documents</a></li>
</ul>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv">iDeveloper TV</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>Erica Sadun, Blog: <a title="Erica Blog" href="http://ericasadun.com/">Erica Sadun</a> , Twitter:<a href="http://twitter.com/ericasadun">@ericasadun</a>, App.Net: <a href="http://alpha.app.net/ericasadun">ericasadun</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloperlive073.m4a">here</a></p>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" alt="Invasivecode Logo" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/CaUgnP1ip4M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast-73/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast-73/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/kItdwSlgSDg/ideveloperlive073.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloperlive073.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>mogenerator 1.27 Released</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/M7ABZhoTAZo/</link>
		<comments>http://blog.ideveloper.tv/mogenerator127/#comments</comments>
		<pubDate>Tue, 20 Nov 2012 12:00:11 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Core Data]]></category>
		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=669</guid>
		<description><![CDATA[Johnathan Wolf Rentzsch has released version 1.27 of his open source utility mogenerator From the description on the mogenerator homepage mogenerator generates Objective-C code for your Core Data custom classes Unlike Xcode, mogenerator manages two classes per entity: one for machines, one for humans The machine class can always be overwritten to match the data model, with humans’ work effortlessly [...]]]></description>
				<content:encoded><![CDATA[<p><a title="Johnathan Wolf Rentzch" href="http://twitter.com/rentzsch" rel="nofollow">Johnathan Wolf Rentzsch</a> has released version 1.27 of his open source utility <a title="mogenerator" href="http://rentzsch.github.com/mogenerator/">mogenerator</a></p>
<p>From the description on the mogenerator homepage</p>
<blockquote><p><strong>mogenerator</strong> generates Objective-C code for your <a href="http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html">Core Data</a> custom classes</p>
<p>Unlike Xcode, mogenerator manages <em>two</em> classes per entity: one for <strong>machines</strong>, one for <strong>humans</strong></p>
<p>The machine class can always be overwritten to match the data model, with humans’ work effortlessly preserved</p></blockquote>
<p>In my opinion, if you use custom <code>ManagedObject</code> classes in Core Data and you are not using mogenerator then you are doing it wrong.</p>
<p>You can see what&#8217;s new in version 1.27 <a title="What's New in mogenerator 1.27" href="http://rentzsch.tumblr.com/post/35713971034/mogenerator-1-27">here</a></p>
<p><span id="more-669"></span></p>
<h2>About the Author:</h2>
<div class="aboutTheAuthor"><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Scotty.png"><img class="authorImage" title="Steve Scott" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Scotty.png" alt="Photo of Steve Scott" width="128" height="128" /><br />
</a></p>
<h2 class="authorName">Steve Scott (Scotty)</h2>
<p>Steve Scott better known as Scotty is the founder of iDeveloper TV and host of the iDeveloper Live Podcast.</p>
<p>He has been a developer since 1987 when he started writing accounting software using COBOL on a Convergent Unix machine using vi as his work editor. Since then he has worked on mainframes, 16bit and 32 bit Windows and .NET. Since 2007 he has worked on OS X and more recently iOS.</p>
<p>At iDeveloper TV, Scotty does community stuff, asks questions, makes the tea and is generally a pain about the place.</p>
<p class="authorContact">Twitter: <a title="Scotty on twitter" href="http://twitter.com/macdevnet">@macdevnet</a><br />
App.net: <a title="Scotty on app.net" href="https://alpha.app.net/scotty">@scotty</a><br />
Website: <a title="iDeveloper.tv" href="http://ideveloper.tv">iDeveloper.tv</a></p>
</div>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/M7ABZhoTAZo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/mogenerator127/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/mogenerator127/</feedburner:origLink></item>
		<item>
		<title>Rectangles in Objective-C Part 2</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/9rCnEc1q5yc/</link>
		<comments>http://blog.ideveloper.tv/rectanglespart2/#comments</comments>
		<pubDate>Tue, 20 Nov 2012 11:00:43 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Core Graphics]]></category>
		<category><![CDATA[Rectangles]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=659</guid>
		<description><![CDATA[Over on the Big Nerd Ranch Blog, Mark Darymple has written the second part of his introduction to handling rectangles in Objective-C.  (You can read part 1 here). In this second article, Mark looks at numerous ways of manipulating rectangles: not only using Core Graphics, but also using functionality hidden away in other parts of Cocoa and Cocoa Touch such [...]]]></description>
				<content:encoded><![CDATA[<p>Over on the Big Nerd Ranch Blog, <a href="https://twitter.com/borkware" rel="nofollow">Mark Darymple</a> has written the <a title="Rectangles Part 2" href="http://weblog.bignerdranch.com/1136-rectangles-part-2/">second part</a> of his introduction to handling rectangles in Objective-C.  (You can read part 1 <a title="Article on Rectangles" href="http://weblog.bignerdranch.com/1087-rectangles-part-1/">here</a>).</p>
<p>In this second article, Mark looks at numerous ways of manipulating rectangles: not only using Core Graphics, but also using functionality hidden away in other parts of Cocoa and Cocoa Touch such as <code>SSCenteredRectInRect</code> from the ScreenSaver framework.</p>
<p>As Mark says</p>
<blockquote><p>As you can see, there are a lot of convenience functions provided by Core Graphics, and some provided by Cocoa or CocoaTouch. If you find yourself drawn to mucking around with rectangle origins and sizes directly, there might already be a function available that will do that.</p></blockquote>
<p><span id="more-659"></span></p>
<h2>About the Author:</h2>
<div class="aboutTheAuthor"><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Scotty.png"><img class="authorImage" title="Steve Scott" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Scotty.png" alt="Photo of Steve Scott" width="128" height="128" /><br />
</a></p>
<h2 class="authorName">Steve Scott (Scotty)</h2>
<p>Steve Scott better known as Scotty is the founder of iDeveloper TV and host of the iDeveloper Live Podcast.</p>
<p>He has been a developer since 1987 when he started writing accounting software using COBOL on a Convergent Unix machine using vi as his work editor. Since then he has worked on mainframes, 16bit and 32 bit Windows and .NET. Since 2007 he has worked on OS X and more recently iOS.</p>
<p>At iDeveloper TV, Scotty does community stuff, asks questions, makes the tea and is generally a pain about the place.</p>
<p class="authorContact">Twitter: <a title="Scotty on twitter" href="http://twitter.com/macdevnet">@macdevnet</a><br />
App.net: <a title="Scotty on app.net" href="https://alpha.app.net/scotty">@scotty</a><br />
Website: <a title="iDeveloper.tv" href="http://ideveloper.tv">iDeveloper.tv</a></p>
</div>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/9rCnEc1q5yc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/rectanglespart2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/rectanglespart2/</feedburner:origLink></item>
		<item>
		<title>At last, a merge tool to love?</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/SucMjiEfqoU/</link>
		<comments>http://blog.ideveloper.tv/mergetool/#comments</comments>
		<pubDate>Tue, 20 Nov 2012 10:00:17 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=682</guid>
		<description><![CDATA[If you follow me on Twitter you will know that a few months ago I was looking for a visual merge tool. Despite trying several recommendations I never found anything I actually felt I would enjoy using. That&#8217;s why when Black Pixel announced the release of the Kaleidoscope 2.0 BETA yesterday and I read the following [...]]]></description>
				<content:encoded><![CDATA[<p>If you <a href="http://twitter.com/macdevnet" rel="nofollow">follow me on Twitter</a> you will know that a few months ago I was looking for a visual merge tool. Despite trying several recommendations I never found anything I actually felt I would enjoy using. That&#8217;s why when <a href="http://blackpixel.com">Black Pixel</a> announced the release of the <a href="http://www.kaleidoscopeapp.com/beta">Kaleidoscope 2.0 BETA</a> yesterday and I read the following I got quite excited:</p>
<blockquote><p>New in Kaleidoscope 2, you can use Kaleidoscope as both diff and merge tools for your source control system of choice. Working with a team? Use Kaleidoscope to help you do code reviews. Working on a branch? Let Kaleidoscope help you merge your changes cleanly and easily the first time.</p></blockquote>
<p>Kaleidoscope is my diff tool of choice, so for it to now include merging is just about perfect. So without further ado the beta was downloaded and the merge capabilities put to an immediate if not vigorous test.</p>
<p><span id="more-682"></span></p>
<h2>Set Up</h2>
<p>First I set up Kaleidoscope to act as Git&#8217;s default merge tool. The process was very simple and involved pressing one button.</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Kaleidoscope-01.png"><img class="alignnone size-full wp-image-686" title="Kaleidoscope-01" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Kaleidoscope-01.png" alt="" width="444" height="119" /></a></p>
<p>Unfortunately pressing the button made my entire machine hang and need a hard reboot to recover (remember this is a beta release).</p>
<h2>Merging</h2>
<p>After the restart I created a simple text file and went about creating a merge conflict on the file. I then held my breath and typed <code>git mergetool </code>and there it was.</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Kaleidoscope-021.png"><img class="wp-image-703 alignnone" title="Kaleidoscope-02" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Kaleidoscope-021-1024x652.png" alt="Kaleidoscope Unified View" width="584" height="371" /><br />
(Click on image to enlarge it)</a></p>
<p>&nbsp;</p>
<p>Initially I was presented with the &#8220;Unified View&#8221;  but there was also a &#8220;Fluid View&#8221;</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Kaleidoscope-031.png"><img class="wp-image-699 alignnone" title="Kaleidoscope-03" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Kaleidoscope-031-1024x652.png" alt="" width="584" height="371" /><br />
(Click on image to enlarge it)</a></p>
<p>&nbsp;</p>
<p>and a &#8220;Blocks View&#8221;<br />
<a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Kaleidoscope-041.png"><img class="alignnone  wp-image-700" title="Kaleidoscope-04" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Kaleidoscope-041-1024x652.png" alt="Kaleidoscope Blocks View" width="584" height="371" /><br />
(Click on image to enlarge it)</a></p>
<p>&nbsp;</p>
<p>Merging is achieved through either choosing a menu option or using a keyboard shortcut.</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Kaleidoscope-051.png"><img class="alignnone size-full wp-image-701" title="Kaleidoscope-05" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Kaleidoscope-051.png" alt="Kaleidoscope Merge Menu" width="277" height="145" /></a></p>
<p>I preferred using the &#8220;Fluid Layout&#8221;  but this was an incredibly small example and when looking at more complex merges one of the other layouts may work better.</p>
<p>The  final result in &#8220;Fluid Layout&#8221; can be seen below.</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Kaleidoscope-061.png"><img class="alignnone size-large wp-image-702" title="Kaleidoscope-06" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Kaleidoscope-061-1024x652.png" alt="Kaleidoscope Fluid Layout Final Result" width="584" height="371" /><br />
(Click on image to enlarge it)</a></p>
<h2>The Beta</h2>
<p>The way Black Pixel have approached the beta is interesting in itself.  The beta is a available for public download but will expire after 15 days. You can then pre-order Kaleidoscope for $34.99 which will re-activate the beta and entitle you to all the future beta releases (Black Pixel expect to release a new beta every couple of weeks) and the final release product itself.  $34.99 represents a 50% discount on the final advertised release price of $69.99.  Black Pixel say upgrades for version 1 users will be available for $49.99 but there does not seem to be a 50% discount on this price for people who want to pre-order during the beta.  Black Pixel, by <a title="Struggling To Ship Article" href="http://thenextweb.com/apple/2012/11/19/black-pixel-kaleidoscope/">their own admission</a>, have been struggling to ship and I am wondering if this paid beta is the way they really believe beta software should be handled or if it is the only way they were going to get something out of the door in 2012.</p>
<h2>Conclusion</h2>
<p>Kaleidoscope 2.0 has only just gone into public beta and not expected to be released until 2013 so I am not going to do a full review here; there is still plenty of time for things to change.  However from  my initial quick outing with it I am delighted to see that Black Pixel have managed to maintain and improve the simplicity and elegance of Kaleidoscope 1.0 (originally developed by Sofa before they were bought by Facebook and sold it to Black Pixel) while adding some powerful new features. This is a real relief as I really didn&#8217;t want to have to change diff tools. On top of that I am already happier with Kaleidoscope 2 than I was with any merge tool I tried in my recent experiments.  I think there is a good chance that at last I may have found a merge tool I can fall in love with.</p>
<h2>About the Author:</h2>
<div class="aboutTheAuthor"><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Scotty.png"><img class="authorImage" title="Steve Scott" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Scotty.png" alt="Photo of Steve Scott" width="128" height="128" /><br />
</a></p>
<h2 class="authorName">Steve Scott (Scotty)</h2>
<p>Steve Scott better known as Scotty is the founder of iDeveloper TV and host of the iDeveloper Live Podcast.</p>
<p>He has been a developer since 1987 when he started writing accounting software using COBOL on a Convergent Unix machine using vi as his work editor. Since then he has worked on mainframes, 16bit and 32 bit Windows and .NET. Since 2007 he has worked on OS X and more recently iOS.</p>
<p>At iDeveloper TV, Scotty does community stuff, asks questions, makes the tea and is generally a pain about the place.</p>
<p class="authorContact">Twitter: <a title="Scotty on twitter" href="http://twitter.com/macdevnet">@macdevnet</a><br />
App.net: <a title="Scotty on app.net" href="https://alpha.app.net/scotty">@scotty</a><br />
Website: <a title="iDeveloper.tv" href="http://ideveloper.tv">iDeveloper.tv</a></p>
</div>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/SucMjiEfqoU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/mergetool/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/mergetool/</feedburner:origLink></item>
		<item>
		<title>Designing, Writing and Deploying a Privileged Helper on Mac OS X</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/7TsKp4MivE0/</link>
		<comments>http://blog.ideveloper.tv/designing-writing-and-deploying-a-privileged-helper-on-mac-os-x/#comments</comments>
		<pubDate>Mon, 19 Nov 2012 16:00:27 +0000</pubDate>
		<dc:creator>Graham Lee</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=12</guid>
		<description><![CDATA[Privileged Apps and the Mac App Store The techniques described in this article cannot be used in applications sold through Apple’s Mac app store. Apple’s policy is to only distribute apps that do not require any special privileges. Introduction One advantage that Mac OS X still offers over iOS is that it’s a multi-user system. [...]]]></description>
				<content:encoded><![CDATA[<h2>Privileged Apps and the Mac App Store</h2>
<p>The techniques described in this article cannot be used in applications sold through Apple’s Mac app store. Apple’s policy is to only distribute apps that do not require any special privileges.</p>
<h2>Introduction</h2>
<p>One advantage that Mac OS X still offers over iOS is that it’s a multi-user system. Give your MacBook to your housemate, and she can work with her documents without any risk that she’ll—accidentally or otherwise—view or edit yours. Deploy an iMac into a classroom and all of the students can have their own accounts, isolated from each other.</p>
<p>Sometimes you need different accounts on the computer to work together to achieve some goal. An obvious example can be seen in Time Machine, the Mac OS X backup utility. I want to configure Time Machine to backup all of the files on my Mac, but my user account doesn’t have permission to read all of those files so I can’t possibly copy them all. I need to reach out to a privileged helper — a tool that I can control, but that runs with the permissions needed to complete the backup.</p>
<p>The whole Time Machine system represents a factored application, as it has multiple components that each have the privileges required for the part they play in the whole system. Anybody can run the System Preferences app to see the Time Machine settings, but only administrators can invoke the helper tool that makes changes to those settings. Yet another tool runs in the background to make the backups required.</p>
<p>Factoring an application in this way lets us, as developers, limit the privileges our code runs with to the minimum required. Apple could have created a Time Machine app that can do all of the tasks needed for backups to work, but that would expose users to much greater risk. A bug in the user interface logic could allow an attacker to read any file on the Mac or to change the backup configuration. When the app is factored, a bug in the user interface can only affect the UI.</p>
<p><span id="more-12"></span></p>
<h2>Example Factored App: LogViewer</h2>
<p>The Console app that’s part of Mac OS X is quite nice, but suffers one drawback that can be an annoyance. Many of the log files on a Mac can only be read by administrators, so if you use Console as a regular user you find that those files are “greyed out” and you can’t see their content. To remedy this deficiency, I’ll create “LogViewer”. LogViewer is another log-reading app like Console, only it will allow any user (within specific limits, as we’ll see later) to read the administrator-only log files. I’m going to impose the constraint that LogViewer must be usable via a “drag-install” from a disk image or Zip archive downloaded from the internet; it must not require installation via an installer package. LogViewer works, but it isn’t beautiful; a screenshot of the completed app is shown below.</p>
<p><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/LogViewer.png"><img class="alignnone size-full wp-image-13" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/LogViewer.png" alt="" width="700" /></a></p>
<p>The ability to read files for which many users don’t have permission represents an escalation of privilege; but the ability to work with a Cocoa app’s UI does not. This points to the app being factored into the user interface component and a privileged helper that reads the log files on the app’s behalf.</p>
<h2>Designing the privilege boundary</h2>
<p>At first glance, a very simple protocol should work for this system: the app tells the helper the path to the log file that the user wants to display, and the helper replies with the file’s contents. Such a design is called a “puppet” helper, as the app is acting as a puppet master pulling the helper’s strings. It’s not a very good idea to use a puppet system. It’s easy to produce a different client app that speaks the same protocol, but uses it to read configuration files, or another user’s documents. Any decision on whether the privileged helper should do what’s asked of it must reside in the privileged helper itself, not in the client that calls it. Because this app only needs to access a small number of log files, I’ll use a much more limited protocol. The app will send a single-byte command that identifies which file it wants to read: ‘s’ for /var/log/system.log and ‘i’ for /var/log/install.log for now. If the helper understands the command it will reply with the content of the log file. If anything goes wrong on the helper side: if some resource isn’t available, or it receives a command it doesn’t understand, it’ll just exit. Some additional details: the protocol described above will be transported via a standard UNIX socket. The socket will be managed by launchd, so the helper doesn’t need any lifecycle management code; it will check in with launchd to receive the socket, accept a connection, deal with the command it receives and then exit.</p>
<h2>The Helper Tool</h2>
<p>The system is now well-enough specified to start building it. As the helper is going to be managed by launchd, it needs a property list describing the daemon job, shown below.</p>
<script src="https://gist.github.com/4024819.js"></script><noscript><pre><code class="language-xml xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
&lt;plist version=&quot;1.0&quot;&gt;
&lt;dict&gt;
  &lt;key&gt;Label&lt;/key&gt;
  &lt;string&gt;com.fuzzyaliens.logcat&lt;/string&gt;
  &lt;key&gt;StandardOutPath&lt;/key&gt;
  &lt;string&gt;/var/log/logcat.out.log&lt;/string&gt;
  &lt;key&gt;StandardErrorPath&lt;/key&gt;
  &lt;string&gt;/var/log/logcat.err.log&lt;/string&gt;
  &lt;key&gt;ServiceIPC&lt;/key&gt;
  &lt;true/&gt;
  &lt;key&gt;Sockets&lt;/key&gt;
  &lt;dict&gt;
    &lt;key&gt;Listener&lt;/key&gt;
    &lt;dict&gt;
      &lt;key&gt;SockPathName&lt;/key&gt;
      &lt;string&gt;/var/run/logcat.socket&lt;/string&gt;
      &lt;key&gt;SockPathMode&lt;/key&gt;
      &lt;integer&gt;438&lt;/integer&gt;
    &lt;/dict&gt;
  &lt;/dict&gt;
  &lt;key&gt;ProgramArguments&lt;/key&gt;
  &lt;array&gt;
    &lt;string&gt;/usr/local/bin/logcat&lt;/string&gt;
  &lt;/array&gt;
&lt;/dict&gt;
&lt;/plist&gt;
</code></pre></noscript>
<p>The property list defines a unique label for the launchd job, log files the tool can use while we’re developing it (I’ll remove these entries later), details of the UNIX socket that the helper exposes and the path to the tool itself. Launchd will listen for connections to the socket, so the first thing the helper needs to do is to check in with launchd and take over the socket. It creates a kernel event queue, and adds the socket to that queue so that it can respond to socket events.</p>
<script src="https://gist.github.com/4024759.js"></script><noscript><pre><code class="language-objective-c objective-c">int listen_to_launchd_sockets() {

    //check-in with launchd
    launch_data_t checkin_message = launch_data_new_string(LAUNCH_KEY_CHECKIN);
    if (checkin_message == NULL) {
        exit_error(&quot;couldn't create launchd checkin message&quot;, errno);
    }

    launch_data_t checkin_result = launch_msg(checkin_message);
    if (checkin_result == NULL) {
        exit_error(&quot;couldn't check in with launchd&quot;, errno);
    }

    if (launch_data_get_type(checkin_result) == LAUNCH_DATA_ERRNO) {
        exit_error(&quot;error on launchd checkin&quot;,launch_data_get_errno(checkin_result));
    }

    launch_data_t socket_info = launch_data_dict_lookup(checkin_result, LAUNCH_JOBKEY_SOCKETS);
    if (socket_info == NULL) {
        exit_error(&quot;couldn't find socket information&quot;, 0);
    }

    launch_data_t listening_sockets = launch_data_dict_lookup(socket_info, &quot;Listener&quot;);
    if (listening_sockets == NULL) {
        exit_error(&quot;couldn't find my socket&quot;, 0);
    }

    //set up a kevent for our socket
    int kernel_queue = kqueue();
    if (kernel_queue == -1) {
        exit_error(&quot;couldn't create kernel queue&quot;, errno);
    }

    for (int i = 0; i &lt; launch_data_array_get_count(listening_sockets); i++) {
        launch_data_t this_socket = launch_data_array_get_index(listening_sockets, i);
        struct kevent kev_init;
        EV_SET(&amp;kev_init, launch_data_get_fd(this_socket), EVFILT_READ, EV_ADD, 0, 0, NULL);
        if (kevent(kernel_queue, &amp;kev_init, 1, NULL, 0, NULL) == -1) {
            exit_error(&quot;couldn't create kernel event&quot;, errno);
        }
    }

    launch_data_free(checkin_result);
    return kernel_queue;
}</code></pre></noscript>
<p>So the entire lifecycle for the helper is: set up the kernel queue (as shown above), then wait for an event on that queue which will represent a connection to the socket. Accept the connection, receive the command and decide whether to handle it. If so, open the appropriate file, read its contents and send them back over the socket connection. Finally, close up all the resources that have been used.</p>
<script src="https://gist.github.com/4024803.js"></script><noscript><pre><code class="language-objective-c objective-c">int main(int argc, const char * argv[]) {
    int kernel_queue = listen_to_launchd_sockets();
    
    struct kevent listening_event;
    int connected_socket = kevent(kernel_queue, NULL, 0, &amp;listening_event, 1, NULL);
    if (connected_socket == -1) {
        exit_error(&quot;couldn't get the connected socket&quot;, errno);
    }
    
    //accept the connection
    struct sockaddr accepted_address = { 0 };
    socklen_t address_length = 0;
    
    int accepted_socket = accept((int)listening_event.ident, &amp;accepted_address, &amp;address_length);
    if (accepted_socket == -1) {
        exit_error(&quot;couldn't accept the socket connection&quot;, errno);
    }
    //read and check the one-byte command
    char command = 0;
    size_t bytes_read = recv(accepted_socket, &amp;command, 1, 0);
    if (bytes_read != 1) {
        exit_error(&quot;couldn't read the command from the socket&quot;, errno);
    }
    //write the reply
    int log_file = -1;
    switch (command) {
        case 's': {
            log_file = open(&quot;/var/log/system.log&quot;, O_RDONLY);
            break;
        }
        case 'i': {
            log_file = open(&quot;/var/log/install.log&quot;, O_RDONLY);
            break;
        }
        default: {
            exit_error(&quot;unknown command&quot;, 0);
            break;
        }
    }
    if (log_file == -1) {
        exit_error(&quot;couldn't open the log file&quot;, errno);
    }
    char *log_content = malloc(4096);
    if (log_content == NULL) {
        exit_error(&quot;couldn't allocate memory&quot;, errno);
    }
    size_t file_bytes_read = 0;
    while ((file_bytes_read = read(log_file, log_content, 4096)) &gt; 0) {
        ssize_t socket_bytes_written = send(accepted_socket, log_content, file_bytes_read, 0);
        if (socket_bytes_written &lt; file_bytes_read) {
            exit_error(&quot;couldn't write to socket&quot;, errno);
        }
    }
    close(log_file);
    free(log_content);
    //close the connection
    close(accepted_socket);
    close(kernel_queue);
    return 0;
}
</code></pre></noscript>
<h2>The application</h2>
<p>The app consists of a source list table view so the user can choose the file they want to read, and a text view showing the content of that file. The single-click action of the table view is used to initiate communication with the helper and retrieve the log file content; to help this code in its educational goal, the communication is shown synchronously in the action method. This leaves the app’s UI unresponsive while it’s communicating with the helper, so isn’t a good design for a production app. Here’s the action method:</p>
<script src="https://gist.github.com/4024865.js"></script><noscript><pre><code class="language-objective-c objective-c">- (IBAction)sourceListItemSelected:(id)sender {
    self.logViewer.string = @&quot;&quot;;

    //choose the appropriate command to send
    char command = 0;
    switch ([sender clickedRow]) {
        case 0:
            command = 's';
            break;
        case 1:
            command = 'i';
            break;
        default:
            return;
    }

    //connect to the remote socket
    int socket_descriptor = socket(PF_LOCAL, SOCK_STREAM, 0);
    if (socket_descriptor == -1) {
        NSLog(@&quot;error creating socket: %s&quot;, strerror(errno));
        return;
    }

    struct sockaddr_un address = {
        .sun_family = PF_LOCAL,
        .sun_path = &quot;/var/run/logcat.socket&quot;,
    };

   if (connect(socket_descriptor, (const struct sockaddr *)&amp;address, sizeof(address)) != 0) {
        NSLog(@&quot;error connecting to socket: %s&quot;, strerror(errno));
        goto done;
    }

    //send the command
    size_t bytes_written = send(socket_descriptor, &amp;command, 1, 0);
    if (bytes_written != 1) {
        NSLog(@&quot;couldn't write to socket: %s&quot;,strerror(errno));
        goto done;
    }

    size_t bytes_read = 0;
    char *buffer = malloc(4096);
    while((bytes_read = recv(socket_descriptor, buffer, 4096, 0)) &gt; 0) {
        NSString *logContent = 
          [[NSString alloc] initWithBytes: buffer length: bytes_read encoding: NSUTF8StringEncoding];
        self.logViewer.string = [self.logViewer.string stringByAppendingString: logContent];
    }

    free(buffer);

done:
    if (socket_descriptor != -1) {
        close(socket_descriptor);
    }
}</code></pre></noscript>
<h2>Deploying the Helper</h2>
<p>The app and helper can be used right now, but getting everything deployed is a bit of an effort. It involves the following steps:</p>
<ul>
<li>Build the helper</li>
<li>Copy the helper to /usr/local/bin, and its launchd plist to /Library/LaunchDaemons (I set up a Copy Files build phase to do this on install, so the command “DSTROOT=/ sudo xcodebuild -target logcat install” does these two steps in one go)</li>
<li>Load the launchd job, using the command “sudo launchctl load /Library/LaunchDaemons/com.fuzzyaliens.logcat.plist”</li>
</ul>
<p>One of the requirements for the app at the beginning of this post was to deploy the whole system as a drag-install, and this certainly doesn’t satisfy that requirement. The next step is to use the System Management framework to load the privileged helper from the app.</p>
<p>No code changes are needed in the helper to make this work. The ProgramArguments array must be removed from its launchd plist, as launchd will decide where to deploy the tool. Additionally, the logcat helper tools needs its own Info.plist:</p>
<script src="https://gist.github.com/4024888.js"></script><noscript><pre><code class="language-xml xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
&lt;plist version=&quot;1.0&quot;&gt;
&lt;dict&gt;
  &lt;key&gt;CFBundleIdentifier&lt;/key&gt;
  &lt;string&gt;com.fuzzyaliens.logcat&lt;/string&gt;
  &lt;key&gt;CFBundleInfoDictionaryVersion&lt;/key&gt;
  &lt;string&gt;6.0&lt;/string&gt;
  &lt;key&gt;CFBundleName&lt;/key&gt;
  &lt;string&gt;logcat&lt;/string&gt;
  &lt;key&gt;CFBundleVersion&lt;/key&gt;
  &lt;string&gt;1.0&lt;/string&gt;
  &lt;key&gt;SMAuthorizedClients&lt;/key&gt;
  &lt;array&gt;
    &lt;string&gt;identifier &amp;quot;com.fuzzyaliens.LogViewer&amp;quot; and anchor apple generic and certificate leaf[subject.CN] = &amp;quot;3rd Party Mac Developer Application: Graham Lee&amp;quot;&lt;/string&gt;
  &lt;/array&gt;
&lt;/dict&gt;
&lt;/plist&gt;</code></pre></noscript>
<p>The interesting part of this Info.plist is SMAuthorizedClients: it lists the apps that are allowed to deploy this tool by describing requirements about their code signing identities. In this case, I’ve required that the app must be LogViewer, and that it must be signed by the Mac developer certificate Apple issued to me. You could also use a self-signed certificate generated by the Keychain Access app here.</p>
<p>Command-line tools don’t usually have bundles, so this Info.plist must be associated with the logcat binary in some other way. What we need to do is to write it into the binary itself, by adding the following commands to “Other Linker Commands” in the helper’s Xcode target:</p>
<p><strong>-sectcreate __TEXT __info_plist logcat/logcat-Info.plist</strong><br />
<strong> -sectcreate __TEXT __launchd_plist</strong><br />
<strong> logcat/com.fuzzyaliens.logcat.plist</strong></p>
<p>Changes must also be made to the app target. Just as the Info.plist for the helper says what clients are allowed to deploy it, the app must say which helpers it’s allowed to deploy:</p>
<script src="https://gist.github.com/4024913.js"></script><noscript><pre><code class="language-xml xml">&lt;key&gt;SMPrivilegedExecutables&lt;/key&gt;
&lt;dict&gt;
  &lt;key&gt;com.fuzzyaliens.logcat&lt;/key&gt;
  &lt;string&gt;identifier &amp;quot;com.fuzzyaliens.logcat&amp;quot; and anchor apple generic and certificate leaf[subject.CN] = &amp;quot;3rd Party Mac Developer Application: Graham Lee&amp;quot;&lt;/string&gt;
&lt;/dict&gt;</code></pre></noscript>
<p>The app must also have access to the tool, so it needs to be copied into the app bundle. This is done with a new Copy Files build phase, that copies the helper into Contents/Library/LaunchServices inside the app bundle. Remember to make the helper target a dependency of the app target, so that the latest version of the helper is definitely built when you copy it into the app.</p>
<p>With all of that infrastructure in place, it’s now possible to programmatically install the helper from within the app, using ServiceManagement.framework. Because the app can’t actually do anything without the helper in place, I’ll make sure that the helper is deployed when the app launches. In the app delegate’s -applicationDidFinishLaunching: method, the app checks whether the job is already deployed. If not, it gains the right to do so (via Authorization Services) and then tries to install the helper tool.</p>
<script src="https://gist.github.com/4024920.js"></script><noscript><pre><code class="language-objective-c objective-c">- (void)applicationDidFinishLaunching:(NSNotification *)notification {
    CFStringRef jobLabel = CFSTR(&quot;com.fuzzyaliens.logcat&quot;);
    CFDictionaryRef logcatJob = SMJobCopyDictionary(kSMDomainSystemLaunchd, jobLabel);
    if (logcatJob) {
        // the job's already deployed, so there's nothing to do
        CFRelease(logcatJob);
    } else {
        // gain the right to install the helper
        AuthorizationItem authItem = {
           .name = kSMRightBlessPrivilegedHelper,
           .valueLength = 0,
           .value = NULL,
           .flags = kAuthorizationFlagDefaults };
        
        AuthorizationRights authRights	= { .count = 1,
            .items = &amp;authItem };
        
        AuthorizationRef authorization = NULL;
        OSStatus authResult = AuthorizationCreate(&amp;authRights,
                                              kAuthorizationEmptyEnvironment,
                                              kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed |
                                              kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights,
                                              &amp;authorization);
        if (authResult != errAuthorizationSuccess) {
            NSLog(@&quot;couldn't create AuthorizationRef: error %i&quot;, authResult);
        } else {
            // got authorization, so deploy the helper
            CFErrorRef error = NULL;
            BOOL blessResult = SMJobBless(kSMDomainSystemLaunchd, jobLabel, authorization, &amp;error);
            AuthorizationFree(authorization, kAuthorizationFlagDefaults);
            if (!blessResult) {
                CFStringRef errorString = CFErrorCopyDescription(error);
                NSLog(@&quot;couldn't install privileged helper: %@&quot;, (__bridge id)errorString);
                CFRelease(errorString);
            }
        }
    }
}</code></pre></noscript>
<p>If you build and run the app now, you’ll see the dialog shown below on first run.</p>
<div><img class="alignnone size-full wp-image-64" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/InstallHelper.png" alt="" width="700" /></div>
<p>Authenticate by entering an administrator’s user name and password, and launchd will check the signatures on the app and on the helper tool. Seeing that they match, launchd copies the tool into /Library/PrivilegedHelperTools, adds the path to the tool to its job plist and installs the plist into /Library/LaunchDaemons. The app can now use its helper without having to force users through a complicated deployment process.</p>
<h2>Authorizing access to the logs</h2>
<p>As it stands, the LogViewer app allows <em>anyone</em> to read the log files, which were originally installed with permissions that restricted access to administrators. We should close this hole, by letting administrators configure who gets access to the log files.</p>
<p>You’ve already seen Authorization Services being used to gain the right to deploy the privileged helper. The same pattern can be used to control access to the log files themselves. I’ll define a new right, called “com.fuzzyaliens.LogViewer.read”, that users must be able to acquire before they can read the log files. By default, unknown rights can only be gained by administrators, and last five minutes before they must be re-acquired. A sysadmin can change these requirements by editing the /etc/authorization database, which is beyond the scope of this article.</p>
<p>There’s one additional wrinkle in using this new authorization right: due to the separation of privileges in LogViewer, the app must request the right (it is able to display the Authorization Services dialog) but the helper must use it (the helper must know whether it should read the log files). The app will try to acquire the right, and will then send its authorization context over the socket to the helper which will test that the right has in fact been granted.</p>
<p>The app’s action method tests that it can acquire the right before connecting to the helper tool.</p>
<script src="https://gist.github.com/4024941.js"></script><noscript><pre><code class="language-objective-c objective-c">- (IBAction)sourceListItemSelected:(id)sender {
    self.logViewer.string = @&quot;&quot;;
    //get authorization to read the log file
    AuthorizationRef authorization = NULL;
    OSStatus authResult = AuthorizationCreate(NULL,
                                              kAuthorizationEmptyEnvironment,
                                              kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights,
                                              &amp;authorization);
    if (authResult != errAuthorizationSuccess) {
        //something's very wrong
        return;
    }
    char *rightName = &quot;com.fuzzyaliens.LogViewer.read&quot;;
    AuthorizationRights *grantedRights = NULL;
    AuthorizationItem readLogsRight = { .name = rightName,
        .valueLength = 0,
        .value = NULL,
        .flags = kAuthorizationFlagDefaults };
    AuthorizationRights rightSet = { .count = 1, .items = &amp;readLogsRight };
    authResult = AuthorizationCopyRights(authorization,
                                         &amp;rightSet,
                                         kAuthorizationEmptyEnvironment,
                                         kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights,
                                         &amp;grantedRights);
    switch (authResult) {
        case errAuthorizationSuccess:
            // allow the action to proceed
            break;
        case errAuthorizationDenied:
        case errAuthorizationCanceled:
            // the user either isn't allowed, or refused to assert their identity
            self.logViewer.string = @&quot;You do not have permission to read administrator logs&quot;;
            return;
            break;
        default:
            // something went wrong
            self.logViewer.string = [NSString stringWithFormat: @&quot;Error %d occurred reading the log file&quot;, authResult];
            break;
    }
    //confirm that we really got the rights we wanted
    int i;
    for (i = 0; i &lt; grantedRights -&gt; count; i++) {
        AuthorizationItem thisRight = grantedRights-&gt;items[i];
        if (strncmp(thisRight.name, rightName, strlen(rightName)) == 0 &amp;&amp; (thisRight.flags &amp; kAuthorizationFlagCanNotPreAuthorize)) {
            self.logViewer.string = @&quot;You do not have permission to read administrator logs&quot;;
            AuthorizationFreeItemSet(grantedRights);
            return;
        }
    }
    AuthorizationFreeItemSet(grantedRights);
//&acirc;
<p>When the app has connected to the helper’s UNIX socket, it packages up and sends the authorization context before sending the one-character command already defined.<br />
<script src="https://gist.github.com/4024947.js"></script><noscript><pre><code class="language-objective-c objective-c">//&acirc;</p>
<p>The helper tool must be similarly changed. Once the socket connection has been accepted, it must read the authorization external form, reconstruct it and test it to see if it includes the right required by the app. If so, then it can carry on and read the command; otherwise it will exit.</p>
<script src="https://gist.github.com/4024955.js"></script><noscript><pre><code class="language-objective-c objective-c">//&acirc;
<p>Now when you use LogViewer to read a log file, if you do not already have the defined right you will see the Authorization Services dialog displayed below. Only if you enter an administrator’s username and password will you be permitted by logcat to see the log file contents.</p>
<div> <img class="alignnone size-full wp-image-66" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/MakeChanges.png" alt="" width="700" /></div>
<h2>Discussion</h2>
<p>All of the source code shown in this article can be found at <a href="https://github.com/iamleeg/LogViewer">https://github.com/iamleeg/LogViewer</a>, so you can see how it all fits together and make changes to observe the results by cloning this repository.</p>
<p>The LogViewer application needs to use a few of Mac OS X’s security features in concert to provide a secure and easy to use system. It is delivered as a factored application, split into a user interface and a helper tool that does the real work. The helper must be launched by the root user, so it relies on launchd to take care of its lifecycle. To deploy the helper without any complicated installer process, LogViewer takes advantage of the Service Management framework which ensures that the tool and app match with each other before proceeding with the deployment. Finally, it uses Authorization Services to ensure that only users who have been given permission to read the log files may use this app to do so.</p>
<p>Notice that the various security controls are used at different points in the lifecycle. Even if a user lacks permission to install the privileged helper, they can use the app once the helper has been installed by someone else. The test that app and helper belong to one another is only important when the tool is being installed. You are challenged to prove that you’re allowed to read log files only when you go to read those files, not at app launch or any other time.</p>
<p>I hope that the LogViewer project shows how various parts of the Mac’s security architecture can be used together, and can be a useful template for other factored applications.</p>
<h2>About the Author:</h2>
<div class="aboutTheAuthor"><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/GrahamLee128.png"><br />
<img class="authorImage" title="Graham Lee" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/GrahamLee128.png" alt="Photo of Graham Lee" width="128" height="128" /><br />
</a></p>
<h2 class="authorName">Graham Lee</h2>
<p>Graham is an app developer and security consultant working at Agant, Ltd. He is the author of Test-Driven iOS Development and Professional Cocoa Application Security.</p>
<p class="authorContact">Twitter: <a title="Graham Lee on twitter" href="http://twitter.com/secboffin">@secboffin</a><br />
Website: <a title="Graham's Blog" href="http://blog.securemacprogramming.com/">Graham&#8217;s Blog</a></p>
</div>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/7TsKp4MivE0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/designing-writing-and-deploying-a-privileged-helper-on-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/designing-writing-and-deploying-a-privileged-helper-on-mac-os-x/</feedburner:origLink></item>
		<item>
		<title>Core Data Tutorial: Using DCTCoreDataStack</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/tcgoxlpuTwQ/</link>
		<comments>http://blog.ideveloper.tv/dctcoredatastack/#comments</comments>
		<pubDate>Fri, 16 Nov 2012 16:00:03 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Core Data]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[OS X]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=99</guid>
		<description><![CDATA[Introduction At iDeveloper TV we are constantly creating new Xcode projects. Having to re-write the code in the new project to set up the Core Data Stack drives us mad. This is why I recently started looking at DCTCoreDataStack as a way of keeping me sane. Why DCTCoreDataStack? When you create a new project in [...]]]></description>
				<content:encoded><![CDATA[<h2>Introduction</h2>
<p>At iDeveloper TV we are constantly creating new Xcode projects. Having to re-write the code in the new project to set up the Core Data Stack drives us mad. This is why I recently started looking at DCTCoreDataStack as a way of keeping me sane.</p>
<p><span id="more-99"></span></p>
<h2>Why DCTCoreDataStack?</h2>
<p>When you create a new project in Xcode and ask for Core Data to be included, the project template includes a whole bunch of code that sets up a Core Data Stack. Many people use this code as is and most of the time that works. However I have a few problems with this.</p>
<p>Firstly, I don&#8217;t like the fact that the code is placed in the application&#8217;s delegate class. I try to keep the application&#8217;s delegate class as clean and specific as possible. All the Core Data code would be better encapsulated in its own class. Secondly, I don&#8217;t think that the template code is really up to scratch and needs refining somewhat.</p>
<p>These annoyances mean that every time I start a new Core Data project I don&#8217;t bother using the project template but rather just add the Core Data code to an app specific data manager class. Each time I do this I swear that before I have to do it again I will write a proper generic data manager class that I can use in all my projects.</p>
<p>Well, thanks to <a href="http://danieltull.co.uk/" rel="nofollow">Daniel Tull</a>, I can now remove this task from my ever growing &#8220;must do someday&#8221; list and just use his open source code DCTCoreDataStack.</p>
<p>Before we go any further why not watch the short interview I did with Daniel about DCTCoreDataStack in the summer of 2012.</p>
<!-- LeadPlayer video embed code start [ video: 509A2B907CC6B ] --><div><script type="text/javascript" src="http://s3.amazonaws.com/cdn.leadbrite.com/leadplayer/r0032/js/leadplayer.js"></script></div><div id="leadplayer_video_element_509A2B907CC6B" style="width:640px;height:360px" itemscope itemtype="http://schema.org/VideoObject"><meta itemprop="embedUrl" content="http://www.youtube.com/embed/Jm_MYhBvQMU?loop=0&amp;autoplay=0&amp;controls=1&amp;modestbranding=1&amp;showsearch=0&amp;showinfo=0&amp;hd=1" /><meta itemprop="name" content="DCTCoreDataStack" /><meta itemprop="description" content="" /><meta itemprop="width" content="640" /><meta itemprop="height" content="360" /><meta itemprop="thumbnailUrl" content="https://img.youtube.com/vi/Jm_MYhBvQMU/hqdefault.jpg" /><iframe type="text/html" width="640" height="360" src="https://www.youtube.com/embed/Jm_MYhBvQMU?loop=0&amp;autoplay=0&amp;controls=1&amp;modestbranding=1&amp;showsearch=0&amp;showinfo=0&amp;hd=1" frameborder="0" allowfullscreen></iframe></div><div><script type="text/javascript">jQLeadBrite("#leadplayer_video_element_509A2B907CC6B").leadplayer(false, "eyJnYSI6dHJ1ZSwib3ZlcmxheSI6ZmFsc2UsInBvd2VyZWRfYnkiOmZhbHNlLCJwb3dlcmVkX2J5X2xpbmsiOiJodHRwOlwvXC93d3cubGVhZHBsYXllci5jb21cLyIsImNvbG9yMSI6IiNGNUJCMEMiLCJjb2xvcjIiOiIjMTc5OENEIiwiY29sb3IzIjoiI0Y1QkIwQyIsInR4dF9zdWJtaXQiOiJTVUJNSVQiLCJ0eHRfcGxheSI6IlBMQVkiLCJ0eHRfZW1sIjoiWW91ciBFbWFpbCBBZGRyZXNzIiwidHh0X25hbWUiOiJZb3VyIE5hbWUiLCJ0eHRfaW52YWxpZF9lbWwiOiJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCIsInR4dF9pbnZhbGlkX25hbWUiOiJQbGVhc2UgZW50ZXIgeW91ciBuYW1lIiwibHBfc291cmNlIjoiV1AgUGx1Z2luIDEuNC4xLjYgVW5saW1pdGVkIiwiaWQiOiI1MDlBMkI5MDdDQzZCIiwid2lkdGgiOjY0MCwiaGVpZ2h0IjozNjAsInRodW1ibmFpbCI6IiIsInRpdGxlIjoiRENUQ29yZURhdGFTdGFjayIsImRlc2NyaXB0aW9uIjoiIiwiYXV0b3BsYXkiOmZhbHNlLCJzaG93X3RpbWVsaW5lIjp0cnVlLCJlbmFibGVfaGQiOnRydWUsIm9wdCI6ZmFsc2UsImN0YSI6ZmFsc2UsInltIjoiSm1fTVloQnZRTVUifQ==");</script></div><!-- LeadPlayer video embed code end [ video: 509A2B907CC6B ] -->
<h2></h2>
<h2>What Does DCTCoreDataStack Do?</h2>
<p>From the DCTCoreDataStack documentation:</p>
<blockquote><p>DCTCoreDataStack is intended for non-document based apps, and sets up the whole Core Data structure such that after initializing, the managedObjectContext property is ready for use.</p></blockquote>
<p>DCTCoreDataStack provides the following features:</p>
<p>1. An encapsulation of the complete Core Data stack of NSManagedObjectContext, NSPersistentStoreCoordinator, NSPersistentStore, and NSManagedObjectModel.</p>
<p>2. On supporting operating systems, writing to disk is performed on a background thread by using a parent context. Saving the main context automatically triggers saving the parent context asynchronously.</p>
<p>3. <code>[[NSManagedObjectContext dct_saveWithCompletionHandler:]]</code> method can be used for notifications when saving to disk finishes, asynchronously if possible.</p>
<p>4. Allows you to resolve errors when loading the persistent store by setting <code>[didResolvePersistentStoreErrorHandler].</code></p>
<p>5. On iOS, the app entering the background, or terminating, automatically triggers a save if needed. You can be notified of such saves by setting <code>[automaticSaveCompletionHandler].</code></p>
<p>6. On iOS, when saving on a background thread, the stack protects against termination/suspension by declaring the save as a background task.</p>
<p>7. Generation of sibling managed object contexts via <code>[[NSManagedObjectContext dct_newSiblingContextWithConcurrencyType:]]</code> Saving this causes a save to the parent and a merge to the original context.</p>
<p>8. Providing @YES for DCTCoreDataStackExcludeFromBackupStoreOption in the storeOptions will exclude the persistent store from being backed up.</p>
<h2>Using DCTCoreDataStack</h2>
<p>I am going to start a new, basic, single view iPhone project in Xcode. As I am not asking the template to include Core Data I will also need to add the CoreData framework to the project and also create a new DataModel file.</p>
<p>Next we need to get DCTCoreDataStack from GitHub. We can either just download it as a zip file from <a href="https://github.com/danielctull/DCTCoreDataStack/archive/master.zip">https://github.com/danielctull/DCTCoreDataStack/archive/master.zip</a> or we can check it out as a git repository from <a href="https://github.com/danielctull/DCTCoreDataStack.git">https://github.com/danielctull/DCTCoreDataStack.git</a>.</p>
<p><img style="float: right; margin: 0px 0px 20px 40px;" title="DCTCoreDataStack.png" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/DCTCoreDataStack.png" alt="DCTCoreDataStack" width="344" height="252" border="0" /></p>
<p>DCTCoreDataStack comes with a demo project and a set of unit tests. I am only interested in the DCTCoreDataStack code itself so, for simplicity, I am going to copy the DCTCoreDataStack folder  into my demo project.</p>
<p>Next I set up the project to use DCTCoreDataStack by adding <code>DCTCoreDataStack.h</code> to the application&#8217;s delegate class header file and then adding a property of type <code>DCTCoreDataStack</code></p>
<div style="clear: both;"><script src="https://gist.github.com/4030614.js"></script><noscript><pre><code class="language-objective-c objective-c">#import &lt;UIKit/UIKit.h&gt;
#import &quot;DCTCoreDataStack.h&quot;

@class IDTVViewController;

@interface IDTVAppDelegate : UIResponder &lt;UIApplicationDelegate&gt;
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) IDTVViewController *viewController;
@property (strong,nonatomic) DCTCoreDataStack *coreDataStack;

@end</code></pre></noscript></div>
<p>Next in the application delegate implementation I add code to <code>-[NSApplicationDelegate application: didFinishLaunchingWithOptions:]</code> method to instantiate a <code>DCTCoreDataStack</code> object into the new property. In this case I use DCTCoreDataStack&#8217;s simplest convenience constructor and simply pass the name of the physical data file I wish it to use. DCTCoreDataStack will look for (or create) the file in our applications documents directory.</p>
<script src="https://gist.github.com/4030784.js"></script><noscript><pre><code class="language-objective-c objective-c">coreDataStack = [[DCTCoreDataStack alloc] initWithStoreFilename:@&quot;DCTCoreDataStack&quot;];</code></pre></noscript>
<p>As far as setting up the Core Data Stack that&#8217;s it.</p>
<h2>Managed Object Contexts</h2>
<p>I am going to need a Managed Object Context.</p>
<script src="https://gist.github.com/4031056.js"></script><noscript><pre><code class="language-matlab matlab">NSManagedObjectContext *moc = coreDataStack.managedObjectContext;</code></pre></noscript>
<p>The <code>DCTCoreDataStack.managedObjectContext</code> property returns a main thread context that has a parent context on a background thread.</p>
<p>What has actually been returned is a new class, <code>_DCTCDSManagedObjectContext</code>. <code>_DCTCDSManagedObjectContext</code> is an <code>NSManagedObject</code> descendant that overrides the <code>-[NSManagedObjectContext save:]</code> method so that when you issue a <code>save</code> against the context it will ensure the save is also propagated back onto its parent context (on the background thread) and data is persisted to the physical store. (<code>_DCTCDSManagedObjectContext</code> also has an incredibly useful <code>- (void)dct_saveWithCompletionHandler:(void(^)(BOOL success, NSError *error))completion</code> method which will call your completion handler only once the data has been persisted by the parent context.)</p>
<p>With the introduction of child/parent contexts in Core Data it is seen as good practice to only use the main thread Managed Object Context for interacting with the UI and to complete other operations on private queue child contexts.</p>
<p>DCTCoreDataStack also adds the concept of &#8220;sibling contexts&#8221; using a new class <code>_DCTSiblingManagedObjectContext</code> which is a descendent of the <code>_DCTCDSManagedObjectContext </code>we mentioned earlier. A sibling context has the same parent as its sibling. When you save a sibling context it saves itself, saves to the parent and updates its sibling to its current state. You can create a sibling context using the <code>dct_newSiblingContextWithConcurrencyType</code> method of a <code>_DCTCDSManagedObjectContext</code></p>
<script src="https://gist.github.com/4031121.js"></script><noscript><pre><code class="language-objective-c objective-c">NSManagedObjectContext *context =
  [moc dct_newSiblingContextWithConcurrencyType:NSPrivateQueueConcurrencyType];</code></pre></noscript>
<p><em>If all this stuff about child/parent contexts doesn&#8217;t make any sense to you then you might like to take a look at our <a href="http://ideveloper.tv/video/coredataperformancecourse.html">Core Data Performance Course</a> where we cover it in detail.<br />
</em></p>
<h2>Summary</h2>
<p>DCTCoreDataStack is a small project with only 10 files, each only containing a few methods. The code is well documented and pretty easy to follow. I feel adding DCTCoreDataStack to my project in no way compromises me as even if Daniel decides to abandon it, I can easily maintain it myself and won&#8217;t feel bad about doing it as it is only doing things I want to do anyway.</p>
<h2>About the Author:</h2>
<div class="aboutTheAuthor"><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Scotty.png"><img class="authorImage" title="Steve Scott" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/Scotty.png" alt="Photo of Steve Scott" width="128" height="128" /><br />
</a></p>
<h2 class="authorName">Steve Scott (Scotty)</h2>
<p>Steve Scott better known as Scotty is the founder of iDeveloper TV and host of the iDeveloper Live Podcast.</p>
<p>He has been a developer since 1987 when he started writing accounting software using COBOL on a Convergent Unix machine using vi as his work editor. Since then he has worked on mainframes, 16bit and 32 bit Windows and .NET. Since 2007 he has worked on OS X and more recently iOS.</p>
<p>At iDeveloper TV, Scotty does community stuff, asks questions, makes the tea and is generally a pain about the place.</p>
<p class="authorContact">Twitter: <a title="Scotty on twitter" href="http://twitter.com/macdevnet">@macdevnet</a><br />
App.net: <a title="Scotty on app.net" href="https://alpha.app.net/scotty">@scotty</a><br />
Website: <a title="iDeveloper.tv" href="http://ideveloper.tv">iDeveloper.tv</a></p>
</div>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/tcgoxlpuTwQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/dctcoredatastack/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/dctcoredatastack/</feedburner:origLink></item>
		<item>
		<title>Are Prices Too Low in the Mac App Store?</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/wf0LHGuOrcc/</link>
		<comments>http://blog.ideveloper.tv/are-prices-too-low-in-the-mac-app-store/#comments</comments>
		<pubDate>Fri, 16 Nov 2012 12:00:46 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=575</guid>
		<description><![CDATA[Drew McCormack has asked the question in this posts title and makes comment. At the recent Çingleton conference, ex-Apple employee Michael Jurewitz addressed the issue front on. I wasn’t actually at the conference, so I have only heard his arguments second hand, but it seems the gist was that most of the top grossing Mac [...]]]></description>
				<content:encoded><![CDATA[<p><a href="https://alpha.app.net/drewmccormack" rel="nofollow">Drew McCormack</a> has asked the question in this posts title and makes comment.</p>
<blockquote><p>At the recent Çingleton conference, ex-Apple employee Michael Jurewitz addressed the issue front on. I wasn’t actually at the conference, so I have only heard his arguments second hand, but it seems the gist was that most of the top grossing Mac apps have high prices, so Mac developers are encouraged to price their software higher.</p>
<p>It’s certainly an interesting analysis, but are the conclusions actually well established? Or is it another case of ‘damn lies and statistics’?</p></blockquote>
<p>In response to his own question Drew has done some &#8220;unscientific&#8221; (his words) research on Mac App Store pricing for the top 100 grossing apps that makes interesting <a title="Are Prices Too Low in the Mac App Store?" href="http://mentalfaculty.tumblr.com/post/35766790848/are-prices-too-low-in-the-mac-app-store">reading</a>.</p>
<p>This is always going to be a challenge for developers, but one thing is for sure. Even though new apps may, on average, have lower pricing than established apps from the established companies; the apps in the top grossing list have, on average, a far higher price than the apps in the top paid list. This clearly demonstrates that if you actually want to make money, you need to charge more for your app!</p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/wf0LHGuOrcc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/are-prices-too-low-in-the-mac-app-store/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/are-prices-too-low-in-the-mac-app-store/</feedburner:origLink></item>
		<item>
		<title>Rectangles in Objective-C</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/pWLz1-0MPVM/</link>
		<comments>http://blog.ideveloper.tv/rectangles/#comments</comments>
		<pubDate>Fri, 16 Nov 2012 09:36:14 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=570</guid>
		<description><![CDATA[Mark Darymple has written a useful introduction to handling rectangles in Objective-C. As he says - Geometry is everywhere in modern programming. We have to know how to deal with points, sizes, and rectangles. So if you&#8217;re not up to speed with NSSize and NSPoint you might want to check it out here. You might be surprised and [...]]]></description>
				<content:encoded><![CDATA[<p><a href="https://twitter.com/borkware" rel="nofollow">Mark Darymple</a> has written a useful introduction to handling rectangles in Objective-C.<br />
As he says -</p>
<blockquote><p>Geometry is everywhere in modern programming. We have to know how to deal with points, sizes, and rectangles.</p></blockquote>
<p>So if you&#8217;re not up to speed with <code>NSSize</code> and <code>NSPoint </code>you might want to check it out <a title="Article on Rectangles" href="http://weblog.bignerdranch.com/1087-rectangles-part-1/">here</a>.<br />
You might be surprised and learn a few things. I did.</p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/pWLz1-0MPVM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/rectangles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/rectangles/</feedburner:origLink></item>
		<item>
		<title>Podcast 72 – Conversations About Code</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/BAL_Qv21STc/</link>
		<comments>http://blog.ideveloper.tv/podcast-72-conons-about-code/#comments</comments>
		<pubDate>Wed, 14 Nov 2012 16:44:19 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=482</guid>
		<description><![CDATA[After the show guest had to bail Scotty and John spend time talking about organizing large projects, properties , dot notation, bindings, logging, GCD, Blocks and Delegation. Links ZLog NSLogger @tapdevjobs @xcodejobs Guest Details Scotty from iDeveloper TV, Twitter: @macdevnet, App.Net: Scotty John Fox from Memory Miner, Twitter:@djembe, App.Net: djembe Please follow our guests on twitter [...]]]></description>
				<content:encoded><![CDATA[<p>After the show guest had to bail Scotty and John spend time talking about organizing large projects, properties , dot notation, bindings, logging, GCD, Blocks and Delegation.</p>
<p><span id="more-482"></span></p>
<h2 id="links">Links</h2>
<ul>
<li><a title="XLog" href="https://gist.github.com/467567">ZLog</a></li>
<li><a title="NSLogger" href="https://github.com/fpillet/NSLogger">NSLogger</a></li>
<li><a title="TapDevJobs on Twitter" href="http://twitter.com/tapdevjobs">@tapdevjobs</a></li>
<li><a title="Xcode Jobs on Twitter" href="https://twitter.com/xcodejobs">@xcodejobs</a></li>
</ul>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv">iDeveloper TV</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="MemoryMiner Website" href="http://memoryminer.com">Memory Miner</a>, Twitter:<a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">djembe</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<ul>
<li>Audio can be downloaded <a title="Audio for Episode 72" href="http://traffic.libsyn.com/ideveloperlive/ideveloperlive072.m4a">here</a></li>
</ul>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" alt="Invasivecode Logo" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/BAL_Qv21STc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast-72-conons-about-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast-72-conons-about-code/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/y_YxqDQWY_c/ideveloperlive072.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloperlive072.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>New way to find your next paying gig from Tap!</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/r-O_ZHIOmtM/</link>
		<comments>http://blog.ideveloper.tv/new-way-to-find-your-next-paying-gig-from-tap/#comments</comments>
		<pubDate>Wed, 14 Nov 2012 15:07:55 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=498</guid>
		<description><![CDATA[Yesterday Tap! magazine announced that they had launched a new Twitter account under the name @tapdevjobs to help developers find work and to help people looking for developers to find them. The account is being manned by Chris Phin, Editor of Tap! magazine and developers Matt Gemmell, Aral Balkan, Dave Addey and Neil Inglis If you are looking for a [...]]]></description>
				<content:encoded><![CDATA[<p>Yesterday <a href="https://twitter.com/tapmaguk" rel="nofollow">Tap!</a> magazine <a title="Tap Magazine Announcement" href="https://twitter.com/tapmaguk/status/268392175295938561" rel="nofollow">announced</a> that they had launched a new Twitter account under the name <a href="http://twitter.com/tapdevjobs" rel="nofollow">@tapdevjobs</a> to help developers find work and to help people looking for developers to find them.</p>
<p>The account is being manned by <a href="http://twitter.com/chrisphin" rel="nofollow">Chris Phin</a>, Editor of Tap! magazine and developers <a href="http://twitter.com/mattgemmell" rel="nofollow">Matt Gemmell</a>, <a href="http://twitter.com/aral">Aral Balkan</a>, <a href="http://twitter.com/daveaddey" rel="nofollow">Dave Addey</a> and <a href="http://twitter.com/neilinglis" rel="nofollow">Neil Inglis</a></p>
<p>If you are looking for a developer then send them a tweet and they will repost it for all of the account&#8217;s followers to see.</p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/r-O_ZHIOmtM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/new-way-to-find-your-next-paying-gig-from-tap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/new-way-to-find-your-next-paying-gig-from-tap/</feedburner:origLink></item>
		<item>
		<title>Auto Layout &amp; Interface Builder Tutorial: Solving some common problems</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/m9ElqIvw-5w/</link>
		<comments>http://blog.ideveloper.tv/auto-layout-interface-builder-tutorial/#comments</comments>
		<pubDate>Tue, 13 Nov 2012 16:00:29 +0000</pubDate>
		<dc:creator>Matt Tancock</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[auto layout]]></category>
		<category><![CDATA[constraint]]></category>
		<category><![CDATA[interface builder]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=76</guid>
		<description><![CDATA[Interface Builder is Best? In their 2012 WWDC sessions on Auto Layout, Apple recommends that the primary method for creating interfaces using Auto Layout should be Interface Builder. IB has a few quirks (some would say large number of flaws) which can make it seem like black magic trying to bend it to your will. [...]]]></description>
				<content:encoded><![CDATA[<h2>Interface Builder is Best?</h2>
<p>In their 2012 WWDC sessions on Auto Layout, Apple recommends that the primary method for creating interfaces using Auto Layout should be Interface Builder.</p>
<p>IB has a few quirks (some would say large number of flaws) which can make it seem like black magic trying to bend it to your will. It leaves you afraid of making any adjustments once you&#8217;ve got something working.</p>
<p>As <a href="https://twitter.com/schwa/status/260872587553411072" rel="nofollow">Jonathan Wight</a> put it:</p>
<blockquote><p>&#8220;When autolayout works it works fantastically well. Now I will back away slowly and not touch anything!&#8221;</p></blockquote>
<p>The first thing to remember: Interface Builder won&#8217;t let you create an interface that has ambiguous constraints. Therefore, when you drop a control onto your interface, IB will automatically add all the constraints required. For views which have intrinsic content sizes like a button, this may show only two constraints. For other views: there will probably be four constraints.</p>
<p><span id="more-76"></span></p>
<h2>The Issues</h2>
<p>This causes some problems:</p>
<ol>
<li>A constraint has been added that you don&#8217;t want, and can&#8217;t get rid of.</li>
<li>You&#8217;ve added a constraint which the system immediately replaces with a constraint which doesn&#8217;t meet your requirements.</li>
</ol>
<h2>Solving Problem 1: Constraints that hang around like a bad smell</h2>
<p>Remember an easy way to see the constraints that apply to a particular view can be seen by selecting the view and then viewing the &#8220;size insepctor&#8221; (opt-cmd-5)</p>
<p><img class="alignnone size-full wp-image-85" title="sizeInspector" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/sizeInspector.png" alt="Screenshot of size insepctor showing constraints" width="260" height="430" /></p>
<p>Once constraints are added, it can be tricky to replace them with the constraints that you actually require.</p>
<p>The first thing to try is just to try deleting the constraint that you don&#8217;t require. Usually this doesn&#8217;t work, but if you&#8217;ve been making changes, it sometimes seems that IB &#8216;forgets&#8217; to clean up after itself, and remove constraints that it added but which are no longer required.</p>
<p>Select the constraint, and press &#8216;delete&#8217;. Sometimes this doesn&#8217;t work even though the constraint is &#8216;deletable&#8217;. In these cases, try reducing the priority of the unwanted constraint to &#8217;1&#8242; and then deleting it.</p>
<p><img class="alignnone size-full wp-image-83" title="priority1" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/priority1.png" alt="Setting the priority of a constraint to 1 in IB" width="327" height="278" /></p>
<p>In the event that this doesn&#8217;t work (highly likely), then IB is protecting you from yourself.</p>
<p><a href="http://carpeaqua.com/2012/11/02/issues-with-achieving-auto-layout-zen/" rel="nofollow">Justin Williams</a> puts it well in his post on Autolayout (emphasis added):</p>
<blockquote><p>&#8220;What frustrates me about setting constraints with Interface Builder is its instance on adding more constraints automatically for me, even if I don’t want/need them. <strong>I’d love some sort of button or setting I can click to tell Interface Builder to back off and just let me handle everything</strong>.&#8221;</p></blockquote>
<p>Unfortunately that doesn&#8217;t exist (yet?) so you currently have to resort to alternative means:</p>
<p>The two solutions are:</p>
<ul>
<li>Ignore IB&#8217;s constraints, add your own constraints and hope that by the time you&#8217;ve finished, your constraints are enough to satisfy IB, and you can delete the extraneous constraints using the methods described above.</li>
<li>Create outlets for any of the IB constraints that you don&#8217;t want and remove them in code.</li>
</ul>
<p>The first solution often invokes our second problem.</p>
<h2>Solving Problem 2: IB thinks its constraints are better than mine</h2>
<p>You ignore IB, merrily adding your constraints, only to look at the list of constraints to find that IB has removed your carefully planned out constraints and replaced them with something else, which may satisfy the layout in its current state, but doesn&#8217;t work when your layout is changed in ways IB can&#8217;t possibly imagine.</p>
<p>The first thing to try is promoting an IB generated constraint (they show up as purple) to a user constraint &#8211; in the size insepctor, click on the constraint and choose &#8220;Promote to user constraint&#8221;. This should tell IB that his constraint is important to you, and (in theory) as long as you don&#8217;t directly contradict the constraint, IB should leave it alone.</p>
<p><img class="alignnone size-full wp-image-84" title="promotingConstraint" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/promotingConstraint.png" alt="Promoing a constraint to user constraint in IB" width="429" height="477" /></p>
<p>The final solution to this problem could be considered the &#8220;nuclear option&#8221;: Let Interface Builder do what it likes, then create outlets to any constraints that you don&#8217;t want, and remove them in code.</p>
<p><img class="alignnone size-full wp-image-82" title="outlet" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/outlet.png" alt="An outlet created from an IB constraint" width="615" height="194" /></p>
<p>This works, but you&#8217;re quite likely to end up with an ambiguous layout and/or having to add additional constraints in code. You lose the benefits of having your interface all nicely set up in IB.</p>
<p>There are no easy answers at the moment. Personally, I&#8217;m tempted to create everything using the Visual Format Language.</p>
<h2>Debugging</h2>
<p>One final related point: If you&#8217;re doing Auto Layout in code, you need better debugging tools than are currently available. iOS does not provide an instruments template for debugging NSLayoutConstraints, which is available under OS X. The good news is that it just seems to be the template missing, and you can create your own by dragging the &#8220;Cocoa Layout&#8221; item from the library to visualize when constraints are added/removed from your interface.</p>
<p><img class="alignnone size-full wp-image-81" title="instruments" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/instruments.png" alt="The library item in Instruments to visualize constraints" width="430" height="251" /></p>
<h2>Related:</h2>
<p>For more on Auto Layout: <strong>iDeveloper.tv</strong> has a course available which covers using Interface Builder and creating constraints in code as well as introducing the debugging tools which are available. All sample code is included. You can see a sample and purchase the course <a href="http://ideveloper.tv/video/autolayoutcourse.html">here</a></p>
<h2>About the Author:</h2>
<div class="aboutTheAuthor"><a href="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/me128.jpg"><img class="authorImage" title="Matt Tancock" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/me128.jpg" alt="Photo of Matt Tancock" width="128" height="128" /><br />
</a></p>
<h2 class="authorName">Matt Tancock</h2>
<p>After spending many years as a teacher and hobby developer Matt has now made his way full time into iOS and OSX development as a researcher and developer for iDeveloper TV.</p>
<p class="authorContact">Twitter: <a title="Matt Tancock on twitter" href="http://twitter.com/mtancock">@mtancock</a><br />
App.net: <a title="Matt Tancock on app.net" href="https://alpha.app.net/mtancock">@mtancock</a><br />
Website: <a title="iDeveloper.tv" href="http://ideveloper.tv">iDeveloper.tv</a></p>
</div>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/m9ElqIvw-5w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/auto-layout-interface-builder-tutorial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.ideveloper.tv/auto-layout-interface-builder-tutorial/</feedburner:origLink></item>
		<item>
		<title>Podcast 71 – Pitch Perfect</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/iLdEKQU4WGA/</link>
		<comments>http://blog.ideveloper.tv/podcast-71-pitch-perfect/#comments</comments>
		<pubDate>Thu, 08 Nov 2012 10:18:30 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=201</guid>
		<description><![CDATA[Scotty and John spend time with TUAW bloggers Steve Sande and Erica Sadun and talk about how to best pitch your new app if you want to get it reviewed by a popular blog. Links Pitch Perfect (iTunes) Pitch Perfect (Amazon) The Unofficial Apple Weblog TAUW Live Interview and Sample Pitch CrashPlan Guest Details Scotty [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty and John spend time with TUAW bloggers Steve Sande and Erica Sadun and talk about how to best pitch your new app if you want to get it reviewed by a popular blog.</p>
<p><span id="more-201"></span></p>
<h2 id="links">Links</h2>
<ul>
<li><a title="Pitch Perfect on iTunes" href="https://itunes.apple.com/us/book/pitch-perfect/id528277176?mt=11">Pitch Perfect (iTunes)</a></li>
<li><a title="Pitch Perfect on Amazon" href="http://www.amazon.com/dp/B0083U5DTC">Pitch Perfect (Amazon)</a></li>
<li><a title="The Unofficial Apple Weblog" href="http://www.tuaw.com">The Unofficial Apple Weblog</a></li>
<li><a title="TUAW Live" href="http://www.tuaw.com/tag/tuawtvlive">TAUW Live</a></li>
<li><a title="Sample Pitch" href="http://www.appdesignvault.com/erica-sadun-pitch-perfect-interview/">Interview and Sample Pitch</a></li>
<li><a title="Crash Plan" href="http://www.crashplan.com/">CrashPlan</a></li>
</ul>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv">iDeveloper TV</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="MemoryMiner Website" href="http://memoryminer.com">Memory Miner</a>, Twitter:<a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">djembe</a></li>
<li>Steve Sande, Blog: <a title="Steves Blog" href="http://dailysteve.com/">The Daily Steve</a> , Twitter:<a href="http://twitter.com/stevensande">@stevensande</a>, App.Net: <a href="http://alpha.app.net/sande">sande</a></li>
<li>Erica Sadun, Blog: <a title="Erica Blog" href="http://ericasadun.com/">Erica Sadun</a> , Twitter:<a href="http://twitter.com/ericasadun">@ericasadun</a>, App.Net: <a href="http://alpha.app.net/ericasadun">ericasadun</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloperlive071.m4a">here</a></p>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" alt="Invasivecode Logo" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/iLdEKQU4WGA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast-71-pitch-perfect/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast-71-pitch-perfect/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/ZuKfXR_zbaA/ideveloperlive071.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloperlive071.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 70 – Jobs and Blogs</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/nTkf0iLhHeM/</link>
		<comments>http://blog.ideveloper.tv/ideveloper-live-70-jobs-and-blogs-2/#comments</comments>
		<pubDate>Thu, 01 Nov 2012 14:29:14 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=132</guid>
		<description><![CDATA[Scotty and John link up with Simon Wolf as they discuss the iPad Mini , Scott Forstall’s departure from Apple and the benefits of blogging. Links Simons Blog Guest Details Scotty from iDeveloper TV, Twitter: @macdevnet, App.Net: Scotty John Fox from Memory Miner, Twitter:@djembe, App.Net: djembe Simon Wolf from Otter Software, Twitter:@sgaw, App.Net: sw Please [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty and John link up with Simon Wolf as they discuss the iPad Mini , Scott Forstall’s departure from Apple and the benefits of blogging.</p>
<p><span id="more-132"></span></p>
<h2 id="links">Links</h2>
<ul>
<li><a title="Simons Blog" href="http://swwritings.com">Simons Blog</a></li>
</ul>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv">iDeveloper TV</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="MemoryMiner Website" href="http://memoryminer.com">Memory Miner</a>, Twitter:<a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">djembe</a></li>
<li>Simon Wolf from <a title="Otter Software" href="http://ottersoftware.com/">Otter Software</a>, Twitter:<a href="http://twitter.com/sgaw">@sgaw</a>, App.Net: <a href="http://alpha.app.net/sw">sw</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloperlive070.m4a">here</a></p>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" alt="Invasivecode Logo" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/nTkf0iLhHeM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/ideveloper-live-70-jobs-and-blogs-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/ideveloper-live-70-jobs-and-blogs-2/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/YFLnVWtoySs/ideveloperlive070.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloperlive070.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 69 – Before You Know It You Have Released</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/9Gkw3tx3EQo/</link>
		<comments>http://blog.ideveloper.tv/ideveloper-live-69-before-you-know-it-you-have-released/#comments</comments>
		<pubDate>Tue, 16 Oct 2012 00:00:39 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=142</guid>
		<description><![CDATA[Scotty and John catch up with Drew McCormack and discuss working as a one man app company. Links Mental Case AptFolk Cream Newsreader Campaign Monitor iDeveloper TV Videocast Objective-Cologne Guest Details Scotty from iDeveloper TV, Twitter: @macdevnet, App.Net: Scotty John Fox from Memory Miner, Twitter:@djembe, App.Net: djembe Drew McCormack from The Mental Faculty, Twitter:@drewmccormack, App.Net: [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty and John catch up with Drew McCormack and discuss working as a one man app company.</p>
<p><span id="more-142"></span></p>
<h2 id="links">Links</h2>
<ul>
<li><a title="Mental Case" href="http://mentalcaseapp.com">Mental Case</a></li>
<li><a title="Apt Folk Website" href="http://aptfolk.com/">AptFolk</a></li>
<li><a title="Cream Newsreader" href="https://itunes.apple.com/us/app/cream/id563511066?mt=12&amp;affId=1503186">Cream Newsreader</a></li>
<li><a title="Campaign Monitor" href="http://www.campaignmonitor.com/">Campaign Monitor</a></li>
<li><a title="iDeveloper TV Videocast" href="http://ideveloper.tv/podcast/idevelopertv.html">iDeveloper TV Videocast</a></li>
<li><a title="Objective Cologne Conference" href="http://objcgn.com/">Objective-Cologne</a></li>
</ul>
<h2 id="guest_details">Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv">iDeveloper TV</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="MemoryMiner Website" href="http://memoryminer.com">Memory Miner</a>, Twitter:<a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">djembe</a></li>
<li>Drew McCormack from <a title="The Mental Faculty Website" href="http://www.mentalfaculty.com/">The Mental Faculty</a>, Twitter:<a href="http://twitter.com/drewmccormack">@drewmccormack</a>, App.Net: <a href="http://alpha.app.net/drewmccormack">drewmccormack</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloperlive069.m4a">here</a></p>
<h2 id="show_sponsors">Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p><a href="http://www.invasivecode.com"><img class="alignnone size-full wp-image-90" title="invasivecode" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" alt="" width="150" height="79" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/9Gkw3tx3EQo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/ideveloper-live-69-before-you-know-it-you-have-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/ideveloper-live-69-before-you-know-it-you-have-released/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/mFDxW2NChUM/ideveloperlive069.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloperlive069.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 68 – Fireside Chats and Passionate Rants</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/C5RdwSwoHco/</link>
		<comments>http://blog.ideveloper.tv/ideveloper-live-68-fireside-chats-and-passionate-rants/#comments</comments>
		<pubDate>Wed, 10 Oct 2012 00:00:34 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=151</guid>
		<description><![CDATA[Scotty and John spend some time catching up by chewing the fat over Auto Layout, Conferences, Glassboard, iOS 6 and loads more. Links iDeveloper TV Auto Layout in iOS 6 Çingleton B1 Visitor Visas Developing Perspective Podcast Guest Details Scotty from iDeveloper TV, Twitter: @macdevnet, App.Net: Scotty John Fox from Memory Miner, Twitter:@djembe, App.Net: djembe [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty and John spend some time catching up by chewing the fat over Auto Layout, Conferences, Glassboard, iOS 6 and loads more.</p>
<p><span id="more-151"></span></p>
<h2 id="links">Links</h2>
<ul>
<li><a title="iDeveloper TV" href="http://ideveloper.tv/podcast/idevelopertv.html">iDeveloper TV</a></li>
<li><a title="Auto Layout in iOS 6" href="http://ideveloper.tv/video/autolayoutcourse.html">Auto Layout in iOS 6</a></li>
<li><a title="Çingleton" href="http://xn--ingleton-r0a.com/en/">Çingleton</a></li>
<li><a title="B1 Visitor Visas" href="http://www.workpermit.com/us/employer_b1_b2.htm">B1 Visitor Visas</a></li>
<li><a title="Developing Perspective Podcast" href="http://developingperspective.com/">Developing Perspective Podcast</a></li>
</ul>
<h2>Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv">iDeveloper TV</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="MemoryMiner Website" href="http://memoryminer.com">Memory Miner</a>, Twitter:<a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">djembe</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://traffic.libsyn.com/ideveloperlive/ideveloperlive068.m4a">here</a></p>
<h2>Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" alt="Invasivecode Logo" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/C5RdwSwoHco" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/ideveloper-live-68-fireside-chats-and-passionate-rants/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/ideveloper-live-68-fireside-chats-and-passionate-rants/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/o7v4n8V1NIY/ideveloperlive068.m4a" length="0" type="audio/mpeg" /><feedburner:origEnclosureLink>http://traffic.libsyn.com/ideveloperlive/ideveloperlive068.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 67 – Transitioning Is Hard</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/RuNeGyrlWsg/</link>
		<comments>http://blog.ideveloper.tv/podcast-67-transitioning-is-hard/#comments</comments>
		<pubDate>Thu, 04 Oct 2012 00:00:28 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=156</guid>
		<description><![CDATA[Scotty and John chat about some of the difficulties you might come across when transitioning existing projects to iOS 6 Links NSConference Mini &#8211; Its All About Business Johns Talk From Appsterdam &#8211; Alternate Paths To Living The Dream Guest Details Scotty from iDeveloper TV, Twitter: @macdevnet, App.Net: Scotty John Fox from Memory Miner, Twitter:@djembe, [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty and John chat about some of the difficulties you might come across when transitioning existing projects to iOS 6</p>
<p><span id="more-156"></span></p>
<h2 id="links">Links</h2>
<ul>
<li><a title="NSConference Mini" href="http://ideveloper.tv/nsconference/">NSConference Mini &#8211; Its All About Business</a></li>
<li><a title="Johns Talk From Appsterdam" href="http://www.youtube.com/watch?v=n1-OKPmQyh4&amp;feature=plcp">Johns Talk From Appsterdam &#8211; Alternate Paths To Living The Dream</a></li>
</ul>
<h2>Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv">iDeveloper TV</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="MemoryMiner Website" href="http://memoryminer.com">Memory Miner</a>, Twitter:<a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">djembe</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://ideveloperlive.s3.amazonaws.com/ideveloperlive067.m4a">here</a></p>
<h2>Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p><a href="http://remobjects.com"><img class="alignnone size-full wp-image-157" title="remobjects" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/remobjects.png" alt="" width="150" height="150" /></a><br />
Company: <a title="Remobjects Website" href="http://remobjects.com">RemObjects</a>, Product: <a title="Data Abstract Website" href="http://www.remobjects.com/da/">Data Abstract</a>, Twitter: <a title="RemObjects on Twitter" href="http://twitter.com/#!/remobjects">@remobjects</a></p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" alt="Invasivecode Logo" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/RuNeGyrlWsg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast-67-transitioning-is-hard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast-67-transitioning-is-hard/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/r5Tp-tOm3qw/ideveloperlive067.m4a" length="22633294" type="audio/mpeg" /><feedburner:origEnclosureLink>http://ideveloperlive.s3.amazonaws.com/ideveloperlive067.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 66 – Success Is A Journey Not A Destination</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/wfFD1OEGSr4/</link>
		<comments>http://blog.ideveloper.tv/podcast-66-success-is-a-journey-not-a-destination/#comments</comments>
		<pubDate>Wed, 26 Sep 2012 00:00:12 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=172</guid>
		<description><![CDATA[Scotty and John have an impromptu talk with Michael Simmons of Flexibits about paying attention to the detail. Links Identical Cousins Podcast Johns Talk From Appsterdam &#8211; Alternate Paths To Living The Dream OOK Programming Language Adobe Source Code Font NSConference Mini &#8211; Design Videos Latest NSConference Guest Details Scotty from iDeveloper TV, Twitter: @macdevnet, [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty and John have an impromptu talk with Michael Simmons of Flexibits about paying attention to the detail.</p>
<p><span id="more-172"></span></p>
<h2 id="links">Links</h2>
<ul>
<li><a href="http://identicalcousins.net ">Identical Cousins Podcast</a></li>
<li><a title="Johns Talk From Appsterdam" href="http://www.youtube.com/watch?v=n1-OKPmQyh4&amp;feature=plcp">Johns Talk From Appsterdam &#8211; Alternate Paths To Living The Dream</a></li>
<li><a title="OOK Progamming Language" href="http://www.stephen-hart.net/programming/ook.html">OOK Programming Language</a></li>
<li><a title="Adobe Source Code Font" href="http://sourceforge.net/projects/sourcecodepro.adobe/">Adobe Source Code Font</a></li>
<li><a title="NSConference Mini - Design Video Pack" href="http://ideveloper.tv/video/nsconferenceminidesignpack.html">NSConference Mini &#8211; Design Videos</a></li>
<li><a title="Latest NSConference" href="http://ideveloper.tv/nsconference/">Latest NSConference</a></li>
</ul>
<h2>Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv">iDeveloper TV</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="MemoryMiner Website" href="http://memoryminer.com">Memory Miner</a>, Twitter:<a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">djembe</a></li>
<li>Michael Simmons from <a title="Flexibits Software" href="http://flexibits.com">Flexibits</a>, Twitter: <a href="http://twitter.com/macguitar">@macguitar</a></li>
</ul>
<p>Please follow our guests on twitter / App.net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://ideveloperlive.s3.amazonaws.com/ideveloperlive066.m4a">here</a></p>
<h2>Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p><a href="http://remobjects.com"><img class="alignnone size-full wp-image-157" title="remobjects" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/remobjects.png" alt="" width="150" height="150" /></a><br />
Company: <a title="Remobjects Website" href="http://remobjects.com">RemObjects</a>, Product: <a title="Data Abstract Website" href="http://www.remobjects.com/da/">Data Abstract</a>, Twitter: <a title="RemObjects on Twitter" href="http://twitter.com/#!/remobjects">@remobjects</a><br />
<a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" alt="Invasivecode Logo" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/wfFD1OEGSr4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast-66-success-is-a-journey-not-a-destination/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast-66-success-is-a-journey-not-a-destination/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/mLz4cAInuRk/ideveloperlive066.m4a" length="24578763" type="audio/mpeg" /><feedburner:origEnclosureLink>http://ideveloperlive.s3.amazonaws.com/ideveloperlive066.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 65 – JSTalk</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/5rko4mFjX2E/</link>
		<comments>http://blog.ideveloper.tv/podcast-65-jstalk/#comments</comments>
		<pubDate>Tue, 11 Sep 2012 00:00:01 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=181</guid>
		<description><![CDATA[Scotty once again has to muddle through without John as he interviews Gus Mueller about the JSTalk scripting language for Mac OS X built on top of JavaScript, with a bridge to Apple&#8217;s Cocoa libraries. Links JSTalk Examples on GitHub JSCocoa Mocha Edge Cases show on Applescript Guest Details Scotty from iDeveloper TV, Twitter: @macdevnet, [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty once again has to muddle through without John as he interviews Gus Mueller about the JSTalk scripting language for Mac OS X built on top of JavaScript, with a bridge to Apple&#8217;s Cocoa libraries.</p>
<p><span id="more-181"></span></p>
<h2 id="links">Links</h2>
<ul>
<li><a title="JSTalk Website" href="http://jstalk.org/">JSTalk</a></li>
<li><a title="Examples on GitHib" href="https://github.com/ccgus">Examples on GitHub</a></li>
<li><a title="JSCocoa Website" href="http://inexdo.com/JSCocoa">JSCocoa</a></li>
<li><a title="Mocoa on GitHub" href="https://github.com/logancollins/Mocha">Mocha</a></li>
<li><a title="Edge Cases Show On Applescript" href="http://www.edgecasesshow.com/013-applescripts-glorious-failure.html">Edge Cases show on Applescript</a></li>
</ul>
<h2>Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv">iDeveloper TV</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>Gus Mueller from <a title="Flying Meat Software" href="http://flyingmeat.com/">Flying Meat Software</a>, Blog: <a title="Blog" href="http://shapeof.com/">The Shape of Everything</a> Twitter: <a href="http://twitter.com/ccgus">@ccgus</a>, App.Net: <a href="http://alpha.app.net/ccgus">ccgus</a></li>
</ul>
<p>Please follow our guests on twitter / App.Net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://ideveloperlive.s3.amazonaws.com/ideveloperlive065.m4a">here</a></p>
<h2>Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p><a href="http://remobjects.com"><img class="alignnone size-full wp-image-157" title="remobjects" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/remobjects.png" alt="" width="150" height="150" /></a><br />
Company: <a title="Remobjects Website" href="http://remobjects.com">RemObjects</a>, Product: <a title="Data Abstract Website" href="http://www.remobjects.com/da/">Data Abstract</a>, Twitter: <a title="RemObjects on Twitter" href="http://twitter.com/#!/remobjects">@remobjects</a></p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" alt="Invasivecode Logo" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/5rko4mFjX2E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast-65-jstalk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast-65-jstalk/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/MOJt93BhRv0/ideveloperlive065.m4a" length="17555698" type="audio/mpeg" /><feedburner:origEnclosureLink>http://ideveloperlive.s3.amazonaws.com/ideveloperlive065.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 64 – All About The ADA</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/nDKH8nYGMKY/</link>
		<comments>http://blog.ideveloper.tv/podcast-64-all-about-the-ada/#comments</comments>
		<pubDate>Wed, 05 Sep 2012 00:00:22 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=186</guid>
		<description><![CDATA[Scotty muddles through without John as he interviews Pieter Omvlee and tries to extract as much information as he can out of him about how he has managed to win not one but two Apple Design Awards. Links Fontcase Sketch Matt Gemmell on API Design Apple Special Event Guest Details Scotty from iDeveloper TV, Twitter: [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty muddles through without John as he interviews Pieter Omvlee and tries to extract as much information as he can out of him about how he has managed to win not one but two Apple Design Awards.</p>
<p><span id="more-186"></span></p>
<h2 id="links">Links</h2>
<ul>
<li><a title="Fontcase" href="http://bohemiancoding.com/fontcase/">Fontcase</a></li>
<li><a title="Sketch" href="http://bohemiancoding.com/sketch/">Sketch</a></li>
<li><a title="Matt Gemmell on API Design" href="http://mattgemmell.com/2012/05/24/api-design/ ">Matt Gemmell on API Design</a></li>
<li><a title="Apple Special Event" href="http://www.loopinsight.com/2012/09/04/apple-announces-special-event-for-september-12/">Apple Special Event</a></li>
</ul>
<h2>Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv">iDeveloper TV</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>Pieter Omvlee from <a title="Bohemian Coding" href="http://bohemiancoding.com/">Bohemian Coding</a>, Twitter: <a href="http://twitter.com/pieteromvlee">@pieteromvlee</a></li>
<li>Simon Wolf from <a title="Otter Software" href="http://ottersoftware.com">Otter Software</a>, Twitter: <a href="http://twitter.com/sgaw">@sgaw</a>, App.Net: <a href="http://alpha.app.net/sw">sw</a></li>
</ul>
<p>Please follow our guests on twitter / App.Net and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://ideveloperlive.s3.amazonaws.com/ideveloperlive064.m4a">here</a></p>
<h2>Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p><a href="http://remobjects.com"><img class="alignnone size-full wp-image-157" title="remobjects" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/remobjects.png" alt="" width="150" height="150" /></a><br />
Company: <a title="Remobjects Website" href="http://remobjects.com">RemObjects</a>, Product: <a title="Data Abstract Website" href="http://www.remobjects.com/da/">Data Abstract</a>, Twitter: <a title="RemObjects on Twitter" href="http://twitter.com/#!/remobjects">@remobjects</a></p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" alt="Invasivecode Logo" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/nDKH8nYGMKY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast-64-all-about-the-ada/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast-64-all-about-the-ada/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/nSr3Rkhk2z8/ideveloperlive064.m4a" length="48969258" type="audio/mpeg" /><feedburner:origEnclosureLink>http://ideveloperlive.s3.amazonaws.com/ideveloperlive064.m4a</feedburner:origEnclosureLink></item>
		<item>
		<title>Podcast 63 – Dependencies and Tags</title>
		<link>http://feedproxy.google.com/~r/idevelopertv/~3/v8L3YCQCH9c/</link>
		<comments>http://blog.ideveloper.tv/podcast-63-dependencies-and-tags/#comments</comments>
		<pubDate>Fri, 31 Aug 2012 00:00:00 +0000</pubDate>
		<dc:creator>Scotty</dc:creator>
				<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://blog.ideveloper.tv/?p=206</guid>
		<description><![CDATA[Scotty and John get together with Simon Wolf and discuss the problems apps have when dependent on a third party service (Including the App Store). Simon also does the big reveal of what avTag actually is. Links Simon Wolfs Blog Cappuccino Project Website Matt Gemmell Blog Bost in Releasing Outside The App Store Guest Details [...]]]></description>
				<content:encoded><![CDATA[<p>Scotty and John get together with Simon Wolf and discuss the problems apps have when dependent on a third party service (Including the App Store). Simon also does the big reveal of what avTag actually is.</p>
<p><span id="more-206"></span></p>
<h2 id="links">Links</h2>
<ul>
<li><a href="http://swwritings.com/ ">Simon Wolfs Blog</a></li>
<li><a title="Cappuccino Project Website" href="http://www.cappuccino-project.org/">Cappuccino Project Website</a></li>
<li><a title="Matt Gemmell Blog Bost in Releasing Outside The App Store" href="http://mattgemmell.com/2012/08/24/releasing-outside-the-app-store/">Matt Gemmell Blog Bost in Releasing Outside The App Store</a></li>
</ul>
<h2>Guest Details</h2>
<ul>
<li>Scotty from <a title="iDeveloper TV Website" href="http://ideveloper.tv">iDeveloper TV</a>, Twitter: <a href="http://twitter.com/macdevnet">@macdevnet</a>, App.Net: <a href="http://alpha.app.net/scotty">Scotty</a></li>
<li>John Fox from <a title="MemoryMiner Website" href="http://memoryminer.com">Memory Miner</a>, Twitter:<a href="http://twitter.com/djembe">@djembe</a>, App.Net: <a href="http://alpha.app.net/djembe">djembe</a></li>
<li>Simon Wolf from <a title="Otter Software" href="http://ottersoftware.com">Otter Software</a>, Twitter: <a href="http://twitter.com/sgaw">@sgaw</a>, App.Net: <a href="http://alpha.app.net/sw">sw</a></li>
</ul>
<p>Please follow our guests on twitter and show them some developer love.</p>
<p>Audio can be downloaded <a href="http://ideveloperlive.s3.amazonaws.com/ideveloper-live-063.m4a">here</a></p>
<h2>Show Sponsors</h2>
<p>Many thanks to our show sponsors who help cover the costs of running the show.</p>
<p><a href="http://remobjects.com"><img class="alignnone size-full wp-image-157" title="remobjects" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/11/remobjects.png" alt="" width="150" height="150" /></a><br />
Company: <a title="Remobjects Website" href="http://remobjects.com">RemObjects</a>, Product: <a title="Data Abstract Website" href="http://www.remobjects.com/da/">Data Abstract</a>, Twitter: <a title="RemObjects on Twitter" href="http://twitter.com/#!/remobjects">@remobjects</a></p>
<p><a href="http://www.invasivecode.com"><img style="margin: 20px 0px 0px 0px;" src="http://kbdso41qguy1opwbl2cfygmf98.wpengine.netdna-cdn.com/wp-content/uploads/2012/10/invasivecode.png" alt="Invasivecode Logo" /></a></p>
<p>Company: <a title="Invasivecode Website" href="http://www.invasivecode.com">Invasivecode</a>, Training: <a title="Invasivecode Training Courses" href="http://www.invasivecode.com/trainingprogram.html">Invasivecode Training Courses</a>, Twitter: <a title="Invasivecode on Twitter" href="http://twitter.com/#!/invasivecode">@invasivecode</a></p>
<img src="http://feeds.feedburner.com/~r/idevelopertv/~4/v8L3YCQCH9c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.ideveloper.tv/podcast-63-dependencies-and-tags/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>

		<feedburner:origLink>http://blog.ideveloper.tv/podcast-63-dependencies-and-tags/</feedburner:origLink><enclosure url="http://feedproxy.google.com/~r/idevelopertv/~5/6hmEFAAswOQ/ideveloper-live-063.m4a" length="36259303" type="audio/mpeg" /><feedburner:origEnclosureLink>http://ideveloperlive.s3.amazonaws.com/ideveloper-live-063.m4a</feedburner:origEnclosureLink></item>
	</channel>
</rss>
