<?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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><description>I am a iPhone/iPod Touch/iPad Developer. Yes, I could have said “iOS Developer,” but then I wouldn’t be able to hit all four keywords in two sentences.

My company Mobile Distortion has a number of apps for sale on the App Store. Additionally, we provide iOS development services for companies looking to have apps developed.

I come from a C#/SQL Server background, and so a lot of my posts come from the perspective of a recent convert to Objective-C. Hoping to help other avoid some of the pitfalls I encountered.

Feel free to email me at james@jamesjennin.gs.</description><title>James Jennings</title><generator>Tumblr (3.0; @jamesjennings)</generator><link>http://jamesjennin.gs/</link><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/JamesJennings" /><feedburner:info uri="jamesjennings" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://tumblr.superfeedr.com/" /><item><title>We interrupt our regularly-scheduled substantive discourse to...</title><description>&lt;object width="400" height="336"&gt;&lt;param name="movie" value="http://www.youtube.com/v/C_E83GfWM-A&amp;rel=0&amp;egm=0&amp;showinfo=0&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/C_E83GfWM-A&amp;rel=0&amp;egm=0&amp;showinfo=0&amp;fs=1" type="application/x-shockwave-flash" width="400" height="336" allowFullScreen="true" wmode="transparent"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;We interrupt our regularly-scheduled substantive discourse to bring you 2 1/2 minutes of nerding out.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JamesJennings/~4/zv_3VO5bjuk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/JamesJennings/~3/zv_3VO5bjuk/847581844</link><guid isPermaLink="false">http://jamesjennin.gs/post/847581844</guid><pubDate>Thu, 22 Jul 2010 19:04:43 -0700</pubDate><category>random</category><feedburner:origLink>http://jamesjennin.gs/post/847581844</feedburner:origLink></item><item><title>How To: Quickly Organize Groups in Xcode</title><description>&lt;p&gt;I must have missed the bus on this one. So, one of my biggest hang-ups with Xcode is the weird disconnect between what it calls “Groups” and folders on the file system. I do my bestest to keep my code organized in Xcode as well as on the disk, which sometimes requires removing and re-adding files in the IDE. This can lead to really disorganized and cluttered groups, which makes it hard to find files.&lt;/p&gt;
&lt;p&gt;Anyway, I was struggling to keep a 200+ file group sorted in Xcode one day, and stumbled upon, completely by accident, a really, really simple way of doing it.&lt;/p&gt;
&lt;p&gt;Say you have a group like the following, which you’d like to get into alphabetical order:&lt;/p&gt;
&lt;p&gt;&lt;img height="300" src="http://media.tumblr.com/tumblr_l5w4sl4dp21qaevfy.png"/&gt;&lt;/p&gt;
&lt;p&gt;Now, in the left panel, click on the name of the group (here, “Pill Images”), and make sure the top right files panel is pulled down. Click on a file in the top right, and hit Command-A to select all.&lt;/p&gt;
&lt;p&gt;&lt;img height="300" src="http://media.tumblr.com/tumblr_l5w4uvpwjx1qaevfy.png"/&gt;&lt;/p&gt;
&lt;p&gt;Now just drag that set of files back into the group in the left panel, and boom, ordered group:&lt;/p&gt;
&lt;p&gt;&lt;img height="300" src="http://media.tumblr.com/tumblr_l5w4wf804l1qaevfy.png"/&gt;&lt;/p&gt;
&lt;p&gt;Easy enough, right?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JamesJennings/~4/URrLgaAaC5o" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/JamesJennings/~3/URrLgaAaC5o/845226020</link><guid isPermaLink="false">http://jamesjennin.gs/post/845226020</guid><pubDate>Thu, 22 Jul 2010 07:03:42 -0700</pubDate><category>iphone</category><category>how to</category><feedburner:origLink>http://jamesjennin.gs/post/845226020</feedburner:origLink></item><item><title>Looking for iPhone, Android and Blackberry developers!</title><description>&lt;p&gt;Hey everybody - looking for some developers (especially iPhone) for some big projects coming up. Drop me a line if you know somebody, or even better, &lt;strong&gt;are&lt;/strong&gt; somebody!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JamesJennings/~4/n_plMj2zq_4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/JamesJennings/~3/n_plMj2zq_4/842773339</link><guid isPermaLink="false">http://jamesjennin.gs/post/842773339</guid><pubDate>Wed, 21 Jul 2010 17:39:48 -0700</pubDate><category>random</category><category>random</category><feedburner:origLink>http://jamesjennin.gs/post/842773339</feedburner:origLink></item><item><title>How Xbox Achievements Work</title><description>&lt;p&gt;Xbox.com’s Engineering Blog has &lt;a href="http://www.xbox.com/en-US/live/engineeringblog/achievements-unlocked.htm"&gt;an interesting piece&lt;/a&gt; on how the Achievements system was implemented. Very interesting read, even as a non-Xbox developer.  I’ve always been curious how console development worked, and how that software has to integrate with services such as Xbox Live.&lt;/p&gt;
&lt;p&gt;Seeing as how the iOS platform is due to get its own social gaming platform, &lt;a href="http://www.xbox.com/en-US/live/engineeringblog/achievements-unlocked.htm"&gt;Game Center&lt;/a&gt;, it will be interesting to see how the two systems compare.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JamesJennings/~4/INjCaWuJJXE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/JamesJennings/~3/INjCaWuJJXE/842724735</link><guid isPermaLink="false">http://jamesjennin.gs/post/842724735</guid><pubDate>Wed, 21 Jul 2010 17:25:45 -0700</pubDate><category>non-mobile</category><feedburner:origLink>http://jamesjennin.gs/post/842724735</feedburner:origLink></item><item><title>Dear Future James: The iPhone Simulator is Case Insensitive, iPhones are Case Sensitive</title><description>&lt;p&gt;July 20, 2010&lt;/p&gt;
&lt;p&gt;Dear Future James,&lt;/p&gt;
&lt;p&gt;If you are reading this, you have probably forgotten (again) that the iPhone Simulator is for some reason case insensitive.  As you might recall (probably not), all iOS devices are case sensitive, and are, in fact, very picky about case.&lt;/p&gt;
&lt;p&gt;I’m writing to remind you of this, so that you don’t spend another hour tracking down a “but it works in the simulator!” type bug.  We did it today, we did it a couple months ago, and we really need to stop doing it.&lt;/p&gt;
&lt;p&gt;Today’s bug involved a lack of a launch image, but only on the device.  This is “First Day on the Job” type stuff, Jim.  A monkey with Xcode has a good chance of getting this right. Anyway, you were clever enough to remember that the launch image needed to be a PNG file, but named it “default.png” instead of “Default.png.”  This, of course, works in the simulator, but not on the device.&lt;/p&gt;
&lt;p&gt;So next time, be sure to engage that amazing attention-to-detail you have, and name the damn file correctly. Or even better, just set the UILaunchImageFile in the info.plist. Then you can name the file whatever you’d like!&lt;/p&gt;
&lt;p&gt;Sincerely,&lt;br/&gt;Past James &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JamesJennings/~4/22nI9O566gk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/JamesJennings/~3/22nI9O566gk/838164365</link><guid isPermaLink="false">http://jamesjennin.gs/post/838164365</guid><pubDate>Tue, 20 Jul 2010 16:00:00 -0700</pubDate><category>dear future james</category><category>iphone</category><feedburner:origLink>http://jamesjennin.gs/post/838164365</feedburner:origLink></item><item><title>Quick Thoughts on the iPhone 4 "Antennagate"</title><description>&lt;p&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=FL7yD-0pqZg"&gt;I don’t care.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;People will still buy iPhone 4s, and all of the other iOS devices.&lt;/li&gt;
&lt;li&gt;a = The number of people who own iPhone 4s and complain about the antenna&lt;br/&gt;b = The number of people who don’t own iPhone 4s and complain about the antenna&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;a &lt; b&lt;/strong&gt; &lt;/li&gt;
&lt;/ol&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JamesJennings/~4/g7rI-0DjkxY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/JamesJennings/~3/g7rI-0DjkxY/837473537</link><guid isPermaLink="false">http://jamesjennin.gs/post/837473537</guid><pubDate>Tue, 20 Jul 2010 12:00:00 -0700</pubDate><feedburner:origLink>http://jamesjennin.gs/post/837473537</feedburner:origLink></item><item><title>I think the Tesla is laughing at everybody…</title><description>&lt;img src="http://27.media.tumblr.com/tumblr_l5uek4PbdE1qamxu8o1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;I think the Tesla is laughing at everybody…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JamesJennings/~4/tODm5qoj-ig" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/JamesJennings/~3/tODm5qoj-ig/835208862</link><guid isPermaLink="false">http://jamesjennin.gs/post/835208862</guid><pubDate>Mon, 19 Jul 2010 23:12:00 -0700</pubDate><category>random</category><feedburner:origLink>http://jamesjennin.gs/post/835208862</feedburner:origLink></item><item><title>Droid X Sabotages Itself If You Mod It?</title><description>&lt;p&gt;I do &lt;strong&gt;try&lt;/strong&gt; to stay neutral in the whole iPhone vs. Android debate, but &lt;a href="http://www.mobilecrunch.com/2010/07/14/droid-x-actually-self-destructs-if-you-try-to-mod-it/"&gt;this here article from MobileCrunch&lt;/a&gt; is pretty depressingly hilarious.&lt;/p&gt;
&lt;p&gt;On the eFuse tampering system built into the Droid X:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span&gt;If the eFuse failes to verify this information then the eFuse receives a command to “blow the fuse” or “trip the fuse”. This results in the booting process becoming corrupted and resulting in a permanent bricking of the Phone. This FailSafe is activated anytime the bootloader is tampered with or any of the above three parts of the phone has been tampered with.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span&gt;I got to see a Droid X for the first time yesterday, and like many Android devices before it, I said to myself “that there is a beautiful phone.” It’s sad to hear about these countermeasures; the phone seems like it’d be a hackers dream to play around with.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;As the article points out, can you imagine if your new MacBook Pro intentionally fried its own processor if you attempted to install Windows on it?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JamesJennings/~4/W8-ECW61QTY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/JamesJennings/~3/W8-ECW61QTY/834001340</link><guid isPermaLink="false">http://jamesjennin.gs/post/834001340</guid><pubDate>Mon, 19 Jul 2010 17:00:00 -0700</pubDate><category>android</category><feedburner:origLink>http://jamesjennin.gs/post/834001340</feedburner:origLink></item><item><title>25-Minute Crash Course in iOS Multitasking (It's a lie!)</title><description>&lt;p&gt;Check out the deck I used for my presentation at &lt;a target="_blank" href="http://www.barcampsd.org/"&gt;BarCampSD&lt;/a&gt;, entitled “iOS Multitasking is a lie. And that’s totally fine.”&lt;/p&gt;
&lt;p&gt;&lt;a href="http://mobiledistortion.com/files/iOS%20Multitasking.pdf"&gt;Get it here.&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JamesJennings/~4/Z2wIId61E0Q" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/JamesJennings/~3/Z2wIId61E0Q/795432069</link><guid isPermaLink="false">http://jamesjennin.gs/post/795432069</guid><pubDate>Sat, 10 Jul 2010 16:46:00 -0700</pubDate><category>barcamp7</category><category>iOS</category><feedburner:origLink>http://jamesjennin.gs/post/795432069</feedburner:origLink></item><item><title>The 5-Minute Guide to Implementing iAd (Correctly)</title><description>&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Today has involved me launching &lt;a target="_blank" href="http://click.linksynergy.com/fs-bin/stat?id=HhDfmk85ej4&amp;offerid=146261&amp;type=3&amp;subid=0&amp;tmpid=1826&amp;RD_PARM1=http%253A%252F%252Fitunes.apple.com%252Fus%252Fapp%252Fprivacy-for-facebook%252Fid374187406%253Fmt%253D8%2526uo%253D6%2526partnerId%253D30"&gt;Privacy for Facebook&lt;/a&gt; every 10 minutes, checking to see if iAd has rolled out to the app. Never in my life have I been so excited to see advertising before.&lt;/p&gt;
&lt;p&gt;Anyway, “in honor” of iAd rolling out live today, I thought I’d give a quick walkthrough on how to implement iAd correctly.&lt;/p&gt;
&lt;p&gt;“But James,” my lone reader asks themselves, “is it even possible in implement iAd incorrectly?” Certainly, dear reader. In fact, Apple made it very easy to do so. See, the iAd banner class (ADBannerView) is right there in the Interface Builder library, so a naive programmer (like me) might just drag that into the interface, rebuild, code sign, deploy.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l4wikuZKhg1qaevfy.png"/&gt;&lt;/p&gt;
&lt;p&gt;Well, if you went that route, you’d very likely receive a nice little email from appreview, that, in part, says the following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“We noticed that your app, Privacy for Facebook, is displaying an empty iAd banner when ad content is not available. The banner within the app should be hidden whenever ad content is not being served by iAd.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Basically, displaying a blank banner is a no-no. There are a couple reasons why banners may not be displayed: they haven’t rolled out or aren’t available in a particular locale, there is no ad inventory available for your specific app, or there could just be a network issue. Apple wants you to make sure you never show blank banners.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l4wim9PUPw1qaevfy.png"/&gt;&lt;/p&gt;
&lt;p&gt;So here’s a quick and dirty way of doing it correctly (assuming a portrait orientation, landscape is left as an exercise for the reader):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add an ADBannerView to your interface, but just off screen. In this example, the ad should be at the bottom of the interface, so the origin of the ADBannerView is 0,460.&lt;img src="http://media.tumblr.com/tumblr_l4wimjNHsx1qaevfy.png"/&gt;
&lt;/li&gt;
&lt;li&gt;Set the view controller as the ADBannerView’s delegate.&lt;/li&gt;
&lt;li&gt;Make sure you’ve included the iAd framework in the view controller’s .h file:
&lt;pre class="brush: objc;"&gt;#import &lt;iAd/iAd.h&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Have the view controller implement ADBannerViewDelegate, and add a bool bannerIsVisible; to the interface&lt;/li&gt;
&lt;li&gt;Add methods like the following to the view controller’s implementation. Note these methods animate the banner up from the bottom, while at the same time resizing my other views (buttonFrame and web).
&lt;pre class="brush: objc;"&gt;- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    if (!bannerIsVisible)
    {
		NSLog(@"bannerViewDidLoadAd");
        [UIView beginAnimations:@"animateAdBannerOn" context:NULL];
        banner.frame = CGRectOffset(banner.frame, 0, -50);
        buttonFrame.frame = CGRectOffset(buttonFrame.frame, 0, -50);
		web.frame = CGRectMake(web.frame.origin.x,
							   web.frame.origin.y,
							   web.frame.size.width,
							   web.frame.size.height-50);
        [UIView commitAnimations];
        bannerIsVisible = YES;
    }
}
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
	if (bannerIsVisible)
	{
		NSLog(@"bannerView:didFailToReceiveAdWithError:");
		[UIView beginAnimations:@"animateAdBannerOff" context:NULL];
		// assumes the banner view is at the top of the screen.
		banner.frame = CGRectOffset(banner.frame, 0, 50);
        buttonFrame.frame = CGRectOffset(buttonFrame.frame, 0, 50);
		web.frame = CGRectMake(web.frame.origin.x,
							   web.frame.origin.y,
							   web.frame.size.width,
							   web.frame.size.height+50);
		[UIView commitAnimations];
		bannerIsVisible = NO;
	}

}&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Test it. Note that in testing mode, Apple will occasionally return an error instead of the Test Ad, so you can make sure your logic is working correctly.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;
&lt;!--EndFragment--&gt;&lt;img src="http://feeds.feedburner.com/~r/JamesJennings/~4/vohbxYjsILA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/JamesJennings/~3/vohbxYjsILA/759225411</link><guid isPermaLink="false">http://jamesjennin.gs/post/759225411</guid><pubDate>Thu, 01 Jul 2010 15:56:00 -0700</pubDate><category>iOS</category><feedburner:origLink>http://jamesjennin.gs/post/759225411</feedburner:origLink></item><item><title>Slide to unlock/view</title><description>&lt;p&gt;Can’t tell if this should be filed under “how-come-I-never-noticed-that” or under “that-is-way-too-subtle”.&lt;/p&gt;
&lt;p&gt;Anyway, when a locked iPhone gets a Push Notification from an app, unlocking it will sometimes open the app that sent the notification, depending on if the device went back to sleep after receiving it. This behavior is pretty obvious after a while.&lt;/p&gt;
&lt;p&gt;What &lt;strong&gt;&lt;em&gt;isn’t&lt;/em&gt;&lt;/strong&gt; obvious, however, is that receiving the notification changes the text in the slider section of the lock screen. This text can even be customized by the app.&lt;/p&gt;
&lt;p&gt;Check it:&lt;/p&gt;
&lt;p&gt;Normal, locked phone. “Slide to Unlock”.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l4t3ilDvNr1qaevfy.png" height="200"/&gt;&lt;/p&gt;
&lt;p&gt;Got a notification. “Slide to View”&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l4t3isBxNE1qaevfy.png" height="200"/&gt;&lt;/p&gt;
&lt;p&gt;Here’s the fun part. I customized the notification:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l4t3tnl7xz1qaevfy.png" height="200"/&gt;&lt;/p&gt;
&lt;p&gt;Here’s a snippet of the push notification payload that shows how that’s done:&lt;/p&gt;
&lt;p&gt;“alert” : { “action-loc-key” : “Freak Out”, “body” : “Ooh, cool!”}&lt;/p&gt;
&lt;p&gt;Very subtle, right?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/JamesJennings/~4/EAtF4EZi8wk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/JamesJennings/~3/EAtF4EZi8wk/752054709</link><guid isPermaLink="false">http://jamesjennin.gs/post/752054709</guid><pubDate>Tue, 29 Jun 2010 19:54:00 -0700</pubDate><category>iOS</category><feedburner:origLink>http://jamesjennin.gs/post/752054709</feedburner:origLink></item></channel></rss>
