├── 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 |
--------------------------------------------------------------------------------