├── URLSchemes ├── en.lproj │ ├── InfoPlist.strings │ └── MainStoryboard.storyboard ├── NSString+URLEncoding.h ├── Scratchpad.h ├── URLSchemes-Prefix.pch ├── main.m ├── URLParser.h ├── AppDelegate.h ├── NSString+URLEncoding.m ├── ViewController.h ├── Scratchpad.m ├── URLParser.m ├── URLSchemes-Info.plist ├── AppDelegate.m └── ViewController.m ├── README.md └── URLSchemes.xcodeproj ├── project.xcworkspace ├── contents.xcworkspacedata └── xcuserdata │ └── greg.xcuserdatad │ └── UserInterfaceState.xcuserstate ├── xcuserdata └── greg.xcuserdatad │ └── xcschemes │ ├── xcschememanagement.plist │ └── URLSchemes.xcscheme └── project.pbxproj /URLSchemes/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # URLSchemes 2 | 3 | URLSchemes is a simple iOS app that demonstrates receiving incoming URLs and opening URLs for other apps. 4 | 5 | It was created to support a presentation at 360iDev 2012. 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /URLSchemes.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /URLSchemes.xcodeproj/project.xcworkspace/xcuserdata/greg.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/agiletortoise/URLSchemes/HEAD/URLSchemes.xcodeproj/project.xcworkspace/xcuserdata/greg.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /URLSchemes/NSString+URLEncoding.h: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+URLEncoding.h 3 | // 4 | 5 | #import 6 | 7 | @interface NSString (URLEncoding) 8 | 9 | -(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding; 10 | 11 | @end 12 | -------------------------------------------------------------------------------- /URLSchemes/Scratchpad.h: -------------------------------------------------------------------------------- 1 | // 2 | // Scratchpad.h 3 | // URLSchemes 4 | // 5 | // Created by Greg Pierce on 9/2/12. 6 | // Copyright (c) 2012 Agile Tortoise, Inc. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface Scratchpad : NSObject 12 | 13 | + (void)examples; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /URLSchemes/URLSchemes-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'URLSchemes' target in the 'URLSchemes' project 3 | // 4 | 5 | #import 6 | 7 | #ifndef __IPHONE_5_0 8 | #warning "This project uses features only available in iOS SDK 5.0 and later." 9 | #endif 10 | 11 | #ifdef __OBJC__ 12 | #import 13 | #import 14 | #endif 15 | -------------------------------------------------------------------------------- /URLSchemes/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // URLSchemes 4 | // 5 | // Created by Greg Pierce on 7/27/12. 6 | // Copyright (c) 2012 Agile Tortoise, Inc. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "AppDelegate.h" 12 | 13 | int main(int argc, char *argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /URLSchemes/URLParser.h: -------------------------------------------------------------------------------- 1 | // 2 | // URLParser.h 3 | // 4 | // SEE: http://stackoverflow.com/questions/2225814/nsurl-pull-out-a-single-value-for-a-key-in-a-parameter-string 5 | 6 | 7 | #import 8 | 9 | @interface URLParser : NSObject { 10 | NSArray *variables; 11 | } 12 | 13 | @property (nonatomic, retain) NSArray *variables; 14 | 15 | - (id)initWithURLString:(NSString *)url; 16 | - (NSString *)valueForVariable:(NSString *)varName; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /URLSchemes/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // URLSchemes 4 | // 5 | // Created by Greg Pierce on 7/27/12. 6 | // Copyright (c) 2012 Agile Tortoise, Inc. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "ViewController.h" 11 | 12 | @interface AppDelegate : UIResponder 13 | 14 | @property (strong, nonatomic) UIWindow *window; 15 | @property (readonly, strong, nonatomic) ViewController *viewController; 16 | 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /URLSchemes.xcodeproj/xcuserdata/greg.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | URLSchemes.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 37451D6C15C2F10900327D82 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /URLSchemes/NSString+URLEncoding.m: -------------------------------------------------------------------------------- 1 | // 2 | // NSString+URLEncoding.m 3 | // 4 | 5 | #import "NSString+URLEncoding.h" 6 | 7 | @implementation NSString (URLEncoding) 8 | 9 | -(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding { 10 | return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, 11 | (__bridge CFStringRef)self, 12 | NULL, 13 | (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", 14 | CFStringConvertNSStringEncodingToEncoding(encoding)); 15 | } 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /URLSchemes/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // URLSchemes 4 | // 5 | // Created by Greg Pierce on 7/27/12. 6 | // Copyright (c) 2012 Agile Tortoise, Inc. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | @property (weak, nonatomic) IBOutlet UITextView *outgoingURLTextView; 14 | @property (weak, nonatomic) IBOutlet UITextView *urlDataTextView; 15 | 16 | - (IBAction)canOpenURLButtonPressed:(id)sender; 17 | - (IBAction)openURLButtonPressed:(id)sender; 18 | - (IBAction)launchDraftsButtonPressed:(id)sender; 19 | - (IBAction)newDraftButtonPressed:(id)sender; 20 | 21 | - (void)showBadURLAlert; 22 | - (BOOL)canOpenURLForString:(NSString *)urlString; 23 | - (BOOL)handleIncomingURL:(NSURL *)url; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /URLSchemes/Scratchpad.m: -------------------------------------------------------------------------------- 1 | // 2 | // Scratchpad.m 3 | // URLSchemes 4 | // 5 | // Created by Greg Pierce on 9/2/12. 6 | // Copyright (c) 2012 Agile Tortoise, Inc. All rights reserved. 7 | // 8 | 9 | #import "Scratchpad.h" 10 | #import "NSString+URLEncoding.h" 11 | 12 | @implementation Scratchpad 13 | 14 | + (void)examples 15 | { 16 | // Example of safe generation of URL with parameters 17 | NSString *urlString = @"test://action?param1=%@¶ms2=%@"; 18 | NSString *p1 = @"Hello World"; 19 | NSString *p2 = @"You’re Awesome"; 20 | 21 | NSString *fullURLString = [NSString stringWithFormat:urlString, [p1 urlEncodeUsingEncoding:NSUTF8StringEncoding], [p2 urlEncodeUsingEncoding:NSUTF8StringEncoding]]; 22 | NSURL *url = [NSURL URLWithString:fullURLString]; 23 | 24 | NSLog(@"%@", [url absoluteString]); 25 | } 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /URLSchemes/URLParser.m: -------------------------------------------------------------------------------- 1 | // 2 | // URLParser.m 3 | // 4 | 5 | #import "URLParser.h" 6 | 7 | @implementation URLParser 8 | 9 | @synthesize variables; 10 | 11 | - (id) initWithURLString:(NSString *)url{ 12 | self = [super init]; 13 | if (self != nil) { 14 | NSString *string = url; 15 | NSScanner *scanner = [NSScanner scannerWithString:string]; 16 | [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"&?"]]; 17 | NSString *tempString; 18 | NSMutableArray *vars = [NSMutableArray new]; 19 | [scanner scanUpToString:@"?" intoString:nil]; //ignore the beginning of the string and skip to the vars 20 | while ([scanner scanUpToString:@"&" intoString:&tempString]) { 21 | [vars addObject:[[tempString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] copy]]; 22 | } 23 | self.variables = vars; 24 | } 25 | return self; 26 | } 27 | 28 | - (NSString *)valueForVariable:(NSString *)varName { 29 | for (NSString *var in self.variables) { 30 | if ([var length] > [varName length]+1 && 31 | [[[var substringWithRange:NSMakeRange(0, [varName length]+1)] lowercaseString] isEqualToString:[[varName lowercaseString] stringByAppendingString:@"="]] 32 | ) { 33 | NSString *varValue = [var substringFromIndex:[varName length]+1]; 34 | return varValue; 35 | } 36 | } 37 | return nil; 38 | } 39 | 40 | @end 41 | 42 | -------------------------------------------------------------------------------- /URLSchemes/URLSchemes-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | com.agiletortoise.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleURLTypes 24 | 25 | 26 | CFBundleTypeRole 27 | Editor 28 | CFBundleURLName 29 | com.agiletortoise.URLSchemes 30 | CFBundleURLSchemes 31 | 32 | urlschemes 33 | x-urlschemes 34 | 35 | 36 | 37 | CFBundleVersion 38 | 1.0 39 | LSRequiresIPhoneOS 40 | 41 | UIMainStoryboardFile 42 | MainStoryboard 43 | UIRequiredDeviceCapabilities 44 | 45 | armv7 46 | 47 | UISupportedInterfaceOrientations 48 | 49 | UIInterfaceOrientationPortrait 50 | UIInterfaceOrientationLandscapeLeft 51 | UIInterfaceOrientationLandscapeRight 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /URLSchemes/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // URLSchemes 4 | // 5 | // Created by Greg Pierce on 7/27/12. 6 | // Copyright (c) 2012 Agile Tortoise, Inc. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | @implementation AppDelegate 12 | 13 | @synthesize viewController; 14 | 15 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 16 | { 17 | NSLog(@"application:didFinishLaunchingWithOptions:"); 18 | viewController = (ViewController *)self.window.rootViewController; 19 | 20 | return YES; 21 | } 22 | 23 | - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 24 | { 25 | NSLog(@"application:openURL:sourceApplication:annotation:"); 26 | // Called when application is launch using a URL 27 | NSLog(@"openURL: %@", [url absoluteString]); 28 | NSLog(@"sourceApplication: %@", sourceApplication); 29 | 30 | // return YES if you handled the URL 31 | // return NO if you didn't know what to do with the URL. 32 | // returning NO does nothing. It is ignored, but it's the right thing to do. 33 | return [viewController handleIncomingURL:url]; 34 | } 35 | 36 | - (void)applicationWillResignActive:(UIApplication *)application 37 | { 38 | NSLog(@"applicationWillResignActive:"); 39 | } 40 | 41 | - (void)applicationDidEnterBackground:(UIApplication *)application 42 | { 43 | NSLog(@"applicationDidEnterBackground:"); 44 | } 45 | 46 | - (void)applicationWillEnterForeground:(UIApplication *)application 47 | { 48 | NSLog(@"applicationWillEnterForeground:"); 49 | } 50 | 51 | - (void)applicationDidBecomeActive:(UIApplication *)application 52 | { 53 | NSLog(@"applicationDidBecomeActive:"); 54 | } 55 | 56 | - (void)applicationWillTerminate:(UIApplication *)application 57 | { 58 | } 59 | 60 | @end 61 | -------------------------------------------------------------------------------- /URLSchemes.xcodeproj/xcuserdata/greg.xcuserdatad/xcschemes/URLSchemes.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /URLSchemes/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // URLSchemes 4 | // 5 | // Created by Greg Pierce on 7/27/12. 6 | // Copyright (c) 2012 Agile Tortoise, Inc. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | #import "URLParser.h" 11 | #import "NSString+URLEncoding.h" 12 | #import "Scratchpad.h" 13 | 14 | @interface ViewController () 15 | 16 | @end 17 | 18 | @implementation ViewController 19 | @synthesize outgoingURLTextView; 20 | @synthesize urlDataTextView; 21 | 22 | - (void)viewDidLoad 23 | { 24 | NSLog(@"viewDidLoad"); 25 | [Scratchpad examples]; // just to dump examples to log 26 | [super viewDidLoad]; 27 | } 28 | 29 | - (void)viewWillAppear:(BOOL)animated 30 | { 31 | NSLog(@"viewWillAppear"); 32 | [super viewWillAppear:animated]; 33 | } 34 | 35 | - (void)viewDidAppear:(BOOL)animated 36 | { 37 | NSLog(@"viewDidAppear"); 38 | [super viewDidAppear:animated]; 39 | } 40 | 41 | - (void)viewDidUnload 42 | { 43 | [self setUrlDataTextView:nil]; 44 | [self setOutgoingURLTextView:nil]; 45 | [super viewDidUnload]; 46 | } 47 | 48 | - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 49 | { 50 | return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 51 | } 52 | 53 | 54 | # pragma mark IBActions 55 | 56 | - (IBAction)canOpenURLButtonPressed:(id)sender { 57 | [outgoingURLTextView resignFirstResponder]; 58 | 59 | if ([self canOpenURLForString:outgoingURLTextView.text]) { 60 | UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"YES!" message:@"This URL can be opened on this device." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil]; 61 | [alert show]; 62 | } 63 | else { 64 | [self showBadURLAlert]; 65 | } 66 | } 67 | 68 | - (IBAction)openURLButtonPressed:(id)sender { 69 | [outgoingURLTextView resignFirstResponder]; 70 | 71 | if (![self canOpenURLForString:outgoingURLTextView.text]) { 72 | [self showBadURLAlert]; 73 | return; 74 | } 75 | 76 | NSURL *url = [NSURL URLWithString:outgoingURLTextView.text]; 77 | [[UIApplication sharedApplication] openURL:url]; 78 | } 79 | 80 | - (IBAction)launchDraftsButtonPressed:(id)sender { 81 | NSURL *url = [NSURL URLWithString:@"drafts://"]; 82 | 83 | if ([[UIApplication sharedApplication] canOpenURL:url]) { 84 | [[UIApplication sharedApplication] openURL:url]; 85 | } 86 | else { 87 | [self showBadURLAlert]; 88 | } 89 | 90 | } 91 | 92 | - (IBAction)newDraftButtonPressed:(id)sender { 93 | NSString *urlString = @"drafts://x-callback-url/create?text=%@"; 94 | NSString *text = @"Boo ø´˚∂∆ƒ∂߬ƒ∆˚∂ Unicode!"; 95 | NSString *paramText = [text urlEncodeUsingEncoding:NSUTF8StringEncoding]; 96 | 97 | NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:urlString, paramText]]; 98 | NSLog(@"%@", [url absoluteString]); 99 | 100 | if ([[UIApplication sharedApplication] canOpenURL:url]) { 101 | [[UIApplication sharedApplication] openURL:url]; 102 | } 103 | else { 104 | [self showBadURLAlert]; 105 | } 106 | } 107 | 108 | # pragma mark Utility 109 | 110 | - (void)showBadURLAlert 111 | { 112 | UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Cannot Open URL" message:@"No installed app can open this URL." delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil]; 113 | [alert show]; 114 | } 115 | 116 | - (BOOL)canOpenURLForString:(NSString *)urlString 117 | { 118 | NSURL *url = [NSURL URLWithString:urlString]; 119 | return [[UIApplication sharedApplication] canOpenURL:url]; 120 | } 121 | 122 | - (BOOL)handleIncomingURL:(NSURL *)url 123 | { 124 | urlDataTextView.text = [url absoluteString]; 125 | 126 | // Parse parameters 127 | // There are many ways to do this...I think this simple one... 128 | URLParser *parser = [[URLParser alloc] initWithURLString:[url absoluteString]]; 129 | NSString *testParamValue = [parser valueForVariable:@"test"]; 130 | NSLog(@"test parameter = %@", testParamValue); 131 | 132 | return YES; 133 | } 134 | 135 | @end 136 | -------------------------------------------------------------------------------- /URLSchemes/en.lproj/MainStoryboard.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 31 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 63 | 78 | 93 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | -------------------------------------------------------------------------------- /URLSchemes.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 370E0FA415F39132000C11F8 /* Scratchpad.m in Sources */ = {isa = PBXBuildFile; fileRef = 370E0FA315F39132000C11F8 /* Scratchpad.m */; }; 11 | 37152B0815EBD2BB0073A628 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = 37152B0715EBD2BB0073A628 /* README.md */; }; 12 | 37451D7215C2F10900327D82 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37451D7115C2F10900327D82 /* UIKit.framework */; }; 13 | 37451D7415C2F10900327D82 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37451D7315C2F10900327D82 /* Foundation.framework */; }; 14 | 37451D7615C2F10900327D82 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37451D7515C2F10900327D82 /* CoreGraphics.framework */; }; 15 | 37451D7C15C2F10900327D82 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 37451D7A15C2F10900327D82 /* InfoPlist.strings */; }; 16 | 37451D7E15C2F10900327D82 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 37451D7D15C2F10900327D82 /* main.m */; }; 17 | 37451D8215C2F10900327D82 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 37451D8115C2F10900327D82 /* AppDelegate.m */; }; 18 | 37451D8515C2F10900327D82 /* MainStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 37451D8315C2F10900327D82 /* MainStoryboard.storyboard */; }; 19 | 37451D8815C2F10900327D82 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 37451D8715C2F10900327D82 /* ViewController.m */; }; 20 | 37451D9515C2F86500327D82 /* URLParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 37451D9415C2F86500327D82 /* URLParser.m */; }; 21 | 37451D9815C2F87800327D82 /* NSString+URLEncoding.m in Sources */ = {isa = PBXBuildFile; fileRef = 37451D9715C2F87800327D82 /* NSString+URLEncoding.m */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXFileReference section */ 25 | 370E0FA215F39132000C11F8 /* Scratchpad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Scratchpad.h; sourceTree = ""; }; 26 | 370E0FA315F39132000C11F8 /* Scratchpad.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Scratchpad.m; sourceTree = ""; }; 27 | 37152B0715EBD2BB0073A628 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.md; sourceTree = ""; }; 28 | 37451D6D15C2F10900327D82 /* URLSchemes.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = URLSchemes.app; sourceTree = BUILT_PRODUCTS_DIR; }; 29 | 37451D7115C2F10900327D82 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 30 | 37451D7315C2F10900327D82 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 31 | 37451D7515C2F10900327D82 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 32 | 37451D7915C2F10900327D82 /* URLSchemes-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "URLSchemes-Info.plist"; sourceTree = ""; }; 33 | 37451D7B15C2F10900327D82 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 34 | 37451D7D15C2F10900327D82 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 35 | 37451D7F15C2F10900327D82 /* URLSchemes-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "URLSchemes-Prefix.pch"; sourceTree = ""; }; 36 | 37451D8015C2F10900327D82 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 37 | 37451D8115C2F10900327D82 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 38 | 37451D8415C2F10900327D82 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/MainStoryboard.storyboard; sourceTree = ""; }; 39 | 37451D8615C2F10900327D82 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 40 | 37451D8715C2F10900327D82 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 41 | 37451D9315C2F86500327D82 /* URLParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = URLParser.h; sourceTree = ""; }; 42 | 37451D9415C2F86500327D82 /* URLParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = URLParser.m; sourceTree = ""; }; 43 | 37451D9615C2F87800327D82 /* NSString+URLEncoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+URLEncoding.h"; sourceTree = ""; }; 44 | 37451D9715C2F87800327D82 /* NSString+URLEncoding.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+URLEncoding.m"; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 37451D6A15C2F10900327D82 /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | 37451D7215C2F10900327D82 /* UIKit.framework in Frameworks */, 53 | 37451D7415C2F10900327D82 /* Foundation.framework in Frameworks */, 54 | 37451D7615C2F10900327D82 /* CoreGraphics.framework in Frameworks */, 55 | ); 56 | runOnlyForDeploymentPostprocessing = 0; 57 | }; 58 | /* End PBXFrameworksBuildPhase section */ 59 | 60 | /* Begin PBXGroup section */ 61 | 37451D6215C2F10900327D82 = { 62 | isa = PBXGroup; 63 | children = ( 64 | 37152B0715EBD2BB0073A628 /* README.md */, 65 | 37451D7715C2F10900327D82 /* URLSchemes */, 66 | 37451D7015C2F10900327D82 /* Frameworks */, 67 | 37451D6E15C2F10900327D82 /* Products */, 68 | ); 69 | sourceTree = ""; 70 | }; 71 | 37451D6E15C2F10900327D82 /* Products */ = { 72 | isa = PBXGroup; 73 | children = ( 74 | 37451D6D15C2F10900327D82 /* URLSchemes.app */, 75 | ); 76 | name = Products; 77 | sourceTree = ""; 78 | }; 79 | 37451D7015C2F10900327D82 /* Frameworks */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | 37451D7115C2F10900327D82 /* UIKit.framework */, 83 | 37451D7315C2F10900327D82 /* Foundation.framework */, 84 | 37451D7515C2F10900327D82 /* CoreGraphics.framework */, 85 | ); 86 | name = Frameworks; 87 | sourceTree = ""; 88 | }; 89 | 37451D7715C2F10900327D82 /* URLSchemes */ = { 90 | isa = PBXGroup; 91 | children = ( 92 | 37451D8015C2F10900327D82 /* AppDelegate.h */, 93 | 37451D8115C2F10900327D82 /* AppDelegate.m */, 94 | 37451D8315C2F10900327D82 /* MainStoryboard.storyboard */, 95 | 37451D8615C2F10900327D82 /* ViewController.h */, 96 | 37451D8715C2F10900327D82 /* ViewController.m */, 97 | 37451D9915C2F87C00327D82 /* Util */, 98 | 37451D7815C2F10900327D82 /* Supporting Files */, 99 | 370E0FA215F39132000C11F8 /* Scratchpad.h */, 100 | 370E0FA315F39132000C11F8 /* Scratchpad.m */, 101 | ); 102 | path = URLSchemes; 103 | sourceTree = ""; 104 | }; 105 | 37451D7815C2F10900327D82 /* Supporting Files */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 37451D7915C2F10900327D82 /* URLSchemes-Info.plist */, 109 | 37451D7A15C2F10900327D82 /* InfoPlist.strings */, 110 | 37451D7D15C2F10900327D82 /* main.m */, 111 | 37451D7F15C2F10900327D82 /* URLSchemes-Prefix.pch */, 112 | ); 113 | name = "Supporting Files"; 114 | sourceTree = ""; 115 | }; 116 | 37451D9915C2F87C00327D82 /* Util */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | 37451D9315C2F86500327D82 /* URLParser.h */, 120 | 37451D9415C2F86500327D82 /* URLParser.m */, 121 | 37451D9615C2F87800327D82 /* NSString+URLEncoding.h */, 122 | 37451D9715C2F87800327D82 /* NSString+URLEncoding.m */, 123 | ); 124 | name = Util; 125 | sourceTree = ""; 126 | }; 127 | /* End PBXGroup section */ 128 | 129 | /* Begin PBXNativeTarget section */ 130 | 37451D6C15C2F10900327D82 /* URLSchemes */ = { 131 | isa = PBXNativeTarget; 132 | buildConfigurationList = 37451D8B15C2F10900327D82 /* Build configuration list for PBXNativeTarget "URLSchemes" */; 133 | buildPhases = ( 134 | 37451D6915C2F10900327D82 /* Sources */, 135 | 37451D6A15C2F10900327D82 /* Frameworks */, 136 | 37451D6B15C2F10900327D82 /* Resources */, 137 | ); 138 | buildRules = ( 139 | ); 140 | dependencies = ( 141 | ); 142 | name = URLSchemes; 143 | productName = URLSchemes; 144 | productReference = 37451D6D15C2F10900327D82 /* URLSchemes.app */; 145 | productType = "com.apple.product-type.application"; 146 | }; 147 | /* End PBXNativeTarget section */ 148 | 149 | /* Begin PBXProject section */ 150 | 37451D6415C2F10900327D82 /* Project object */ = { 151 | isa = PBXProject; 152 | attributes = { 153 | LastUpgradeCheck = 0440; 154 | ORGANIZATIONNAME = "Agile Tortoise, Inc."; 155 | }; 156 | buildConfigurationList = 37451D6715C2F10900327D82 /* Build configuration list for PBXProject "URLSchemes" */; 157 | compatibilityVersion = "Xcode 3.2"; 158 | developmentRegion = English; 159 | hasScannedForEncodings = 0; 160 | knownRegions = ( 161 | en, 162 | ); 163 | mainGroup = 37451D6215C2F10900327D82; 164 | productRefGroup = 37451D6E15C2F10900327D82 /* Products */; 165 | projectDirPath = ""; 166 | projectRoot = ""; 167 | targets = ( 168 | 37451D6C15C2F10900327D82 /* URLSchemes */, 169 | ); 170 | }; 171 | /* End PBXProject section */ 172 | 173 | /* Begin PBXResourcesBuildPhase section */ 174 | 37451D6B15C2F10900327D82 /* Resources */ = { 175 | isa = PBXResourcesBuildPhase; 176 | buildActionMask = 2147483647; 177 | files = ( 178 | 37451D7C15C2F10900327D82 /* InfoPlist.strings in Resources */, 179 | 37451D8515C2F10900327D82 /* MainStoryboard.storyboard in Resources */, 180 | 37152B0815EBD2BB0073A628 /* README.md in Resources */, 181 | ); 182 | runOnlyForDeploymentPostprocessing = 0; 183 | }; 184 | /* End PBXResourcesBuildPhase section */ 185 | 186 | /* Begin PBXSourcesBuildPhase section */ 187 | 37451D6915C2F10900327D82 /* Sources */ = { 188 | isa = PBXSourcesBuildPhase; 189 | buildActionMask = 2147483647; 190 | files = ( 191 | 37451D7E15C2F10900327D82 /* main.m in Sources */, 192 | 37451D8215C2F10900327D82 /* AppDelegate.m in Sources */, 193 | 37451D8815C2F10900327D82 /* ViewController.m in Sources */, 194 | 37451D9515C2F86500327D82 /* URLParser.m in Sources */, 195 | 37451D9815C2F87800327D82 /* NSString+URLEncoding.m in Sources */, 196 | 370E0FA415F39132000C11F8 /* Scratchpad.m in Sources */, 197 | ); 198 | runOnlyForDeploymentPostprocessing = 0; 199 | }; 200 | /* End PBXSourcesBuildPhase section */ 201 | 202 | /* Begin PBXVariantGroup section */ 203 | 37451D7A15C2F10900327D82 /* InfoPlist.strings */ = { 204 | isa = PBXVariantGroup; 205 | children = ( 206 | 37451D7B15C2F10900327D82 /* en */, 207 | ); 208 | name = InfoPlist.strings; 209 | sourceTree = ""; 210 | }; 211 | 37451D8315C2F10900327D82 /* MainStoryboard.storyboard */ = { 212 | isa = PBXVariantGroup; 213 | children = ( 214 | 37451D8415C2F10900327D82 /* en */, 215 | ); 216 | name = MainStoryboard.storyboard; 217 | sourceTree = ""; 218 | }; 219 | /* End PBXVariantGroup section */ 220 | 221 | /* Begin XCBuildConfiguration section */ 222 | 37451D8915C2F10900327D82 /* Debug */ = { 223 | isa = XCBuildConfiguration; 224 | buildSettings = { 225 | ALWAYS_SEARCH_USER_PATHS = NO; 226 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 227 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 228 | CLANG_ENABLE_OBJC_ARC = YES; 229 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 230 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 231 | COPY_PHASE_STRIP = NO; 232 | GCC_C_LANGUAGE_STANDARD = gnu99; 233 | GCC_DYNAMIC_NO_PIC = NO; 234 | GCC_OPTIMIZATION_LEVEL = 0; 235 | GCC_PREPROCESSOR_DEFINITIONS = ( 236 | "DEBUG=1", 237 | "$(inherited)", 238 | ); 239 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 240 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 241 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 242 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 243 | GCC_WARN_UNUSED_VARIABLE = YES; 244 | IPHONEOS_DEPLOYMENT_TARGET = 5.1; 245 | SDKROOT = iphoneos; 246 | }; 247 | name = Debug; 248 | }; 249 | 37451D8A15C2F10900327D82 /* Release */ = { 250 | isa = XCBuildConfiguration; 251 | buildSettings = { 252 | ALWAYS_SEARCH_USER_PATHS = NO; 253 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 254 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 255 | CLANG_ENABLE_OBJC_ARC = YES; 256 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 257 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 258 | COPY_PHASE_STRIP = YES; 259 | GCC_C_LANGUAGE_STANDARD = gnu99; 260 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 261 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 262 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 263 | GCC_WARN_UNUSED_VARIABLE = YES; 264 | IPHONEOS_DEPLOYMENT_TARGET = 5.1; 265 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 266 | SDKROOT = iphoneos; 267 | VALIDATE_PRODUCT = YES; 268 | }; 269 | name = Release; 270 | }; 271 | 37451D8C15C2F10900327D82 /* Debug */ = { 272 | isa = XCBuildConfiguration; 273 | buildSettings = { 274 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 275 | GCC_PREFIX_HEADER = "URLSchemes/URLSchemes-Prefix.pch"; 276 | INFOPLIST_FILE = "URLSchemes/URLSchemes-Info.plist"; 277 | PRODUCT_NAME = "$(TARGET_NAME)"; 278 | WRAPPER_EXTENSION = app; 279 | }; 280 | name = Debug; 281 | }; 282 | 37451D8D15C2F10900327D82 /* Release */ = { 283 | isa = XCBuildConfiguration; 284 | buildSettings = { 285 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 286 | GCC_PREFIX_HEADER = "URLSchemes/URLSchemes-Prefix.pch"; 287 | INFOPLIST_FILE = "URLSchemes/URLSchemes-Info.plist"; 288 | PRODUCT_NAME = "$(TARGET_NAME)"; 289 | WRAPPER_EXTENSION = app; 290 | }; 291 | name = Release; 292 | }; 293 | /* End XCBuildConfiguration section */ 294 | 295 | /* Begin XCConfigurationList section */ 296 | 37451D6715C2F10900327D82 /* Build configuration list for PBXProject "URLSchemes" */ = { 297 | isa = XCConfigurationList; 298 | buildConfigurations = ( 299 | 37451D8915C2F10900327D82 /* Debug */, 300 | 37451D8A15C2F10900327D82 /* Release */, 301 | ); 302 | defaultConfigurationIsVisible = 0; 303 | defaultConfigurationName = Release; 304 | }; 305 | 37451D8B15C2F10900327D82 /* Build configuration list for PBXNativeTarget "URLSchemes" */ = { 306 | isa = XCConfigurationList; 307 | buildConfigurations = ( 308 | 37451D8C15C2F10900327D82 /* Debug */, 309 | 37451D8D15C2F10900327D82 /* Release */, 310 | ); 311 | defaultConfigurationIsVisible = 0; 312 | defaultConfigurationName = Release; 313 | }; 314 | /* End XCConfigurationList section */ 315 | }; 316 | rootObject = 37451D6415C2F10900327D82 /* Project object */; 317 | } 318 | --------------------------------------------------------------------------------