“How long does it take to get into the app store?” is a question I googled many times leading up to the submital of my app. For those curious, as I was, here is the timeline of my App from submittal of the binary to appearing in the App store.
May 12 2010 7:11 pm – The binary for “Robodamus – Robotic Fortune Teller” is uploaded to Apple’s servers. Status is “Waiting for Review”
May 21, 2010 9:08 am – The status is “In Review”
May 22, 2010 9:30 am – The status is “Ready for Sale”
May 22, 2010 ~11:00 am – The iPhone application is present in the app store.
I’m not sure how quickly my app showed up in the app store but, it was fast. It couldn’t have been there any sooner than 10:30 as I was obsessively checking every 10 minutes or so after 9:30 until I decided that I could better spend my time buying supplies for a home improvement project. It was not until about 11 am that I relapsed into my obsessive compulsive monitoring of the app store and saw it pop up.
You can find my app here.
So, the answer to “how long does it take?” is about a week gauging from my experience.
Now that my app is sitting in the store, it’s time to try and market it. Here’s what I’ve done so far:
- Created a website for the app: http://www.robodamus.com
- Sent messages to all of the YouTube channels I follow(and like) that do iPhone/iPod Touch app reviews asking them to do a review.
- Contacted every iPhone app review site I can find that might be interested in my app. Actually I’m still in the process of doing this….
- Created a FaceBook account for my app’s character, Robodamus. As of this writing I’m up to 72 friends. I posted an announcement when the app was available on the app store. I also posted an announcement on my personal Facebook wall.
- Posted advertisements on most of my tutorial videos on YouTube.
- Created a YouTube video demonstrating the app.
Unfortunetly I have no way to gauge if my “marketing” is having any effect. Regardless, my next steps in marketing my app are:
- Keep writing to the numerous app review sites.
- Using the free Google AdSense advertising dollars I have. A $100 “gift” toward advertising came in the mail recently from Google, so that might be useful. I’ve always been curious how AdSense worked from the advertisers’ perspective.
- Doing a voodoo dance and hoping I get lucky.
Like Owen Goss in his “Numbers (aka Brutal Honesty)” blog post, I plan on sharing my sales data after I have enough to share. I find that sort of information really interesting but difficult to find.
BTW, make sure to check out Owen’s developer blog; it’s one of my favorites. His newest game, Monkeys in Space, is pretty sweet, so check that out as well.
-James
Update 7/24/10: I’ve posted my sales numbers for for the first two months of the application’s availability here.
Well, I’ve finally handed my first application, Robodamus – Robotic Fortune Teller, over to the app store for approval. I’m not entirely sure how long it should take to make it through the review process, but in the meantime, here is the preliminary website for the app:
22,110 (8.2% reduction) 21,970 (8.8% reduction)
This video is the second (and final) part of a video tutorial which demonstrates my method for playing caf files with the iPhone SDK’s AVAudioPlayer. Part 2 of 2.
This video demonstrates my method for playing caf files with the iPhone SDK’s AVAudioPlayer. Part 1 of 2.
This is a video tutorial version of an earlier post. This video demonstrates my method for creating caf files for use with the iPhone SDK’s AVAudioPlayer.
After updating my iPhone to OS 3.0.1 I discovered that I could not run code on it. Apple’s advisory PDF instructs people to use the following command in the terminal (assuming xcode is installed to the typical location).
ln -s /Developer/Platforms/iPhoneOS.platform/DeviceSupport/3.0\ \(7A341\) /Developer/Platforms/iPhoneOS.platform/DeviceSupport/3.0.1
It worked for me
I’m probably not the only one to learn this the hard way, but simply changing the extension of a file from “aiff” to “caf” does not actually produce a proper “caf” file. You’ll find numerous posts claiming that you can do such a thing, but trust me, you’ll leak like a sieve. Sure, it’ll play just fine, but it’ll create a memory leak when playing said file with the AVAudioPlayer in your iPhone project on both the hardware and the simulator.
My new leak-free process for creating sounds is as such:
1. I typically record through garageband (because it is free), and then edit the sound in audacity (also free). I export the sound as a wav file from each app.
2. Convert the wav to a caf by opening the terminal and typing:
afconvert -f caff -d LEI16@11025 infile.wav outfile.caf
and adjusting the value after LEI16@ up or down to balance sound quality and file size.
3. I then drag the “caf” files produced from the step above to the appropriate group/folder in my xcode project with the “Copy items into destination group’s folder” option checked (just my personal preference on copying the files).
Really, only step 2 is worth noting.
A simple class whose purpose was to play sounds might be defined in the following manner:
@interface AVSoundPlayer : NSObject <AVAudioPlayerDelegate> { AVAudioPlayer *msoundPlayer; } @property (nonatomic, retain) AVAudioPlayer *msoundPlayer; -(id)initWithCafFile: (NSString *)inString; -(void) playNum:(int)num; @end
Code to implement the class defined above would look like the following:
@implementation AVSoundPlayer
@synthesize msoundPlayer;
-(id)initWithCafFile: (NSString *)fileName{
if (self = [super init]){
NSBundle *mainBundle = [NSBundle mainBundle];
NSError *error;
NSURL *sURL = [NSURL fileURLWithPath:[mainBundle
pathForResource:fileName ofType:@"caf"]];
self.msoundPlayer = [[AVAudioPlayer alloc]
initWithContentsOfURL:sURL error:&error];
if (!self.msoundPlayer) {
NSLog(@"Sound player problem: %@", [error localizedDescription]);
}
}
return self;
}
-(void) playNum:(int)num{
self.msoundPlayer.numberOfLoops = num;
[self.msoundPlayer prepareToPlay];
AVAudioPlayer *tmpPlayer = self.msoundPlayer;
[tmpPlayer play];
}
- (void)dealloc {
[self.msoundPlayer release];
[super dealloc];
}
@end



