NSURL baseURL返回nil。获取实际基本URL的任何其他方式

时间:2013-04-09 07:20:58

标签: objective-c nsurl

我想我不明白“baseURL”的概念。这样:

NSLog(@"BASE URL: %@ %@", [NSURL URLWithString:@"http://www.google.es"], [[NSURL URLWithString:@"http://www.google.es"] baseURL]);

打印出来:

BASE URL: http://www.google.es (null)

当然,在Apple docs我读到了这个:

  

返回值   接收者的基本URL。如果接收者是绝对URL,则返回nil。

我想从这个示例网址中获取:

https://www.google.es/search?q=uiviewcontroller&aq=f&oq=uiviewcontroller&sourceid=chrome&ie=UTF-8

此基本网址

https://www.google.es

我的问题很简单。有没有更简洁的方法来获取实际的基本URL而不连接方案和主机名?我的意思是,基本URL的目的是什么?

5 个答案:

答案 0 :(得分:28)

-baseURL纯粹是NSURL/CFURL的概念,而不是一般的网址。如果你这样做了:

[NSURL URLWithString:@"search?q=uiviewcontroller"
       relativeToURL:[NSURL URLWithString:@"https://www.google.es/"]];

然后baseURL将是https://www.google.es/。简而言之,只有在使用显式传入基本URL的方法创建baseURL时才会填充NSURL。此功能的主要目的是处理相对URL字符串,例如可能在典型网页的源代码中找到。

你所追求的是取一个任意的URL并将其剥离回主机部分。我知道这样做最简单的方法就是狡猾:

NSURL *aURL =  [NSURL URLWithString:@"https://www.google.es/search?q=uiviewcontroller"];
NSURL *hostURL = [[NSURL URLWithString:@"/" relativeToURL:aURL] absoluteURL];

这将hostURL https://www.google.es/

我有-[NSURL ks_hostURL]这样的方法作为KSFileUtilities的一部分发布(向下滚动自述文件以找到它)

如果您只想要主机而不是方案/端口等,那么-[NSURL host]就是您的方法。

答案 1 :(得分:2)

BaseURL的文档。

baseURL
Returns the base URL of the receiver.

- (NSURL *)baseURL
Return Value
The base URL of the receiver. If the receiver is an absolute URL, returns nil.

Availability
Available in iOS 2.0 and later.
Declared In
NSURL.h

似乎它只适用于相对URL。

你可以使用......

NSArray *pathComponents = [url pathComponents]

然后取出你想要的位数。

或尝试......

NSString *host = [url host];

答案 2 :(得分:0)

可能只是我一个人,但是当我进一步思考the double-URL solution时,听起来好像在OS更新之间可能会停止工作。因此,我决定共享另一种解决方案,该解决方案也绝对不美观,但是由于它不依赖于框架的任何隐藏的特殊性,因此我发现它对一般公众更具可读性。

if let path = URL(string: resourceURI)?.path {
  let baseURL = URL(string: resourceURI.replacingOccurrences(of: path, with: ""))
  ...
}

答案 3 :(得分:0)

您可以使用host方法

NSURL *url = [[NSURL alloc] initWithString:@"http://www.hello.com"];

NSLog(@"Host:%@", url.host);

结果:

Host:www.hello.com

答案 4 :(得分:-1)

这是一种快速,简单,安全的方式来获取基本网址:

NSError *regexError = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"http://.*/" options:NSRegularExpressionCaseInsensitive error:&regexError];

if (regexError) {
    NSLog(@"regexError: %@", regexError);
    return nil;
}

NSTextCheckingResult *match = [regex firstMatchInString:url.absoluteString options:0 range:NSMakeRange(0, url.absoluteString.length)];

NSString *baseURL = [url.absoluteString substringWithRange:match.range];