URLWithString: renvoie nil

93

c'est peut-être très facile, mais je ne semble pas savoir pourquoi le URLWithString:retour est nul ici.

//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];
gcamp
la source
1
Quelle est la valeur webNameavant votre appel stringWithFormat:? Alors, quelle est la valeur stringURLavant votre appel URLWithString:? Utilisez NSLog()pour les imprimer étape par étape, ou définissez des points d'arrêt et inspectez les valeurs au fur et à mesure qu'elles sont définies.
Kevin Conner

Réponses:

203

Vous devez également échapper les caractères non ASCII dans votre URL codée en dur:

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

Vous pouvez probablement supprimer l'échappement de la localisationName car il sera géré par l'échappement de la chaîne entière.

gerry3
la source
Essayer de comprendre pourquoi URLWithString donne nul ici. Les documents Apple disent "Doit être une URL conforme à la RFC 2396. Cette méthode analyse URLString conformément aux RFC 1738 et 1808.". Faire un peu de lecture ...
russau
1
LOL, j'ai copié une URL à partir d'un e-mail et c'est arrivé! Merci.
Echelon
1
se casse si l'URL contient un #. stringByAddingPercentEscapesUsingEncodingconvertit # en% 2
Ali Saeed
3
L'API ci-dessus est obsolète. Vous pouvez utiliser l'API suivante webStringURL = [stringURL stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
Rushabh
41

Utilisez cette fonction si vous traitez un fichier enregistré sur le gestionnaire de fichiers.

NSURL *_url = [NSURL fileURLWithPath:path];
Islam.Ibrahim
la source
MERCI! Je
recevais une
8

Je suppose que vous devez utiliser -[NSString stringByAddingPercentEscapesUsingEncoding:]. Voir le doc d'Apple .

Un autre commentaire est que, en tant que vieille minuterie, je trouve un peu difficile de mettre des caractères non ASCII dans un fichier source. Cela dit, ce document Apple dit, à partir de 10.4, les chaînes UTF-16 sont OK à l'intérieur @"...". D'une manière ou d'une autre, GCC semble convertir correctement le fichier source en Latin-1 en UTF-16 dans le binaire, mais je pense qu'il est plus sûr d'utiliser des caractères ASCII 7 bits uniquement à l'intérieur du code source et de l'utiliser NSLocalizedString.

Yuji
la source
2

Je pense que vos personnages accentués gâchent les choses; ils ne seront pas gérés par -stringByAddingPercentEscapesUsingEncoding :.

Ben Gottlieb
la source
2

NSURL URLWithString: @ "" renverra nil si l'URL n'est pas conforme à RFC 2396 et doit être échappée

Si vous lisez rfc2396 dans le lien, vous obtiendrez beaucoup de détails

Un excellent site que j'ai trouvé pour vérifier où se trouve le caractère incriminé, choisissez l'option de chemin pour l'URL

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

Ryan Heitner
la source
0

L'appel URLWithString: retournera un nul si la chaîne qui lui est passée est mal formée. Puisque NSURL renvoie nil pour les URL mal formées, NSLog votre chaîne et définissez des points d'arrêt pour voir exactement ce qui est passé à votre méthode de création NSURL. Si votre URLWithString fonctionne avec une valeur codée en dur, c'est une preuve supplémentaire que tout ce que vous transmettez est mal formé. voir

Iggy
la source
-1

Vous pouvez utiliser NSURL directement sans NSString.

//.h fichier

@interface NewsBrowser : UIViewController {

    UIWebView *webView;
    NSURL *NewsUrl;

}

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

@property(nonatomic,assign)NSURL *NewsUrl;

@end

//.m fichier

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

Et je passe l'URL d'une autre vue (en utilisant la variable NewsUrl) à cette vue.

Essayez-le.

fady
la source
Cette réponse ne répondait pas du tout à la question, qui demandait pourquoi URLWithString: retournait nil. (De plus, vous n'avez même pas montré un moyen de changer une chaîne en URL.)
ArtOfWarfare