Ad

Our DNA is written in Swift
Jump

AppRanking 1.1.1

NOTE: AppRanking has been deprecated in favor of Applyzer.

Michael Dorn has updated AppRanking to version 1.1.1 and made it even more WOW. I tried it out with the app ID for iWoman and was rather astonished to see that my app has made it into the top 10 apps of category Health&Fitness in 8 countries. This could happen to you to if you start checking out changes of your app’s ranks with with useful tool.

What’s new?

  • Rankings are now saved (optional)
  • Export to CSV of ranking history
  • AppIDs are now saved
  • Expanded instructions
  • Lots of bug fixes

Known issues

  • No pretty icon, yet
  • Don’t click on the header to sort the results while update is in progress. You might mix up countries and ranks. But that’s only a display issue, ranks seem to be saved correctly in the history.

AppRanking 1.1.1

Note that you can easily select all countries by clicking on the header above the country checkboxes.

AppRanking for FREE (No longer available, see above note)


It’s a ZIP file with an Mac APP inside. Again, like all free software this comes without any warranty. Use at your own risk.

Peer Reviews

For a long time I was unable to review other people’s apps because those 50 promo codes you get per version only work in the US store. But then somebody showed my a secret maneuver that allows anybody to get an iTunes account with access to the US store. (Mail me if you must know).

Now don’t get me wrong, I don’t want to get into the app reviewing business. I rather leave this to my friends, like Crazy Mike. But I see that there is a niche somewhere between the consumer-oriented review sites, the in-store iTunes reviews and the internal secrect review process inside of Apple. This niche is providing unbiased opinions of a fellow developer.

That’s something only somebody can provide who themselves keeps going through the long and painful development process. Those who not just develop apps, but also develop themselves. Read more

Unicode, Schmunicode!

You are listening to user feedback, especially those in Italy. You solve all their problems with a new version, in my case LuckyWheel 1.0.3. You polish it, test it (you think) and submit it to Apple for review. After a week you get this message back:

Your applications, LuckyWheel and LuckWheel Lite, cannot be posted to the App Store at this time because they do not achieve the core functionality described in your marketing materials, or release notes.  Applications must adhere to the iPhone Human Interface Guidelines as outlined in iPhone SDK Agreement section 3.3.5.

The release notes for both applications state, “Italian UI and Instructions added”.  However, in our review, when we put the device into Italian language mode and launched the applications, the application UI was still in English.  Only the instructions were changed to Italian.  See attached screenshots.

In order for your applications to be reconsidered for the App Store, please resolve this issue and upload your new binaries to iTunes Connect.

That’s a very long way to say: “Hey buddy, your Italian is English!”

When I got this message I was stumped. I though I had tested it. Thieves! Who has stolen my Italian UI?! But then I remembered something I had found out some months ago.

Read more

Stanford University iPhone Programming Course

Stanford UniversityFamous Standford University goes the way of the modern educational institution and beginning today makes it’s iPhone Programming Course available in parallel on iTunes U for free while it is being taught live in class by original Apple framework guru Evan Doll. So you don’t get a dusty teacher figure, but the real thing!

I encourage all students of Cocoa Touch to participate in the sessions. Simply subscribe to the video podcast on  iTunes U and watch it comfortably at home or on your iPhone. The course material including downloads and assignments can be found on an accompanying web site. Don’t be fooled by the low price tag: FREE. People usually don’t appreciate what can be had for nothing, but in this case you probably cannot find anything better.

Read more

"AppRanking for FREE" by Michael Dorn

NOTE: AppRanking has been deprecated in favor of Applyzer.

Michael Dorn (my collaborator on LuckyWheel) just couldn’t stand having to dig through iTunes to find how our game is doing in 62 iTunes countries. So he took it upon himself to create a nifty tool that allows you to conveniently look up rankings of any app. He wrote it in RealBASIC as an OSX desktop app in less than one day.

AppRanking Screenshot

Michael makes it available to all readers of Dr. Touch because it’s just soooo useful. And for free, that’s how nice he is!

AppRanking for FREE (No longer available, see above note)


It’s a ZIP file with an Mac APP inside. Again, like all free software this comes without any warranty. Use at your own risk.

Minimum/Maximum of Multiple Values

MadIvad asks:

Is there some sort of math function for the minimum of a set of values? I have searched the docs and not found one reference to math in iPhone OS2.2, and min only returns the like of ‘minimum’ for different control values. or for stating what the minimum of the integer or NSUInt class etc…

Does a function/class/anything exist that would simply return the lowest value of 2 or more values?

Boy, that was easy. There are compiler macros defined that work on any scalar datatype. MIN(a,b) and MAX(a,b). Note the case.

Read more

Cracker Tracker and Apple Stalker

I would like to draw your attention to two ideas that might work if enough people organize and contribute. I know that your time is valuable and most of you won’t have extra time to spend helping with a “good iPhone cause”, but hear me out. If we organize, contribute automatically we can all benefit enormously.

