How to extract and remove scheme name from NSURL?
Solution 1
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;
}
Solution 2
My inclination is to roll your own string searching for this:
NSRange dividerRange = [urlString rangeOfString:@"://"];
NSUInteger divide = NSMaxRange(dividerRange);
NSString *scheme = [urlString substringToIndex:divide];
NSString *path = [urlString substringFromIndex:divide];
This does what you've asked for in quite a literal fashion, dividing the URL in half around its scheme. For more advanced handling, you'll have to provide more details.
Solution 3
just use the NSURL's API named: resourceSpecifier
:)
and remove the two slashes from the beginning of the string:
NSURL *url = [NSURL URLWithString:@"https://some.url.com/path];
url.resourceSpecifier
will result in: //some.url.com/path
Solution 4
Remember, don't fight the frameworks especially when it comes to NSURL. This SO answer has a good breakdown of its abilities. https://stackoverflow.com/a/3693009/142358
NSURL's scheme and path properties are exactly what you want which (assuming the rest of your URL looks like a path) leaves you with this:
NSString *schemeWithDelimiter = [NSString stringWithFormat:@"%@://",[myURL scheme]];
[[NSNotificationCenter defaultCenter] postNotificationName: schemeWithDelimiter object:[myURL path];
No string searching needed!
Solution 5
Swift5, URL extension:
var resourceSpecifier: String {
get {
let nrl : NSURL = self as NSURL
return nrl.resourceSpecifier ?? self.absoluteString
}
}
var simpleSpecifier: String {
get {
let str = self.resourceSpecifier
return str[2..<str.count]
}
}
Comments
-
ohho almost 2 years
What is proper way to extract and remove scheme name and
://
from aNSURL
?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];
-
the1pawan almost 11 yearsNSString *str = [urURL absoluteString]; NSString *string = [str stringByReplacingOccurrencesOfString:@":// " withString:@""] //try this
-
CodaFi almost 11 yearsTake a look at this. It parses the entire URL scheme, but you get the gist of it.
-
-
jjrscott over 4 yearsThis is the correct answer. From TFM: "Any URL is composed of these two basic pieces. The full URL would be the concatenation of [myURL scheme], ':', [myURL resourceSpecifier]"