This weekend I sat down and I whipped up a little iPhone application to scratch a personal itch. In California it is illegal to operate your motor vehicle and talk on a cell phone without a hands-free device. The most popular hands-free devices use the Bluetooth wireless protocol. On the iPhone it requires a minimum of four touch screen taps to turn Bluetooth on or off. ((Those four taps are: Settings.app, General, Bluetooth, and ON/OFF switch.)) Why would one care about the number of taps? When driving I do have my Bluetooth headset active and the iPhone paired with it. When I’m at work or home I have absolutely no need to use a hands-free device. ((That I hate the bluedouches that refuse to take them off is a large enough subject for another post.)) Since I have no need to use the Bluetooth radio when not using the hands-free device I want a quick toggle for it. Turning it off will save me on battery life a bit and that’s better in the long run. If I can turn the Bluetooth radio on and off with only one tap then I’m more likely to use it. And now a quick tour of the app I wrote: BlueTap. In the home screen for the iPhone the user will see the icon for BlueTap (circled in red). ((The sharp-eyed readers probably see the icon to the far left of BlueTap, another private project that might possibly use a private API, but is not yet ready for prime time.)) With the Bluetooth off (notice there is no Bluetooth icon in the status bar of the above image) BlueTap will turn on the Bluetooth radio and present the following screen. With Bluetooth already powered on BlueTap will turn off the Bluetooth radio and lets the user know this. If you’re in BlueTap and want to change what you’ve done there is no need to quit and relaunch, a simple tap on the Bluetooth logo inside the application will also toggle the Bluetooth radio power. Here is where things get a little tricky, the Bluetooth functionality is using a private and completely unpublished API and framework on the iPhone. This means three things for my simple little application: 1.
I will never be able to distribute this application via the AppStore official channel;
There is a risk that with the next release of the iPhone OS BlueTap will break because the Bluetooth framework changes;
If I do give this application to friends and acquaintances I will have to stay very on top of changes to the iPhone OS, least it stop working for them.
This evening John Gruber of Daring Fireball published an article about just this subject called Private. I agree with everything John says. I would never distribute an application to the AppStore that used a private API and would have the potential to cause a negative user experience because the private API call went away or was changed. I agree whole-heartedly with Gruber when he says:
The point being that private APIs should be handled with extreme caution — they’re the programming equivalent of explosive material.
Oh yes, explosive indeed. I am fully aware of this and any user of BlueTap other than myself will be made aware of this too. Unlike Landon Fuller, who implemented a very impressive CoverFlow replacement since the CoverFlow API is private, I am unable to re-implement to get this feature, it’s hardware dependent. Hopefully in the future this API will open up or Apple will make a quick settings application for powering on and off features quickly. Until then this private API using application will remain private, for me and my friends.