URLWithString: Gibt null zurück


93

es mag sehr einfach sein, aber ich scheine nicht herauszufinden, warum URLWithString:hier nichts zurückkommt.

//localisationName is a arbitrary string here
NSString* webName = [localisationName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSString* stringURL = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@,Montréal,Communauté-Urbaine-de-Montréal,Québec,Canadae&output=csv&oe=utf8&sensor=false&key=", webName];
NSURL* url = [NSURL URLWithString:stringURL];

1
Was ist der Wert webNamevor Ihrem Anruf bei stringWithFormat:? Was ist dann der Wert stringURLvor Ihrem Anruf bei URLWithString:? Verwenden Sie NSLog()diese Option , um sie Schritt für Schritt auszudrucken, oder legen Sie Haltepunkte fest und überprüfen Sie die festgelegten Werte.
Kevin Conner

Antworten:


202

Sie müssen auch die Nicht-ASCII-Zeichen in Ihrer fest codierten URL maskieren:

//localisationName is a arbitrary string here
NSString* webName = [localisationName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSString* stringURL = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@,Montréal,Communauté-Urbaine-de-Montréal,Québec,Canadae&output=csv&oe=utf8&sensor=false", webName];
NSString* webStringURL = [stringURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL* url = [NSURL URLWithString:webStringURL];

Sie können wahrscheinlich das Escapezeichen des localisationName entfernen, da es durch das Escapezeichen der gesamten Zeichenfolge behandelt wird.


Ich versuche zu verstehen, warum URLWithString hier null gibt. In Apple-Dokumenten heißt es: "Muss eine URL sein, die RFC 2396 entspricht. Diese Methode analysiert URLString gemäß den RFCs 1738 und 1808." Lesen Sie etwas ...
Russau

1
LOL, ich habe eine URL aus einer E-Mail kopiert und das ist passiert! Vielen Dank.
Echelon

1
bricht ab, wenn die URL ein # enthält. stringByAddingPercentEscapesUsingEncodingkonvertiert # in% 2
Ali Saeed

1
Die oben genannte API ist veraltet. Sie könnten die folgende API verwenden webStringURL = [stringURL stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
Rushabh

41

Verwenden Sie diese Funktion, wenn Sie mit Dateien arbeiten, die im Dateimanager gespeichert sind.

NSURL *_url = [NSURL fileURLWithPath:path];

DANKE! Ich bekam eine URL in der Mitte
Codrut

8

Ich denke, Sie müssen verwenden -[NSString stringByAddingPercentEscapesUsingEncoding:]. Siehe Apple-Dokument .

Ein weiterer Kommentar ist, dass es mir als Oldtimer etwas unangenehm ist, Nicht-ASCII-Zeichen in eine Quelldatei einzufügen. In diesem Apple-Dokument heißt es jedoch, dass ab 10.4 UTF-16-Zeichenfolgen im Inneren in Ordnung sind @"...". Irgendwie scheint GCC die Quelldatei in Latin-1 korrekt in UTF-16 in der Binärdatei zu konvertieren, aber ich denke, es ist am sichersten, 7-Bit-ASCII-Zeichen nur innerhalb des Quellcodes zu verwenden und zu verwenden NSLocalizedString.


2

Ich denke, deine akzentuierten Charaktere werfen Dinge ab; Sie werden nicht von -stringByAddingPercentEscapesUsingEncoding: verarbeitet.



0

Der Aufruf von URLWithString: gibt eine Null zurück, wenn die an ihn übergebene Zeichenfolge fehlerhaft ist. Da NSURL für fehlerhafte URLs null zurückgibt, protokollieren Sie Ihre Zeichenfolge und setzen Sie Haltepunkte, um genau zu sehen, was an Ihre NSURL-Erstellungsmethode übergeben wird. Wenn Ihr URLWithString mit einem fest codierten Wert arbeitet, ist dies ein weiterer Beweis dafür, dass alles, was Sie übergeben, fehlerhaft ist. sehen


-1

Sie können NSURL direkt ohne NSString verwenden.

//.h Datei

@interface NewsBrowser : UIViewController {

    UIWebView *webView;
    NSURL *NewsUrl;

}

@property (nonatomic, retain) IBOutlet UIWebView *webView;

@property(nonatomic,assign)NSURL *NewsUrl;

@end

//.m Datei

[webView loadRequest:[NSURLRequest requestWithURL:NewsUrl]];

Und ich übergebe die URL von einer anderen Ansicht (unter Verwendung der NewsUrl-Variablen) an diese Ansicht.

Versuch es.


Diese Antwort ging überhaupt nicht auf die Frage ein, warum URLWithString: null zurückgab. (Außerdem haben Sie nicht einmal ein Mittel zum Ändern einer Zeichenfolge in eine URL gezeigt.)
ArtOfWarfare
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.