The Zombie keyboard: Working on the Economy app for iPad was a lot of fun and it also presented its fair share of challenges. One of these challenges related to an annoying zombie keyboard bug. This bug made it impossible to dismiss the keyboard using approved/public methods/APIs. This meant that the keyboard/keypad could be hanging on to the screen even after the relevant text view control was released and no longer displayed. So users would be looking at a zombie keypad that wasn’t connected to any text object.
Killing the zombie with a private API: It was (late night) 3:30am when I realized that the zombie keypad issue was a bug in the iPad SDK and not in my code. At that point, I should have probably called it a day, but didn’t. As I investigated the bug further, I found that the (dismissKeyboard) private API took down the keyboard perfectly. With exception handlers and checks for respondsToSelector, the code seemed reasonably safe (though – in general – I agree with Apple’s reasoning that private APIs shouldn’t be used)
App-store rejection: After a 9-day review cycle, we got a very politely worded email stating that the app had been rejected because of its usage of private APIs. Since the private APIs were being used to work-around a bug in the public API, there seemed to be a reasonable chance that Apple might make an exception. So I filed an appeal with Apple’s app-review board.
An impasse: Apple’s review team did a great job in following up with me (email and phone calls) and we discussed the matter in detail. However, I couldn’t find out the approximate timeframe within which the app-review-board might make their Yes/No decision on the appeal. The appeal seemed to present a difficult problem. On one hand, the private APIs were used because of an SDK bug, on the other hand, approving the private APIs would have set a bad precedent. In the meanwhile, the app was no closer to being released. That is when I decided to email Steve Jobs.
“Ram, this is Steve”: A couple of hours after I sent the email, I was at a noisy soccer (for kids) arena when I heard my iPhone ring. The caller-id, the caller saying “Ram, this is Steve” and that he was calling from Apple did suggest that it could really be Steve Jobs. He confirmed it when I asked.
Steve Jobs’ decision: Steve Jobs talked to me about my appeal and the “no private APIs” policy. I then asked him whether an exception could be made to the policy because the private APIs were necessitated by the SDK bug. He reiterated his point and I accepted it. I told him that I would replace the modal form sheet with alternative UI. Removing the form sheet (and therefore its bug) would eliminate the need for the private API.
A conscientious guy: Steve Jobs has a well-deserved reputation for creating great quality products and for his passion for excellence and user experience. I’ve also read that he is a detail-oriented executive and a hands-on guy who is intimately involved with his company’s work (in a way that few other CEOs are).
His phone-call reinforced those notions and went further to suggest that he was also a very conscientious guy who cared about people. The fact that he took the time to read my email, think about the app and then personally call me was amazing.
Upshot: I resubmitted the ‘Economy for iPad’ app after removing private APIs. The app uses Federal data to give you a snapshot of the US economy. The app review board and app review team graciously expedited the review of the app and it is now available for download at the app store. We have been releasing iOS apps since 2008 (the year when the app store was launched) and this one has the most fascinating submission story among all our apps. I’m now looking forward to seeing how the app does in the iPad app store.