Routable is an in-app native URL router, for iOS. Also available for Android.
Set up your app's router and URLs (usually done in application:didFinishLaunchingWithOptions:):
[[Routable sharedRouter] map:@"users/:id"toController:[UserController class]]; // Requires an instance of UINavigationController to open UIViewControllers [[Routable sharedRouter] setNavigationController:aNavigationController];Implement initWithRouterParams: in your UIViewController subclass:
@implementationUserController// params will be non-nil - (id)initWithRouterParams:(NSDictionary *)params{if ((self = [selfinitWithNibName:nilbundle:nil])){self.userId = [params objectForKey:@"id"]} return self}Then, anywhere else in your app, open a URL:
NSString *aUrl = @"users/4"; [[Routable sharedRouter] open:aUrl];If you wish to do custom allocation of a controller, you can use +allocWithRouterParams:
[[Routable sharedRouter] map:@"users/:id"toController:[StoryboardController class]]; @implementationStoryboardController + (id)allocWithRouterParams:(NSDictionary *)params{UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard"bundle:nil]; StoryboardController *instance = [storyboard instantiateViewControllerWithIdentifier:@"sbController"]; instance.userId = [params objectForKey:@"id"]; return instance}Set ignoresExceptions to YES to NOT throw exceptions (suggested for a Release/Distribution version)
[[Routable sharedRouter] setIgnoresExceptions:YES];pod'Routable','~> 0.1.1'#import<Routable/Routable.h>If you're not able to use CocoaPods, please install Routable as a git submodule and add the files to your Xcode project.
You can invoke anonymous callbacks with Routable:
[[Routable sharedRouter] map:@"invalidate/:id"toCallback:^(NSDictionary *params){[Cache invalidate: [params objectForKey:@"id"]]]}]; [[Routable sharedRouter] open:@"invalidate/5h1b2bs"];You can configure if and how a UIViewController is presented modally with UPRouterOptions:
UPRouterOptions *options = [[UPRouterOptions modal] withPresentationStyle: UIModalPresentationFormSheet]; [self.router map:@"info"toController:[InfoController class] withOptions:options];UPRouterOptions has the following DSL setters:
modalwithPresentationStyle:withTransitionStyle:forDefaultParams:
Sometimes you want to open a URL outside of your app, like a YouTube URL or open a web URL in the browser. You can use Routable to do that:
[[Routable sharedRouter] openExternal:@"http://www.youtube.com/watch?v=oHg5SJYRHA0"];If you need to use multiple routers, simply create new instances of Router:
UPRouter *adminRouter = [Routable newRouter]; [adminRouter map:@"profile"toController: [AdminProfile class]]; UPRouter *userRouter = [Routable newRouter]; [userRouter map:@"profile"toController: [UserProfile class]];Clay Allsopp (http://clayallsopp.com)
Routable for iOS is available under the MIT license. See the LICENSE file for more info.