Saturday, October 10, 2009

iTimeZone 1.3: Rejected from the App Store 2 times...so far

iTimeZone 1.3 - 1st Rejection
Another sad tale of multiple rejections from the App Store for a new version of an app already in the store. I've submitted 4 major releases of iTimeZone, two of them have been rejected on the first submission, but the still in review 1.3 release has been painful.

I was busting my ass to get this release done before my second son was born. I thought I got it done and was happy, proud even, that with the mountain of "getting ready for baby 2.0" work, I finally pushed out the latest release of iTimeZone.

The first rejection email came from  the night before, 8:43 PM to be exact, my wife was giving birth. 17 days after I first submitted it. In no way did it spoil the impending arrival of our new son, but it did hurt.

Take a look at the top image on the left. iTimeZone 1.3 was first rejected from the App Store for use of an "Apple trademark image", the Google Maps icon. The reason this bothered me so much was because the icon was already in the app, larger even, in 2 previous releases, and it wasn't rejected for it. Further, with iPhone OS 3.0's new MapKit, there wasn't guidance I could find on how to graphically refer to an in-app map, no UIKit standard icon to use. There still isn't  sample code on the iPhone dev center to even give you a clue on how to use MapKit, functional and UI wise. For the rejection,  kindly referred me to the relevant section of the developer agreement in the rejection email which is pretty clear that I was in the wrong.

So the night after son 2.0 was born, I pulled out the laptop in the hospital and get to work. Replacing the icon with another, simple, finding an icon was the hard part. I first started seeing if I could mimic , take a Google Maps view of my home neigborhood, then clean it up and make it an icon. Ultimately, two things stymied me. The skills and technique to make a similar icon, and time. Maybe I could eventually get there graphically, but with a new baby and many sleepless nights staring me in the face, buying an icon was the better, quicker move. So I googled around, and finally found eddit's nice iPhone UI Icon Set for $69. What I wanted was something that called back to the Google Maps icon without being that icon poorly done. As you can see in the bottom left screenshot, I used the street sign icon from eddit's set.

Change made and I submitted the new binary to Apple for review. I thought 1.3 was finally going to ship, but sadly it turns out I was wrong again.

iTimeZone 1.3 - 2nd Rejection
The image on the left was sent by  in the second rejection, 12 days after I submitted 1.3 again with the new icon. This rejection is on me. I made the call to try and ship without alerting the user of no or spotty network connectivity. I rationalized this decision by saying everyone knows Google Maps requires an Internet connection. It could easily wait, but  disagreed, and they were right.

I was willing to sacrifice the user experience until I got more time to digest the Reachability sample code and incorporate it into iTimeZone. Adding the alert was one of the few things I had on the 1.3.1 TODO list. With just about no desire to open Xcode during son 2.0 first month in the world, I didn't start work on it until 15 days after I got the rejection. In total it took me between 20-25 hours of development & testing with the sample code to implement this. Dropping the sample code in iTimeZone wasn't a big deal, but testing it and inducing dropped network connections during Map loading, then resolving my own bugs, as usual, took time. I also implemented KVO for the first time and reduced memory consumption by reusing an NSNumberFormatter that I was creating on every cell draw. It feels like I have taken another step on the road to being a complete Cocoa developer.

Positives changes to iTimeZone aside, the only thing I wish  did different was reject iTimeZone the first time with both issues. I can't complain too much, the review process improved the user experience of iTimeZone 1.3. I submitted the latest build on Thursday October 8th, so I'll see how long review takes this time. Hopefully 1.3 finally hits the App Store before Halloween. If not, I will of course log the ordeal here.

Update
iTimeZone 1.3 has been released to the App Store! It can be downloaded through the App Store.

iTimeZone App Store Approved/Rejected History

  1. 1.0 Approved
  2. 1.1 Approved
  3. 1.2 REJECTED 1 time - ☺  Thankfully caught a bug
  4. 1.3 REJECTED 2 times - ☹☹
    1.  told me to remove the Google Maps icon in the app since 1.1 for "copyright violations"
    2.  told me after removed the Google Maps icon & resubmitting that the in-app Google Map for OS 3.0 users wasn't displaying any error message without network connection.

Friday, October 02, 2009

UITableViewController and UIViewController don't handle observeValueForKeyPath:

In an iPhone 2.0 or greater app if you are seeing this error:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: ': An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.

It might be because in YourClass's observeValueForKeyPath: method you are doing this:

// be sure to call the super implementation
// if the superclass implements it
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];

This could be because you saw in the Key-Value Observing Programming Guide those exact lines in the sample and didn't give it much thought.

If your base class doesn't implement observeValueForKeyPath:, like UITableViewController or UIViewController didn't, and you just assumed that the base class must even if it did nothing, like I did, then the above exception gets thrown.