<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>farp.blog &#187; iPhone</title>
	<atom:link href="http://fredandrandall.com/blog/tag/iphone/feed/" rel="self" type="application/rss+xml" />
	<link>http://fredandrandall.com/blog</link>
	<description>Bloggin&#039; about whatever</description>
	<lastBuildDate>Tue, 04 Nov 2014 07:15:30 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.0.38</generator>
	<item>
		<title>Afternoon Apps: Notemark</title>
		<link>http://fredandrandall.com/blog/2013/12/30/afternoon-apps-notemark/</link>
		<comments>http://fredandrandall.com/blog/2013/12/30/afternoon-apps-notemark/#comments</comments>
		<pubDate>Mon, 30 Dec 2013 16:52:31 +0000</pubDate>
		<dc:creator><![CDATA[Randall]]></dc:creator>
				<category><![CDATA[Afternoon Apps]]></category>
		<category><![CDATA[appcache]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[localStorage]]></category>

		<guid isPermaLink="false">http://fredandrandall.com/blog/?p=778</guid>
		<description><![CDATA[I had an idea for an app the other day when I was trying to sort through the notes on my iPhone. I realized that I was using a few of the notes really often, while others just seemed to &#8230; <a href="http://fredandrandall.com/blog/2013/12/30/afternoon-apps-notemark/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://notemark.io"><img class="alignleft size-full wp-image-779" alt="NoteMarkLogo" src="http://fredandrandall.com/blog/wp-content/uploads/2013/12/NoteMarkLogo.png" width="100" height="100" /></a>I had an idea for an app the other day when I was trying to sort through the notes on my iPhone. I realized that I was using a few of the notes really often, while others just seemed to be throwaway. For example, I have a note that is a list of karaoke songs that I want to try and another note that is a list of places to eat.</p>
<p>I thought it would be neat if I could take a note and put it on the home screen as a separate app icon. I&#8217;ve done <a href="http://fredandrandall.com/blog/2012/02/05/how-to-preview-your-icon-on-the-iphone/">some work with home screen bookmarks</a> before and thought I might be able to get it done with a simple web app.</p>
<p>The result is <a href="http://notemark.io">Notemark.io</a>. Notemark lets you type out a note and saves it using HTML5 localStorage APIs. Not only does it use localStorage, but it also uses app caching. This allows Notemark to run even without an Internet connection.</p>
<p>So, in typical <a href="http://fredandrandall.com/blog/category/afternoon-apps/">Afternoon App</a> fashion, I hacked something together that&#8217;s somewhere between a proof of concept and an actual working product. Use it all you can, but just be aware that there are probably some bugs. If you notice something wrong, feel free to open an issue on <a href="https://github.com/blladnar/Notemark/issues">Github</a> or send me a message, but just be warned that I might not get around to fixing the problem.</p>
<p>I&#8217;m not a web developer by trade so the code is messy with plenty of inefficiencies. You can critique my code all you want though!</p>
]]></content:encoded>
			<wfw:commentRss>http://fredandrandall.com/blog/2013/12/30/afternoon-apps-notemark/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Afternoon Apps 2: Scrumbled</title>
		<link>http://fredandrandall.com/blog/2011/11/21/afternoon-apps-2-scrumbled/</link>
		<comments>http://fredandrandall.com/blog/2011/11/21/afternoon-apps-2-scrumbled/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 02:02:04 +0000</pubDate>
		<dc:creator><![CDATA[Randall]]></dc:creator>
				<category><![CDATA[Afternoon Apps]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Descrumbled]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Scrumbled]]></category>

		<guid isPermaLink="false">http://fredandrandall.com/blog/?p=668</guid>
		<description><![CDATA[A few weeks ago I made an app called Descrumbled for cheating at Boggle. I wanted to see if I could build an app in a single afternoon. I built it and released it in one day. The next weekend, &#8230; <a href="http://fredandrandall.com/blog/2011/11/21/afternoon-apps-2-scrumbled/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://fredandrandall.com/blog/wp-content/uploads/2011/11/ScrumbledIcon@2x.png"><img class="alignleft size-full wp-image-670" title="ScrumbledIcon@2x" src="http://fredandrandall.com/blog/wp-content/uploads/2011/11/ScrumbledIcon@2x.png" alt="" width="114" height="114" /></a>A few weeks ago I made an app called Descrumbled for cheating at Boggle. I wanted to see <a title="Afternoon Apps: Descrumbled" href="http://fredandrandall.com/blog/2011/11/06/afternoon-apps-descrumbled/">if I could build an app in a single afternoon</a>. I built it and released it in one day. The next weekend, I found myself with some more free time and I decided to see if I could do it again. The idea was that I would take my Boggle cheating app and turn it in to a Boggle <em>playing </em>app. So I branched <a href="http://itunes.apple.com/us/app/descrumbled/id478640010?ls=1&amp;mt=8">Descrumbled</a> and got to work.</p>
<p>The hardest part of a Boggle app is knowing what words are valid. You need to take a grid of 16 letters and evaluate the thousands of possible combinations against a dictionary of over <a href="http://en.wikipedia.org/wiki/SOWPODS">200,000 words</a>. Luckily, that was already done.</p>
<p>I didn&#8217;t want this to be quite as simple as Descrumbled. I wanted to make it actually worth playing. To do this I added Game Center achievements and a social challenge option.</p>
<p>Basically, there are achievements designed to get you to play the game more. The achievements require you to do things like play 100 games and get certain high scores. There is also a leader board that people can use to see how they stack up against the rest of the world.</p>
<p>Achievements and leader boards are great, but I wanted to add a little bit of a multiplayer aspect to the game. So I added a feature so you can send someone a game board as a challenge. When they click the link in a text, tweet, or email it will open up that game board and let you play it.</p>
<p>The only other sort of interesting thing I did was with advertising. Instead of relying only on iAds, I put in an ad of my own, for Descrumbled. Sometimes iAds fail to load. When that happens, I show a button with an ad for Descrumbled asking the user if their puzzles are too hard. It&#8217;s not super exciting, but it might drive a few more people to download one of my apps and it looks better than a blank space where the ad didn&#8217;t load.</p>
<p>This app didn&#8217;t take a single afternoon. I think I spent probably 3 afternoons on it. When I had it mostly working, I decided to add the social challenge feature and had to change the way the app was architected. That took a little bit more time than I wanted it to.</p>
<p>Be sure to <a href="http://itunes.apple.com/us/app/scrumbled/id480473422?ls=1&amp;mt=8">check it out</a> and let me know what you think.</p>
]]></content:encoded>
			<wfw:commentRss>http://fredandrandall.com/blog/2011/11/21/afternoon-apps-2-scrumbled/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Afternoon Apps: Descrumbled</title>
		<link>http://fredandrandall.com/blog/2011/11/06/afternoon-apps-descrumbled/</link>
		<comments>http://fredandrandall.com/blog/2011/11/06/afternoon-apps-descrumbled/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 02:39:00 +0000</pubDate>
		<dc:creator><![CDATA[Randall]]></dc:creator>
				<category><![CDATA[Afternoon Apps]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone SDK]]></category>

		<guid isPermaLink="false">http://fredandrandall.com/blog/?p=650</guid>
		<description><![CDATA[At events like Startup Weekend, you try to build an idea in a weekend. I wanted to see if I could do something even faster. So I bring you Afternoon Apps, where I build an app in a single afternoon. &#8230; <a href="http://fredandrandall.com/blog/2011/11/06/afternoon-apps-descrumbled/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://fredandrandall.com/blog/wp-content/uploads/2011/11/DescrumbledLogo1.png"><img class="alignleft size-full wp-image-654" title="DescrumbledLogo" src="http://fredandrandall.com/blog/wp-content/uploads/2011/11/DescrumbledLogo1.png" alt="" width="198" height="60" /></a>At events like Startup Weekend, you try to build an idea in a weekend. I wanted to see if I could do something even faster. So I bring you <a href="http://fredandrandall.com/blog/category/afternoon-apps/">Afternoon Apps</a>, where I build an app in a single afternoon.</p>
<p><a href="http://descrumbled.com">Descrumbled</a> is an app for solving Boggle puzzles. Boggle is a word game where you have to find words hidden in a grid of letters. The app lets you enter a board and quickly generate all possible words that can be found in the puzzle. It uses the <a href="http://en.wikipedia.org/wiki/SOWPODS">SOWPODS</a> dictionary to see if a word is valid or not.</p>
<p>I was able to build the app in an afternoon because it is very simple. It lets you pick two board sizes, 4&#215;4 and 5&#215;5. Then you can enter the board, press solve, and seconds later you get a list of all the words. Pressing a word will give you the definition thanks to iOS 5&#8217;s dictionary integration.</p>
<p>The hard part was actually solving the puzzle. Generating all the possible words in the puzzle and checking them against a 230,000 word dictionary is no trivial task. I&#8217;m going to let you in on a little secret. I didn&#8217;t write the boggle solver in a single afternoon. I had written it before by working on it a few hours a day for 3 or so days. It was a programming challenge I found online and I tried to do it. It&#8217;s actually a lot of fun solving a problem like this. I get to think about tries and binary searches. Things I haven&#8217;t actually had to think much about since college. My first stab at it took about 3 minutes to solve a 4&#215;4 puzzle. Since most online Boggle rounds are 1 or 2 minutes, this obviously wasn&#8217;t acceptable. I improved my algorithm and now it takes ~1 second to solve a 5&#215;5 puzzle.</p>
<p>So what did I actually do in an afternoon? I built a UI around my boggle solver class. I had to get a C++ class working on the iPhone (which is actually really easy) and build a UI for entering the board. The squares on the board auto advance the cursor through a grid of UITextFields. It also makes sure the board is complete before it tries to solve. Then I had to make a way to clear the board and switch between a 4&#215;4 grid and a 5&#215;5 grid. The word list UI is just a very simple UITableView. When you press a row, it will open up the definition of the word in a UIReferenceLibraryViewController (new in iOS 5).</p>
<p>That&#8217;s it. The app is meant to be simple and easy to use. It really is a <a href="http://en.wikipedia.org/wiki/Minimum_viable_product">minimum viable product</a>. I did this as an exercise to see if I could build a simple app and submit it to the app store in an afternoon. I want to keep doing these Afternoon Apps every few weeks. I&#8217;d love to see if other people have done similar things and find out how your experience went.</p>
<p>The app should be live any day now. <a href="http://descrumbled.com">Check it out!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fredandrandall.com/blog/2011/11/06/afternoon-apps-descrumbled/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Introducing: HappyCampfire, a Campfire framework for OS X and iOS</title>
		<link>http://fredandrandall.com/blog/2011/10/02/introducing-happycampfire-a-campfire-framework-for-os-x-and-ios/</link>
		<comments>http://fredandrandall.com/blog/2011/10/02/introducing-happycampfire-a-campfire-framework-for-os-x-and-ios/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 02:04:26 +0000</pubDate>
		<dc:creator><![CDATA[Randall]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[happycampfire]]></category>
		<category><![CDATA[happycampr]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://fredandrandall.com/blog/?p=548</guid>
		<description><![CDATA[One of my favorite tools that I use at work is Campfire. If you haven&#8217;t heard of Campfire, it&#8217;s a group chat web app built by 37 signals. It&#8217;s very easy to use and has some fun features. One day &#8230; <a href="http://fredandrandall.com/blog/2011/10/02/introducing-happycampfire-a-campfire-framework-for-os-x-and-ios/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://fredandrandall.com/blog/wp-content/uploads/2011/10/campfirelogo.png"><img class="alignleft size-medium wp-image-609" title="campfirelogo" src="http://fredandrandall.com/blog/wp-content/uploads/2011/10/campfirelogo-300x248.png" alt="" width="300" height="248" /></a>One of my favorite tools that I use at work is <a href="http://campfirenow.com/">Campfire</a>. If you haven&#8217;t heard of Campfire, it&#8217;s a group chat web app built by 37 signals. It&#8217;s very easy to use and has some fun features. One day I started playing around with the Campfire API to see what could be done and from that came the app I&#8217;m working on called HappyCampr. From that app, came the framework HappyCampfire.</p>
<p><a href="https://github.com/blladnar/HappyCamprFramework">HappyCampfire</a> is an objective-c wrapper around most of the Campfire API. It has model objects like users, messages, and rooms. It should allow anyone familiar with Cocoa programming to get right to work on using the Campfire API. It is designed to work on both OS X and iOS but most of the work/testing has been on OS X.</p>
<p>I wanted to put this out there to help people make good innovative uses of Campfire, without having to deal with too many of the nitty gritty details. It&#8217;s definitely still a bit of a work in progress so feel free to fork it and send me a pull request if want to fix/add anything.<span id="more-548"></span></p>
<p>The framework is designed to be asynchronous and uses <a href="http://allseeing-i.com/ASIHTTPRequest/">ASIHTTPRequest</a> for the network communication. It also allows you to make use of Campfire&#8217;s streaming API to get message updates. The project includes a test app for OS X that will let you test all of the different parts of the framework.</p>
<p>To get started you&#8217;ll create an object like this</p>
<pre class="brush: objc; title: ; notranslate">
campfire = [[HappyCampfire alloc] initWithCampfireURL:@&quot;https://YOUR_CAMPFIRE_URL.campfirenow.com&quot;];
campfire.authToken = @&quot;YOUR_AUTH_TOKEN&quot;;

[campfire sendText:@&quot;Hello World&quot; toRoom:@&quot;ROOM_NUM&quot; completionHandler:^(HCMessage *message, NSError *error){

   NSLog(@&quot;%@&quot;, message);

}];
</pre>
<p>If you&#8217;re interested in using the streaming API that&#8217;s really easy too.</p>
<pre class="brush: objc; title: ; notranslate">

campfire.delegate = self;
[campfire startListeningForMessagesInRoom:@&quot;ROOM_NUMBER&quot;];

// Then you'll implement the CampfireResponseProtocol
-(void)messageReceived:(HCMessage *)message
{
   NSLog(@&quot;Message: %@&quot;, message);
}
</pre>
<p><a href="https://github.com/blladnar/HappyCamprFramework/">Check it out on GitHub</a></p>
]]></content:encoded>
			<wfw:commentRss>http://fredandrandall.com/blog/2011/10/02/introducing-happycampfire-a-campfire-framework-for-os-x-and-ios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to launch your Mac/iOS app with a custom URL</title>
		<link>http://fredandrandall.com/blog/2011/07/30/how-to-launch-your-macios-app-with-a-custom-url/</link>
		<comments>http://fredandrandall.com/blog/2011/07/30/how-to-launch-your-macios-app-with-a-custom-url/#comments</comments>
		<pubDate>Sat, 30 Jul 2011 23:02:09 +0000</pubDate>
		<dc:creator><![CDATA[Randall]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[custom url]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone SDK]]></category>
		<category><![CDATA[MacOS]]></category>
		<category><![CDATA[objc]]></category>

		<guid isPermaLink="false">http://fredandrandall.com/blog/?p=473</guid>
		<description><![CDATA[One interesting feature of iOS and Mac apps is the ability for them to be launched by a custom URL. What this means is that you can set up your app to respond to different links in different ways. Clicking &#8230; <a href="http://fredandrandall.com/blog/2011/07/30/how-to-launch-your-macios-app-with-a-custom-url/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://fredandrandall.com/blog/wp-content/uploads/2011/07/http.jpg"><img class="alignleft size-medium wp-image-488" title="http" src="http://fredandrandall.com/blog/wp-content/uploads/2011/07/http-300x197.jpg" alt="" width="210" height="138" /></a>One interesting feature of iOS and Mac apps is the ability for them to be launched by a custom URL. What this means is that you can set up your app to respond to different links in different ways.</p>
<p>Clicking a link that says myTwitterApp://sendTweet?tweet=hello could send a tweet from your twitter app. It could also be used for configuring your app. Maybe you have an email app that needs some special server configurations. It could be set up so that you just have to visit a webpage on your server and click a link and have it automatically configure your email settings.</p>
<p>Facebook uses the URL scheme for authentication in their iPhone app. If I have an app that wants to authenticate with Facebook, it will try and talk to the Facebook app on the phone so I don&#8217;t have to authenticate again in my other app.</p>
<p>I think this is a pretty underused feature and I would bet there are TONS of clever things people can do with it. So how do you actually do it?<span id="more-473"></span></p>
<p>I&#8217;m going to show you how I&#8217;m adding it to the next versions of Thoughtback.</p>
<p>Your first step is adding a URL type to your app&#8217;s info.plist. You will add the same key if you&#8217;re making an iOS or Mac app. The raw key is CFBundleURLTypes.</p>
<p><a href="http://fredandrandall.com/blog/wp-content/uploads/2011/07/urltype.png"><img class="aligncenter size-medium wp-image-474" title="urltype" src="http://fredandrandall.com/blog/wp-content/uploads/2011/07/urltype-300x66.png" alt="" width="300" height="66" /></a></p>
<p>Once the key is added links that start with thoughtback:// will launch the apps on both iOS and OS X.</p>
<p>Just launching from a URL is fine, but how do you get any information out of the URL that was clicked? That&#8217;s where the process differs between the two platforms.</p>
<p><strong>iOS</strong><br />
Go into your applicationdelegate and override either of these two methods.</p>
<pre>- (BOOL)application:(UIApplication *)application 
           handleOpenURL:(NSURL *)url

- (BOOL)application:(UIApplication *)application 
            openURL:(NSURL *)url 
  sourceApplication:(NSString*)sourceApplication 
         annotation:(id)annotation</pre>
<p><em></em>I should mention that the first method is deprecated, but the second one is only available on iOS 4.2 or later.</p>
<p><strong>Mac OS</strong><br />
This is slightly different on the mac, URL handling is not part of the NSApplicationDelegate protocol.</p>
<p>What you&#8217;ll need to do is tell the application to respond to an Apple Event.</p>
<pre class="brush: objc; title: ; notranslate">
-(void)applicationWillFinishLaunching:(NSNotification *)aNotification
{
    NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager];
    [appleEventManager setEventHandler:self
                           andSelector:@selector(handleGetURLEvent:withReplyEvent:)
                         forEventClass:kInternetEventClass andEventID:kAEGetURL];
}

- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent
{
    NSURL *url = [NSURL URLWithString:[[event paramDescriptorForKeyword:keyDirectObject] stringValue]];
}
</pre>
<p><strong>Parsing the URL</strong><br />
So now that you have the URL that launched your app, you&#8217;ll want to get the information out of the string. The most typical way to send information is with a query string. Here&#8217;s an example that Thoughtback will use.</p>
<p>thoughtback://send?thought=Interesting Thought&amp;redirect=http://fredandrandall.com</p>
<p>We want to pull out a few different things from that. First we want to grab &#8220;send&#8221; because that&#8217;s the action thoughtback will take. Then we want to get the thought that will be sent and the url that Thoughtback will redirect to when it&#8217;s done sending the thought.</p>
<p>To parse out &#8220;send&#8221; we can use NSURL&#8217;s host method.</p>
<p>To get the query string, we can use NSURL&#8217;s query method.</p>
<p>Parsing the query string is a little more difficult but this block of code, that I found on <a href="http://stackoverflow.com/questions/6591280/how-to-parse-an-asset-url-in-objective-c">StackOverflow</a>, will put it into an NSDictionary for you.</p>
<pre class="brush: objc; title: ; notranslate">
NSString *query = [url query];
NSArray *queryPairs = [query componentsSeparatedByString:@&quot;&amp;&quot;];
NSMutableDictionary *pairs = [NSMutableDictionary dictionary];
for (NSString *queryPair in queryPairs) {
  NSArray *bits = [queryPair componentsSeparatedByString:@&quot;=&quot;];
  if ([bits count] != 2) { continue; }

  NSString *key = [[bits objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  NSString *value = [[bits objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

  [pairs setObject:value forKey:key];
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://fredandrandall.com/blog/2011/07/30/how-to-launch-your-macios-app-with-a-custom-url/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What I learned from working with my first client</title>
		<link>http://fredandrandall.com/blog/2011/04/30/what-i-learned-from-working-with-my-first-client/</link>
		<comments>http://fredandrandall.com/blog/2011/04/30/what-i-learned-from-working-with-my-first-client/#comments</comments>
		<pubDate>Sat, 30 Apr 2011 17:33:44 +0000</pubDate>
		<dc:creator><![CDATA[Randall]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[GoMongo]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[iPhone SDK]]></category>

		<guid isPermaLink="false">http://fredandrandall.com/blog/?p=352</guid>
		<description><![CDATA[A few months ago I was contacted by a friend of a friend on Facebook who owns a local creative marketing agency. He knew I had made the Thoughtback iPhone app and was wondering if I&#8217;d be interested in doing &#8230; <a href="http://fredandrandall.com/blog/2011/04/30/what-i-learned-from-working-with-my-first-client/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://fredandrandall.com/blog/wp-content/uploads/2011/04/BDsforBlog.png"><img class="alignleft size-medium wp-image-346" title="BDsforBlog" src="http://fredandrandall.com/blog/wp-content/uploads/2011/04/BDsforBlog-154x300.png" alt="" width="154" height="300" /></a>A few months ago I was contacted by a friend of a friend on Facebook who owns a local creative marketing agency. He knew I had made the Thoughtback iPhone app and was wondering if I&#8217;d be interested in doing some work on an iPhone app for him. I decided to head down to his office and find out more.</p>
<p>At that first meeting, he told me that <a href="http://www.gomongo.com">bd&#8217;s Mongolian Grill</a>, one of their clients, wanted an iPhone app and they had no idea how to make one. That was where I came in. We talked a lot about the whole process of building an app and what was even possible to do with an iPhone. I was expecting something more like a job interview, but was surprised when it wasn&#8217;t. They told me that they were going to talk about what features they wanted to put in the app and get back to me.</p>
<p>A few days later, I came in again to talk about the features that they wanted to add and to see if what they wanted was realistic. At this point I wasn&#8217;t sure if I was going to be making the app or if they were evaluating me. I guess they had pretty much already decided I would be hired, since either at that meeting or in an email right after, they asked how much I would charge to build this app for them.</p>
<p><span id="more-352"></span></p>
<p><strong>How much should I charge?</strong></p>
<p>How much to charge is a really hard question. On one hand, I wanted them to hire me and was afraid that if I charged too much they&#8217;d try to find someone else. On the other hand, I&#8217;m a qualified, professional, software engineer and my time is worth real money. I was really hoping they were going to make me an offer so I wouldn&#8217;t have to come up with the number myself.</p>
<p>I did some googling and found some crazy numbers. <a href="http://stackoverflow.com/questions/209170/how-much-does-it-cost-to-develop-an-iphone-application">People</a> were saying anywhere from $10,000 &#8211; $50,000. I tried doing an estimate of how many hours it would take and then multiplying it by what I get payed at my day job. All these numbers seemed unreasonable to me. $10,000 dollars is a TON of money. Remember, this is NOT how I make my living so I don&#8217;t actually need the money, it&#8217;s all gravy. I ended up picking a number that would let me take a couple pretty awesome vacations, but still not be unreasonable for a smaller company to pay. I think I lowballed myself a little bit because obviously development takes longer than you think.</p>
<p><strong>You&#8217;re worth more than you think!</strong></p>
<p>If I had any advice for someone else in my situation, pick a number that seems just a <em>little</em> bit too high. Remember, you can&#8217;t get money you don&#8217;t ask for. Don&#8217;t worry if it&#8217;s something you haven&#8217;t done before. Odds are good that you can. One of the reasons I think I went low is because I wasn&#8217;t sure I could actually do what they wanted. Now that I actually finished it, that seems silly because I was able to do everything they wanted (and more).</p>
<p><strong>How long is this going to take?</strong></p>
<p>Of course, with the money estimate, they wanted a time estimate. This was another tough one. I had never done an iPhone app of this scale before. They wanted lots of stuff that I&#8217;ve never done before like Facebook sharing, Twitter sharing, and use of the iPhone&#8217;s Camera. So I went through each feature and figured out how long I thought it should take in hours. Then I added a little padding time because everything always takes longer than expected. Thankfully, my client understood that too and added some more padding of their own onto the deadline.</p>
<p><strong>You suck at estimating!</strong></p>
<p>Well, maybe you don&#8217;t, but I do and so do most other people I know. There are always a ton of factors you don&#8217;t think about when making that first estimate. In my case, I was thinking I would spend about 2 hours a day working on the app after I got home from work. What I wasn&#8217;t thinking about was my weeklong vacation to Florida and all of the time I wanted to spend having a life (hanging out with my girlfriend, playing video games, going to movies, etc.). So towards the end of the project, 2 hours a day turned into 3 or 4 and some weekends were even longer. I also wasn&#8217;t anticipating all of the changes that my client would want me to make. I had to completely change some functionality mid way through because they wanted something different. This brings me to my next point.</p>
<p><strong>Working for a client is NOT like working for a company that sells software!</strong></p>
<p>Where I work, we don&#8217;t have clients. We sell software to consumers. Our deadlines are self imposed and we have to come up with our own specs. When you work with a client, they set deadlines and they tell you what they want in the app. They get what they want, because they&#8217;re paying for it.</p>
<p><strong>Will you do it again?</strong></p>
<p>Hmmm, it&#8217;s hard to say. This has been a very positive experience. It&#8217;s a great way to pull in some extra spending cash and I learned a TON about iPhone development. The company I worked with was really great. We kept in constant communication the whole time and they gave me a lot of freedom in finishing out some small parts of the design that weren&#8217;t in their mockups.</p>
<p>Even though it was awesome, it was a lot of work. I don&#8217;t really <em>need</em> the money and as much as I like doing development on the side, it&#8217;s nice to be able to set something down when I want to.</p>
<p>I would recommend any developer with some spare time to try something like this at least once. I really learned a lot, not just about development, but about communication and working with others.</p>
]]></content:encoded>
			<wfw:commentRss>http://fredandrandall.com/blog/2011/04/30/what-i-learned-from-working-with-my-first-client/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Why Apple is winning and Android&#8217;s bigger market share doesn&#8217;t matter</title>
		<link>http://fredandrandall.com/blog/2011/03/19/why-apple-is-winning-and-androids-bigger-market-share-doesnt-matter/</link>
		<comments>http://fredandrandall.com/blog/2011/03/19/why-apple-is-winning-and-androids-bigger-market-share-doesnt-matter/#comments</comments>
		<pubDate>Sat, 19 Mar 2011 15:41:33 +0000</pubDate>
		<dc:creator><![CDATA[Randall]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[smartphone wars]]></category>
		<category><![CDATA[tigerblood]]></category>
		<category><![CDATA[winning]]></category>

		<guid isPermaLink="false">http://fredandrandall.com/blog/?p=279</guid>
		<description><![CDATA[I was reading an article on Engadget this morning about ATT sending messages to their users that are illegally tethering their iPhones. Most of the comments were anger at ATT, &#8220;How dare they prevent me from using their services illegally!&#8221; &#8230; <a href="http://fredandrandall.com/blog/2011/03/19/why-apple-is-winning-and-androids-bigger-market-share-doesnt-matter/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://fredandrandall.com/blog/wp-content/uploads/2011/03/winningblog-e1300548286182.png"><img class="alignleft size-medium wp-image-280" title="winningblog" src="http://fredandrandall.com/blog/wp-content/uploads/2011/03/winningblog-e1300548419613-300x280.png" alt="" width="300" height="280" /></a>I was reading an <a href="http://www.engadget.com/2011/03/18/atandt-tells-customers-using-unauthorized-tethering-methods-to-pay/">article</a> on <a href="http://www.engadget.com">Engadget</a> this morning about ATT sending messages to their users that are illegally tethering their iPhones. Most of the comments were anger at ATT, &#8220;How dare they prevent me from using their services illegally!&#8221; but there was one that caught my attention. It referenced the fact that because ATT was so shitty and expensive, some other wireless company was going to swoop in and steal their users by providing a more affordable, better tethering plan.</p>
<blockquote><p>They compared it to what Android did to iOS. Some other big provider who would have done the same thing will step in and capitalize on the people&#8217;s indignation just like Android capitalized on people&#8217;s disappointment over Apple&#8217;s closed model.</p></blockquote>
<p>Sure, lots of people hate Apple&#8217;s closed model. It&#8217;s bad for geeks. We can&#8217;t tinker with things like we can on our desktop computers. You know who doesn&#8217;t hate it? Everyone else. Apple&#8217;s model is perfect for the general consumer. They make it easy to install apps. They make it easy to put music on the phone. They basically make using an iPhone fun and easy. People don&#8217;t care about &#8220;open&#8221;. They care about shiny.<span id="more-279"></span></p>
<p>The smartphone wars are not about operating systems. They&#8217;re about phones. Of course Android is going to have a bigger market share. There are over <a href="http://en.wikipedia.org/wiki/Comparison_of_Android_devices">100 Android devices</a> you can buy. There are 6 iOS devices. The fact that iOS is even in the running shows how good of a job Apple has done with it.</p>
<p>Regular people don&#8217;t look at specs. They don&#8217;t think or know about how much money Apple takes from developers. They don&#8217;t realize there is a review process where Apple can arbitrarily block apps from being in the App Store. What they know is that their iPhone can play Angry Birds and that whatever they want to do &#8220;there&#8217;s an app for that.&#8221; My sister-in-law recently got an EVO 4G, but after about a week, she took it back and went to Verizon and got an iPhone. You know why she switched? Because she couldn&#8217;t get service with Sprint in her house. That&#8217;s why regular people buy phones. It doesn&#8217;t have anything to do with tethering or openness. I asked her which phone she liked better, she told me the iPhone because it was easier to use and she loved playing with <a href="http://www.instagram.com">Instagram</a>.</p>
<p>I think what people reading Engadget often forget is that we are not regular people. I know my worldview is warped because the things I read and the people I hang out with are not normal. I live in a bubble where everyone is tech savvy (I&#8217;m a software engineer) and keeps up with the latest and greatest gizmos and gadgets. The rest of the world doesn&#8217;t care about the same stuff we do and that&#8217;s fine.</p>
<p>Android is not going to beat iOS in the consumer world anytime soon. The cultures of the two companies are too different. Google is a hardcore engineering company. They want to solve the most interesting problems and build the most powerful products. Apple, while certainly not lacking in the engineering department, has a culture of design first. They attack problems differently and solve them in a way that is best for the consumer. With that said, I think Google is doing something great with Android. They&#8217;re bringing smartphones to everyone. Apple is never going to target the guy that is only going to buy a 15 dollar pay as you go phone. Just like BMW isn&#8217;t trying to sell to Joe Schmoe that lives in Detroit and works on an assembly line.</p>
]]></content:encoded>
			<wfw:commentRss>http://fredandrandall.com/blog/2011/03/19/why-apple-is-winning-and-androids-bigger-market-share-doesnt-matter/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How to take advantage of the iPhone 4 retina display</title>
		<link>http://fredandrandall.com/blog/2010/10/29/hi-res-icon-issues/</link>
		<comments>http://fredandrandall.com/blog/2010/10/29/hi-res-icon-issues/#comments</comments>
		<pubDate>Sat, 30 Oct 2010 00:38:44 +0000</pubDate>
		<dc:creator><![CDATA[Randall]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[objc]]></category>
		<category><![CDATA[retina display]]></category>

		<guid isPermaLink="false">http://fredandrandall.com/blog/?p=120</guid>
		<description><![CDATA[The &#8220;retina display&#8221; on the iPhone 4 is really awesome. Icons and photos are sharper than any screen I&#8217;ve ever seen. Obviously, I would want to take advantage of this in my own app. How did I go about doing &#8230; <a href="http://fredandrandall.com/blog/2010/10/29/hi-res-icon-issues/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>The &#8220;retina display&#8221; on the iPhone 4 is really awesome. Icons and photos are sharper than any screen I&#8217;ve ever seen. Obviously, I would want to take advantage of this in my own app. How did I go about doing that you ask?</p>
<p>On the iPhone, one way to create UIImages is like this:</p>
<pre class="brush: objc; title: ; notranslate">

[UIImage imageNamed:@&quot;compassGreen.png&quot;];

</pre>
<p>It&#8217;s very simple and easy. Now how do you take advantage of the retina display?</p>
<p>Just make your image twice as big as the control.</p>
<p>Thats it? Yes, that is it, sort of. What if your designer doesn&#8217;t trust the cocoa touch scaling algorithm? How do you load a different icon for the older iPhones?</p>
<p><span id="more-120"></span></p>
<pre class="brush: objc; title: ; notranslate">
if( has retina display )
{
   [UIImage imageNamed:@&quot;hiResImage.png&quot;];
}
else
{
   [UIImage imageNamed:@&quot;regularResImage.png&quot;];
}
</pre>
<p>NO! Don&#8217;t do that. You could do it that way if you really wanted, but then every time you wanted to use an image you&#8217;d have to type that if statement. Also, what would you do for images in Interface Builder?</p>
<p>Luckily, Apple knows what they&#8217;re doing and added a URL naming scheme to solve this problem. Name your regular resolution image image.png and then your high resolution image will be image@2x.png. Then all of your calls will use the regular image name. So you just say [UIImage imageNamed:@&#8221;image.png&#8221;] and then it will automatically load the correct image based on your device.</p>
<p>It wasn&#8217;t all puppies and rainbows. I had a hard time getting some of my images to load correctly. I couldn&#8217;t figure it out. They looked great in Interface Builder but they wouldn&#8217;t load on my phone. It was just the hi-res versions too. It turned out that when I was saving them in Photoshop I didn&#8217;t change the image format. I just changed the file extension. This meant that even though the files <em>looked</em> like PNGs to me, they were actually PSDs. For some reason, they work just fine in Interface Builder, even though they aren&#8217;t PNGs.</p>
]]></content:encoded>
			<wfw:commentRss>http://fredandrandall.com/blog/2010/10/29/hi-res-icon-issues/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
