URLWithString: zwraca nil


93

może to być bardzo łatwe, ale nie wydaje mi się, aby dowiedzieć się, dlaczego URLWithString:zwraca tutaj zero.

//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
Jaka jest wartość webNameprzed Twoim telefonem stringWithFormat:? Jaka jest zatem wartość stringURLprzed twoim wezwaniem URLWithString:? Służy NSLog()do drukowania ich krok po kroku lub ustawiania punktów przerwania i sprawdzania wartości podczas ich ustawiania.
Kevin Conner

Odpowiedzi:


203

W zakodowanym na stałe adresie URL musisz również zmienić znaczenie znaków spoza zestawu ASCII:

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

Prawdopodobnie możesz usunąć znak ucieczki localisationName, ponieważ zostanie on obsłużony przez zmianę znaczenia całego ciągu.


Próbuję zrozumieć, dlaczego URLWithString podaje tutaj zero. Dokumenty Apple mówią „Musi to być adres URL zgodny ze specyfikacją RFC 2396. Ta metoda analizuje ciąg znaków URL zgodnie ze specyfikacjami RFC 1738 i 1808”. Trochę czytać ...
russau

1
LOL, skopiowałem adres URL z e-maila i tak się stało! Dzięki.
Echelon

1
psuje się, jeśli adres URL zawiera #. stringByAddingPercentEscapesUsingEncodingkonwertuje # na% 2
Ali Saeed

3
Powyższy interfejs API został wycofany. Możesz użyć następującego interfejsu API webStringURL = [stringURL stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
Rushabh


8

Myślę, że musisz użyć -[NSString stringByAddingPercentEscapesUsingEncoding:]. Zobacz dokument Apple .

Innym komentarzem jest to, że jako stary timer uważam, że umieszczanie znaków spoza ASCII w pliku źródłowym jest trochę trudne. To powiedziawszy, ten dokument Apple mówi, że począwszy od 10.4, ciągi znaków UTF-16 są w porządku w środku @"...". W jakiś sposób GCC wydaje się poprawnie konwertować plik źródłowy w Latin-1 do UTF-16 w formacie binarnym, ale myślę, że najbezpieczniej jest używać 7-bitowych znaków ASCII tylko w kodzie źródłowym i używać NSLocalizedString.


2

Myślę, że wasze akcentowane postacie odrzucają rzeczy; nie będą obsługiwane przez -stringByAddingPercentEscapesUsingEncoding :.


2

NSURL URLWithString: @ "" zwróci wartość nil, jeśli adres URL nie jest zgodny ze specyfikacją RFC 2396 i musi zawierać znaki zmiany znaczenia

Jeśli przeczytasz rfc2396 w linku, otrzymasz mnóstwo szczegółów

Świetna witryna do sprawdzania, gdzie znajduje się obraźliwy znak, wybierz opcję ścieżki dla adresu URL

http://www.websitedev.de/temp/rfc2396-check.html.gz


0

Wywołanie URLWithString: zwróci wartość zerową, jeśli przekazany do niego ciąg jest zniekształcony. Ponieważ NSURL zwraca nil dla źle sformułowanych adresów URL, NSLoguj swój ciąg i ustaw punkty przerwania, aby zobaczyć dokładnie, co jest przesyłane do metody tworzenia NSURL. Jeśli Twój URLWithString działa z wartością zakodowaną na stałe, jest to kolejny dowód na to, że cokolwiek przekazujesz, jest źle sformułowane. widzieć


-1

Możesz użyć nazwy NSURL bezpośrednio, bez NSString.

//.h plik

@interface NewsBrowser : UIViewController {

    UIWebView *webView;
    NSURL *NewsUrl;

}

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

@property(nonatomic,assign)NSURL *NewsUrl;

@end

//.m plik

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

I przekazuję adres URL z innego widoku (używając zmiennej NewsUrl) do tego widoku.

Spróbuj.


Ta odpowiedź w ogóle nie odpowiadała na pytanie, które dotyczyło pytania, dlaczego URLWithString: zwraca nil. (Co więcej, nawet nie
pokazałeś
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.