NSURL baseURL возвращает нуль. Любой другой способ получить фактический базовый URL-адрес

Я думаю, что не понимаю концепцию "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.

Я хочу получить из этого примера URL:

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

Этот базовый URL

https://www.google.es

Мой вопрос прост. Есть ли более чистый способ получить фактический базовый URL-адрес без конкатенации схемы и имени хоста? Я имею в виду, какова цель базового URL-адреса?

Ответ 1

-baseURL - это понятие чисто NSURL/CFURL, а не URL в целом. Если вы это сделали:

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

тогда baseURL будет https://www.google.es/. Короче говоря, baseURL заполняется, только если NSURL создается с использованием метода, который явно передается в базовом URL-адресе. Основная цель этой функции - обрабатывать относительные строки URL-адресов, которые могут быть найдены в источнике типичной веб-страницы.

Вместо этого вы должны взять произвольный URL-адрес и отбросить его только на часть хоста. Самый простой способ, который я знаю, это немного хитрость:

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

Это даст hostURL of https://www.google.es/

У меня есть такой метод, опубликованный как -[NSURL ks_hostURL] как часть KSFileUtilities (прокрутите вниз по readme, чтобы найти его документально)

Если вы хотите чисто хост, а не что-то вроде схемы/порта и т.д., тогда -[NSURL host] - ваш метод.

Ответ 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];

Ответ 3

Вот быстрый, простой и безопасный способ получить базовый URL-адрес:

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];