Rogue Amoeba’s Airfoil Speakers Touch, an audio receiver app for iOS devices, has been yanked from the App Store just a few weeks after its third version, with AirPlay receiving capabilities, was approved.
The developers of the app, on their blog, write:
Today, we’ve been informed that Apple has removed Airfoil Speakers Touch from the iOS App Store. We first heard from Apple about this decision two days ago, and we’ve been discussing the pending removal with them since then. However, we still do not yet have a clear answer on why Apple has chosen to remove Airfoil Speakers Touch. Needless to say, we’re quite disappointed with their decision, and we’re working hard to once again make the application available for you, our users.
The app doesn’t use any private APIs, nor does it violate any App Store guidelines, due to which many people, including the developers of the app, wondered what exactly was the reason behind the removal.
John Gruber, after talking to a few of his sources, concludes that the removal was because of the addition on AirPlay receiving capabilities in version three. Although this doesn’t use any private, on-device, APIs, it does tap into a proprietary protocol, which Apple licenses via their MFi Program.
Rogue Amoeba claims — and I don’t doubt them — that they’re not using private APIs in this app. So perhaps it’s better to focus on this clause in rule 3.3.1: “in the manner prescribed by Apple”. That’s a pretty broad stick to swing. As I read it, rule 3.3.1 effectively means “You may not use private APIs, and you may not use public APIs to do things we don’t want you to do.”
That’s simultaneously unsurprising, and, a little crazy. Unsurprising because the implicit rule 0 of the App Store has always been that Apple isn’t going to publish an app they don’t want in the store, and that’s that. Crazy, though, because if Apple has a problem with the potential uses of a documented public API, is that not an indication that there’s something wrong with the API?
The rule John refers to says:
Applications may only use Documented APIs in the manner prescribed by Apple and must not use or call any private APIs.
If that wasn’t broad enough, John also points us to the human friendly App Store Review Guidelines which say:
This is a living document, and new apps presenting new questions may result in new rules at any time. Perhaps your app will trigger this.
As to how the app got approved in the first place, John explains:
[T]he app (correctly) passed Apple’s automated tests that check for private API calls, and to anyone who isn’t particularly familiar with the encrypted and undocumented nature of AirPlay audio streams, Airfoil Speakers Touch’s new “Enhanced Audio Receiving” option simply looked like a cool new feature added to an app that had been in the store since 2009.
As Gruber said, this is hardly surprising, since the idea of an app that taps into a proprietary protocol (which Apple licenses commercially to third parties) living on the App Store seems next to impossible. Apps living out of Apple’s closed ecosystem like XBMC are, however, decrypting AirPlay streams. We wonder what is Apple’s stance on that.
Another theory that Cult Of Mac proposes is:
Airfoil Speakers Touch wasn’t yanked arbitrarily, but instead because it duplicates functionality in the still unreleased and officially unannounced iOS 6. Our source says that in iOS 6, an Apple TV, for example, can pipe sound from a movie to an iPod touch, iPhone or iPad, and any iOS device will be able to beam audio to another.
Gruber says that the removal had nothing to do with iOS 6 and any of its rumored features, which he hadn’t heard of. We’d surely welcome such a feature since there’s a big void as far as interaction between two iOS devices is concerned.
For now, it seems Rogue Amoeba would have to push an update sans AirPlay receiving capabilities.
(If you remember, Rouge Amoeba’s Airfoil Speakers Touch app has had problems with Apple’s App Store terms in the past as well, after which the company said they won’t be making apps for the iPhone. That decision obviously didn’t hold.)