Read more

Variable Number of Decimal Places

Trapper asks:

I have one integer holding a variable number of decimal places that another variable needs to be rounded to when I stringWithFormat it. What is the correct way to do this?

Trapper is not content with just specifying %.2f in a stringWithFormat, but he wants the number of decimal places to be dependent on a second variable.

Here is the shortest method I came up with.

int decimals = 3;
double d = 3.1415;
   
NSString *format = [NSString stringWithFormat:@"%%%0.1ff", decimals/10.0];
NSString *formattedString = [NSString stringWithFormat:format, d]; // e.g. %0.3f 
NSLog(formattedString);

I got confused at first because the NSLog would always output a strange value when wanted to output the formatting string. Then I remembered that the first parameter of NSLog itself is also interpreting formatting information. NSLog combines stringWithFormat into the output.

That’s good to know in case you want to add an NSLog statement for debugging floating point variables.

double d = 3.1415;
NSLog("%0.2f", d);  // formatting directly here

Don't Quit Your Day Job

Rob asks:

I have decided to start writing apps as a full time job. Assuming I can master this, and assuming I can get 1 app per month accepted in the App Store, can anyone give me some guidance on how much income I am likely to make.

Here are some numbers from my data that might help you:

  • A general purpose tool app like GeoCorder might sell between 1 and 5 copies a day.
  • Something interesting or unusual like iFR Cockpit can expect to sell around 5-10 copies a day.
  • A niche market tool like iWoman might to do well at 10-20 copies a day.
  • A game like LuckyWheel would sell around 20 copies a day IF you also have a LITE Version that has about 900-1000 downloads a day. Without a LITE version it could only be 5-10 copies a day.;-)

So assuming you concentrate on niche apps and games and calculating from $25 a day per such app you might make around $2000 a month if you manage to land 3 of those in the store. NOT taken into account additional cost like taxes or hardware. And not considering that Apple has the painful final word. Does that sound easy enough for you to immediately quit your day job?

For me it didn’t and it took me 8 months to get where I am today. It’s ok to see it as a lucrative hobby or even second income, but to stake your existance solely iPhone development you have to be extremely disciplined. Or even better: to know how to build teams of bright minds who can bring skills to the table that your don’t possess yourself.

Anything goes … into NSArray

When switching to or beginning with Objective C you might be tempted to try to use the old c-style arrays, but that’s better left to the hard core C-enthusiasts. For programming Cocoa Touch we always use the NSArray class because of the additional intelligence it provides for us, not to mention integration with memory management.

The first thing I ever added into NSArray was string objects. And so will probably everybody who starts with Objective C.

NSString *someText = @"Static Text";  // static allocation
NSString *someMoreText = [[NSString alloc] initWithString:@"More Static Text"]; // manually allocated
NSArray *myArray = [NSArray arrayWithObjects:someText, someMoreText, nil];  // note the nil
[someMoreText release];  // don't forget to release
 
NSString *retrievedText = [myArray objectAtIndex:1]; // first index = 0
NSLog(retrievedText);

How about numbers? Generally you can only add instances of objects into NSArray. But luckily Apple has created the NSNumber class which provides a container object for any kind of number, i.e. int, float or even BOOL.

int i=123;
float f=5.0;
 
NSNumber *num_i = [NSNumber numberWithInt:i];
NSNumber *num_f = [NSNumber numberWithFloat:f];
NSNumber *num_b = [NSNumber numberWithBool:YES];
 
NSArray *myArray = [NSArray arrayWithObjects:num_i, num_f, num_b, nil];

With the methods above you are able to add strings and numbers into arrays. There is yet another wrapper class that allows to put even more complex data types and structs into arrays: NSValue. Most usefully are the UIKit additions to NSValue which give you the possibility of packaging CGRect, CGPoint, CGAffineTransform or CGSize structs into objects. And those are just as easy to put into an array.

CGRect aRect = CGRectMake(0, 0, 100.0, 100.0);
CGSize aSize = CGSizeMake(10.0, 20.0);
 
NSValue *val_rect = [NSValue valueWithCGRect:aRect];
NSValue *val_size = [NSValue valueWithCGSize:aSize];
 
NSArray *myArray = [NSArray arrayWithObjects:val_rect, val_size, nil];

Soon you will find it odd that NSArray does not have any method to add and remove objects. The reason for this is that most standard objects are non-changable (aka “immutable”) as such. To gain such modification features you have to use the mutable cousin NSMutableArray. This gives you methods like addObject or removeObject.

NSMutableArray *myArray = [[NSMutableArray alloc] init];
[myArray addObject:@"first string"];
[myArray addObject:@"second string"];
[myArray addObject:@"third string"];
 
[myArray removeObjectAtIndex:1];
 
NSLog([myArray description]);  // a quick way to show contents
 
[myArray release];

NSArrays are the meat and bones of most Objective-C apps. Anybody trying to master this language has no way around them.