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

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.


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

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.


2

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



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


-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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.