2013-04-09 9 views
10

Ich glaube, ich verstehe das Konzept der "baseURL" nicht. Dies:NSURL baseURL gibt null zurück. Jeder andere Weg, um die tatsächliche Basis-URL zu erhalten

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

Drucke diese:

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

Und natürlich in der Apple docs ich dies lesen:

Rückgabewert Die Basis-URL des Empfängers. Wenn der Empfänger eine absolute URL ist, wird NULL zurückgegeben.

Ich möchte aus diesem Beispiel URL erhalten:

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

Diese Basis-URL

https://www.google.es

Meine Frage ist einfach. Gibt es eine sauberere Möglichkeit, die tatsächliche Basis-URL zu erhalten, ohne das Schema und den Hostnamen zu verketten? Ich meine, was ist der Zweck der Basis-URL dann?

+0

Was Ergebnis genau suchen Sie? –

+0

Entschuldigung, ich habe vergessen zu erwähnen, dass: Ich möchte von dieser URL zum Beispiel: https://www.google.es/#hl=en&output=search&sclient=psy-ab&q=cats, um die "Basis-URL" Teil -> https://www.google.es – Lupi

Antwort

2

Dokumente für BaseURL.

Scheint, es funktioniert nur für relative URLs.

Sie könnten möglicherweise verwenden ...

NSArray *pathComponents = [url pathComponents] 

und dann die Bits nehmen Sie wollen.

Oder versuchen ...

NSString *host = [url host]; 
24

-baseURL ist ein Konzept, rein von NSURL/CFURL statt URLs im Allgemeinen. Wenn Sie dies tun:

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

dann würde baseURLhttps://www.google.es/ sein. Kurz gesagt, baseURL wird nur ausgefüllt, wenn die NSURL mit einer Methode erstellt wird, die explizit eine Basis-URL übergibt. Der Hauptzweck dieser Funktion besteht darin, relative URL-Strings zu behandeln, wie sie in der Quelle einer typischen Webseite zu finden sind.

Sie möchten stattdessen eine beliebige URL verwenden und sie auf den Host-Bereich zurücksetzen. Der einfachste Weg, ich weiß, dies zu tun, ist ein wenig listig:

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

Dies ist ein hostURL von https://www.google.es/

geben werde ich ein solches Verfahren als -[NSURL ks_hostURL] als Teil KSFileUtilities veröffentlicht (scrollen Sie die readme nach unten zu finden es dokumentiert)

Wenn Sie nur den Host und nichts wie Schema/Port usw. wollen, dann -[NSURL host] ist Ihre Methode.

+0

Danke dafür. – KarenAnne

-1

Hier ist eine schnelle, einfache und sichere Art und Weise die Basis-URL zu holen:

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

Was ist mit https und anderen Schemas? – animaonline