App Design in AppKit →
AppKit is not UIKit, but reading this was the most helpful thing I’ve found on the subject so far. Still working out how to lay out larger projects to make them maintainable.
Rejected again...
“Your application, <appname>, cannot be posted to the App Store at this time because it does not adhere to the iPhone Human Interface Guidelines as outlined in the iPhone Developer Program License Agreement section 3.3.5.
I swear my new app doesn’t have anything to do with kittens.
It really doesn’t.
Dynamic Structure
Because the approval process is so long, I can’t go manually updating my apps every time I release a new one, and want to cross promote it. Also because of the approval turnaround time, if you make a typo or release an app with a bug in it, or whatever, you’re stuck with it for at least two weeks.
Solution: dynamic structure!
Make as much of your app as possible updatable without going through the app store. Menus, text, about boxes, internal configurations, everything. This means checking for new config files every time the app launches. If a web resource moves, or a regex string needs to be changed (Fixed, Carrier Pigeon and YTMND use RegexKitLite to filter web content), I could just change a config file and everybody who uses my apps gets updated next time they use it. This can apply to everything and anything in your app. I’m currently polishing up a class (CAUpdateManager) that will handle this all automatically.
// // CAUpdateManager.h // *REDACTED* // // Created by Cory Alder on 09-10-09. // Copyright 2009 Davander Mobile. All rights reserved. // /* // Example usage: CAUpdateManager *myManager = [[CAUpdateManager alloc] initWithCapacity:4]; [myManager manageLocalFileNamed:@"george.plist" remote:@"http://seinfeld.com/george.plist" timingType:CAUpdateManagerTimingTypeDaily]; [myManager manageLocalFileNamed:@"jerry.plist" remote:@"http://seinfeld.com/jerry.plist" timingType:CAUpdateManagerTimingTypeWeekly]; [myManager manageLocalFileNamed:@"kramer.plist" remote:@"http://seinfeld.com/kramer.plist" timingType:CAUpdateManagerTimingTypeDaily]; [myManager manageLocalFileNamed:@"elain.plist" remote:@"http://seinfeld.com/elain.plist" timingType:CAUpdateManagerTimingTypeQuarterly]; //When you feel it's an appropriate time to check for updates, call: [myManager synch]; */
As soon as it’s done (or done enough), I’ll put it on github. It’s nothing complicated, but it’s one of those simple, but time-consuming to implement, tasks that can be modularized and re-used really easily.
It’s also going to work really well with the other class I’m working on right now: PlistViewController. I somewhat prematurely made a github repository for it, it’s still mostly just an idea right now. I think PlistViewController and CAUpdateManager together will allow for some a really powerful dynamic app structure.
I guess I could just make cacheable web apps, but then I’d have to learn javascript.
Approval stops and starts
First it was Fixed getting rejected for a keyword that apple deemed “irrelevant”, now Carrier Pigeon was rejected for using an Apple copyrighted image… (one of these).
It would be easy to blame Apple’s policies, but I think they were both honest mistakes on my part.
It just stinks that simple snafus like this set me back two weeks each.
Oh well, edit, re-compile, re-submit!
Ad performance...
So I’ve just released Fixed, and it’s my first free app. It has an ad banner up at the top of the screen to try to replace the $0.70 purchase income I would be getting if it was a paid app. If you want to skip the rest of this post you can just know that I’m not getting rich any time soon.
Now it’s only been a day since it was approved, so this is all a bit tentative. But the good news is I’m getting lots of “impressions” (ad views) and lots of downloads. Since 9am on the 1st, I’ve gotten 943 views. That’s about 40 ad views an hour, or 0.6 views a minute. Woo-hoo, right? Not really. As noted elsewhere on the internets, iPhone ad click rates are pretty low… optimists say 1%. For relatively obvious reasons people don’t click ads very much on mobile devices. At about $0.01 to $0.03 per click, I’ve earned less than a dollar so far.
It’s not over yet, however. I think Fixed is a really strong app for repeat use. If you like it, you’ll use it often enough that I may build up a user-base strong enough to support it long term. Right now, I wish I had made it $0.99.
One final comment:
Thank the lords of kobal for AdWhirl. Without it I would probably be stuck with just AdMob ads. Right now AdMob is delivering crappy clickthrough rates. Quattro has so far been the best, and AdWhirl has responded accordingly by bumping Quattro to the top priority.
Fixed is in the App Store →
Check it out! It’s FREE!
So many pretty fixies in the palm of your hand!
While Fixed is in the pipeline getting approved, I’ve just submitted my first non-bicycle related app… Carrier Pigeon is a simple utility that tells you which cell phone carrier a number is registered to. Not exactly a swiss-army-knife app, but as far as I know mine is the only app that does this. Basically this is useful because if you want to use a web-to-txt form, you need to know which carrier the person you’re trying to text message uses.
Updates as this, and Fixed, are approved.


I’ve just submitted Fixed to Apple.
We should see this live in a week or so.
This will be FREE! I’m trying out ads, to see if they can compare to a price tag of $0.99.
We’ll see how it plays out.
Details of what Fixed does, beyond what you can see from the screenshot, will be made available once she’s been approved by Apple.
