Choosy Logo

One of the user experience annoyances of iOS is that you can't do one (seemingly simple) thing: use your favorite client apps for everything you do, whether they're stock apps or not. Safari is my favorite browser, Mail is my email client of choice, I love Google Maps for navigation, and I use Tweetbot for...twittering. I'd say "tweeting," but what do you call the process of reading tweets? Anyhow.

Before I joined Substantial, I implemented a rough prototype in my own app to present users with a list of installed apps for a given action. It was limited and the list of apps was hard-coded. When I showed it to Substantial's SF team, we agreed this was the beginning of a real solution for iOS developers and worth further work. Today we're proud to present the beta of Choosy - your drop-in-and-forget, elegant, and flexible iOS framework for transferring users to other apps.

How to Add Choosy to Your iOS App

Supporting many external apps is a pain, so our first priority was ease of use. After downloading or CocoaPodding Choosy, just write:

and you get:

Choosy Tweetbot Open And Back

Fantastic. You don't have to worry about any of: what's installed, which URL scheme is appropriate for each client, which parameters work with what app, or what each app calls its parameters. Want Tweetbot to show a profile, but open your app back up once user finishes viewing the profile? Just add @"callback_url" : @"yourappurl:" to the parameters list. Choosy will pass it to Twitter clients that support callbacks, but skip it for the ones that do not.

For more ways to hook up Choosy, please see the README on Github.

But my app is a web view...

That's cool, too! The first internal app we dog-fooded Choosy to, Distiller, is also (for now) a web view-based app. UIWebViewDelegate API does not inform you of long presses, though, so your users won't be able to set an app as default. But they can still pick from their installed Twitter clients when your app has that external Twitter link, for example! This part of Choosy needs some more development. We'll publish a blog post on how to hook up web views to Choosy soon, so stay tuned by following @Substantial or @choosyios.

User Experience


It was obvious that tapping an external link, such as a Twitter username or a web address, should prompt the user to select an app to view that link in. But how do you let the user mark one of those apps as their favorite in an elegant yet transparent way, without checkboxes or switches?

After some iteration the simple solution was to just use long press. iOS already uses the gesture to mean "special action" so the learning curve for end users is minimal and the experience is intuitive and familiar.

Choosy Setting Default


Choosy comes with enough information to interface with the stock apps. So if no Internet connection is available, an app that implements Choosy will act as if Choosy isn't there (except for links relating to built-in services like Twitter, Vimeo, etc. - users will see a choice between stock Twitter app and Safari, for example). But as soon as Choosy smells the Internet, it grabs and caches data about all the other popular Twitter apps. When the cache expires (every 24 hours at the time of this writing), Choosy checks if there's any updated information or app icon available. So if iOS 8 has a different aesthetic and apps start updating their icons to match that, your users will quickly see the updates.


Maps apps, Twitter clients, and browsers are an obvious use case. But Choosy isn't limited to any specific app type - fitness, weather, and music apps are just as welcome. Any app with a URL scheme can be added. Further, specialized app types can be created. Music apps can be divided between Music Creation, Music Playback, and Radio types, for example, and one app can appear in multiple categories.

What's Next?

Today we're announcing the beta. There is a laundry list of improvements we already know we want to make, but please open a Github issue with any suggestions you may have. We don't know what iOS 8 has in store, and it's possible it has a similar framework baked-in. If that's the case and it's so good that there's no need for this framework, Choosy can still be used for iOS 7 (and if someone submits a pull request to make Choosy iOS 6-compatible, that's fantastic ;) ).

Give Choosy a whirl! We hope you'll love how easy it is to implement.


Special thanks to Nick Wagner for suggesting the name, and my colleagues Steve, Mars, and Jen for contributing critical ideas, testing, and supporting the project via proper retros, etc.

Press: MacStories