Search code examples
iosobjective-cregexnsstringnsurl

How to extract and remove scheme name from NSURL?


What is proper way to extract and remove scheme name and :// from a NSURL?

For example:

 note://Hello  ->  @"Hello"
 calc://3+4/5  ->  @"3+4/5"

so

NSString *scheme = @"note://";
NSString *path   = @"Hello";

for later use in:

[[NSNotificationCenter defaultCenter] postNotificationName:scheme object:path];

Solution

  • You can look at it like this (mostly untested code, but you get the idea):

    - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
    {
        NSLog(@"url: %@", url);
        NSLog(@"scheme: %@", [url scheme]);
        NSLog(@"query: %@", [url query]);
        NSLog(@"host: %@", [url host]);
        NSLog(@"path: %@", [url path]);
    
        NSDictionary * dict = [self parseQueryString:[url query]];
        NSLog(@"query dict: %@", dict);
    }
    

    So you can do this:

    NSString * strNoURLScheme = 
     [strMyURLWithScheme stringByReplacingOccurrencesOfString:[url scheme] withString:@""];
    
    NSLog(@"URL without scheme: %@", strNoURLScheme);
    

    parseQueryString

    - (NSDictionary *)parseQueryString:(NSString *)query
    {
        NSMutableDictionary *dict = [[[NSMutableDictionary alloc] initWithCapacity:6] autorelease];
        NSArray *pairs = [query componentsSeparatedByString:@"&"];
    
        for (NSString *pair in pairs) {
            NSArray *elements = [pair componentsSeparatedByString:@"="];
            NSString *key = [[elements objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            NSString *val = [[elements objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];        
            [dict setObject:val forKey:key];
        }
        return dict;
    }