URLWithString: retorna nil


93

pode ser muito fácil, mas não consigo descobrir por que não URLWithString:retornar nada aqui.

//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
Qual é o valor de webNameantes de sua chamada para stringWithFormat:? Então, qual é o valor de stringURLantes de ligar para URLWithString:? Use NSLog()para imprimi-los passo a passo ou definir pontos de interrupção e inspecionar os valores à medida que são definidos.
Kevin Conner

Respostas:


203

Você também precisa escapar os caracteres não ASCII em seu URL codificado:

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

Você provavelmente pode remover o escape de localisationName, uma vez que ele será tratado pelo escape de toda a string.


Tentando entender por que URLWithString está dando nulo aqui. Os documentos da Apple dizem "Deve ser um URL em conformidade com RFC 2396. Este método analisa URLString de acordo com RFCs 1738 e 1808.". Fazendo alguma leitura ...
russau

1
LOL, copiei um URL de um email e aconteceu! Obrigado.
Echelon

1
quebra se o URL tiver um # nele. stringByAddingPercentEscapesUsingEncodingconverte # em% 2
Ali Saeed

3
A API acima está obsoleta. Você pode usar a seguinte API webStringURL = [stringURL stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
Rushabh,

41

Use esta função se você lidar com arquivos salvos no gerenciador de arquivos.

NSURL *_url = [NSURL fileURLWithPath:path];

OBRIGADO! Eu estava recebendo um url 'aparado no meio'
codrut de

8

Eu acho que você precisa usar -[NSString stringByAddingPercentEscapesUsingEncoding:]. Veja o documento da Apple .

Outro comentário é que, como um veterano, acho um pouco desconfortável colocar caracteres não ASCII em um arquivo de origem. Dito isso, este documento da Apple diz que, a partir de 10.4, strings UTF-16 estão OK por dentro @"...". De alguma forma, o GCC parece converter corretamente o arquivo de origem em Latin-1 em UTF-16 no binário, mas acho que é mais seguro usar caracteres ASCII de 7 bits apenas dentro do código-fonte e usar NSLocalizedString.


2

Acho que seus personagens com sotaque estão confundindo as coisas; eles não serão tratados por -stringByAddingPercentEscapesUsingEncoding :.



0

A chamada URLWithString: retornará nulo se a string passada para ela estiver malformada. Como NSURL retorna nulo para urls malformados, faça NSLog em sua string e defina pontos de interrupção para ver exatamente o que está sendo passado para seu método de criação NSURL. Se o URLWithString funcionar com um valor codificado, isso é mais uma prova de que tudo o que você está passando está malformado. Vejo


-1

Você pode usar NSURL diretamente sem NSString.

//.h arquivo

@interface NewsBrowser : UIViewController {

    UIWebView *webView;
    NSURL *NewsUrl;

}

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

@property(nonatomic,assign)NSURL *NewsUrl;

@end

//.m arquivo

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

E eu passo a URL de outra visão (usando a variável NewsUrl) para esta visão.

Tente.


Essa resposta não abordava a questão de forma alguma, que estava perguntando por que URLWithString: estava retornando nil. (Além disso, você nem mesmo mostrou um meio de transformar uma string em URL.)
ArtOfWarfare
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.