URLWithString: devuelve nulo


93

puede ser muy fácil, pero no parece averiguar por qué está URLWithString:devolviendo cero aquí.

//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
¿Cuál es el valor de webNameantes de su llamada stringWithFormat:? Entonces, ¿cuál es el valor de stringURLantes de su llamada a URLWithString:? Úselo NSLog()para imprimirlos paso a paso, o para establecer puntos de corte e inspeccionar los valores a medida que se establecen.
Kevin Conner

Respuestas:


203

También debe escapar de los caracteres que no son ASCII en su URL codificada:

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

Probablemente pueda eliminar el escape de localisationName, ya que será manejado por el escape de toda la cadena.


Tratando de entender por qué URLWithString da nulo aquí. Los documentos de Apple dicen "Debe ser una URL que se ajuste a RFC 2396. Este método analiza URLString de acuerdo con las RFC 1738 y 1808". Leer un poco ...
russau

1
LOL, copié una URL de un correo electrónico y esto sucedió. Gracias.
Echelon

1
se rompe si la URL tiene un #. stringByAddingPercentEscapesUsingEncodingconvierte # en% 2
Ali Saeed

3
La API anterior está obsoleta. Puede usar la siguiente API webStringURL = [stringURL stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
Rushabh

41

Utilice esta función si trabaja con archivos guardados en el administrador de archivos.

NSURL *_url = [NSURL fileURLWithPath:path];

¡GRACIAS!
Recibía una

8

Supongo que necesitas usar -[NSString stringByAddingPercentEscapesUsingEncoding:]. Consulte el documento de Apple .

Otro comentario es que, como un veterano, me resulta un poco incómodo poner caracteres que no sean ASCII en un archivo fuente. Dicho esto, este documento de Apple dice que, a partir de 10.4, las cadenas UTF-16 están bien por dentro @"...". De alguna manera, GCC parece convertir correctamente el archivo fuente en Latin-1 en UTF-16 en el binario, pero creo que es más seguro usar caracteres ASCII de 7 bits solo dentro del código fuente y usar NSLocalizedString.


2

Creo que tus personajes acentuados están deshaciendo las cosas; no serán manejados por -stringByAddingPercentEscapesUsingEncoding :.



0

La llamada URLWithString: devolverá un nulo si la cadena que se le pasa está mal formada. Dado que NSURL devuelve nil para URL con formato incorrecto, NSLog su cadena y establezca puntos de interrupción para ver exactamente qué se está pasando a su método de creación NSURL. Si su URLWithString funciona con un valor codificado de forma rígida, eso es una prueba más de que lo que está pasando está mal formado. ver


-1

Puede usar NSURL directamente sin NSString.

//.h archivo

@interface NewsBrowser : UIViewController {

    UIWebView *webView;
    NSURL *NewsUrl;

}

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

@property(nonatomic,assign)NSURL *NewsUrl;

@end

//.m archivo

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

Y paso la URL de otra vista (usando la variable NewsUrl) a esta vista.

Intentalo.


Esta respuesta no abordó la pregunta en absoluto, que preguntaba por qué URLWithString: devolvía nulo. (Además, ni siquiera mostró un medio para cambiar una cadena a una URL)
ArtOfWarfare
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.