Why

While many of us at Substantial love iOS, we have a commonly-occurring annoyance: we tap a link hoping that it opens our favorite client app (or at least lets us select one) only to be disappointed. It's a flawed user experience, a blemish in the otherwise pretty and elegant iOS.

We have a dream that iOS users can traverse the ecosystem using just the apps they love, be they built-in apps or not. We can't completely solve iOS' current lack of a default app selection mechanism, but all of us together can solve some of it.

A Video Is Worth a Thousand Words

How

Easy. You have two options.

Easiest

In viewDidLoad:

[Choosy registerUIElement:self.myButton forAction:[ChoosyActionContext initWithAppType:@"Twitter"]];

That's it! Choosy will hook up a tap and long press gesture recognizers to that button and display the app selection UI as needed.

Easier

In your controller's viewDidLoad or appDelegate's applicationDidLoad:

[Choosy registerAppTypes: @[@"Twitter", @"Browser", @"Email", ...]]

You can still use registerUIElement method shown above, but you can also call Choosy from your own event handlers:

[Choosy handleAction: [ChoosyActionContext actionContextWithAppType:@"Email" action:@"compose" parameters:@{ @"to" : @"choosy@substantial.com" }]];

Yes. (link to README)

But How...

All of this relies on UIApplication's canOpenURL method. (Oh the things we could do if we had two API methods!) We store a list of URL schemes and their building blocks for each app on a server (in a GitHub repository right now), categorizing apps by type. Choosy downloads that info as needed. Developers code to an app-agnostic interface where they just specify the type of app they are linking to/trying to interact with, and pass in a list of parameters. Choosy maps those parameters to the parameters supported by each app and builds app-specific URLs.

Choosy does cache the data it downloads, so the traffic footprint is minimal. Users can set an app as default; after all, their Twitter client preference is not likely to change from one Twitter link to the next. If a new app of the same type is installed, or the app marked as default is deleted, Choosy presents app choices to the user again the next time a link related to that app type is activated. Finally, the framework is non-intrusive - if there's no connection and the default app hasn't been selected yet, and if Choosy can't download data or no 3rd-party apps are installed yet, it just opens the default iOS app, thus acting as if it wasn't there in the first place.

What's Next

We're now in beta! The core is there, albeit our list of TODOs remains long - the devil is in the details, as they say. And we like polished apps. You can play with the framework now, however, and give us feedback! Please stay tuned to major updates via @choosyios and feel free to send us feedback, ideas, and requests at choosy@substantial.com. Of course, if you find a bug or want a feature, please open a GitHub issue.

About Substantial

Substantial Substantial is a full service digital development and design studio that builds world-class technology experiences, whether web/mobile apps or large-scale installations, for innovators ranging from scrappy startups to world-changing non-profits to established Fortune 100 companies. Substantial marries best practices of design, development, and strategy, quickly providing outstanding quality and business value and fostering client relationships that are unparalleled in rapport and productivity.