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];
gcamp
fonte
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.

gerry3
fonte
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];
Islam.Ibrahim
fonte
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.

Yuji
fonte
2

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

Ben Gottlieb
fonte
2

NSURL URLWithString: @ "" retornará nulo se o URL não estiver em conformidade com RFC 2396 e eles devem ter escape

Se você ler rfc2396 no link, obterá muitos detalhes

Um ótimo site que encontrei para verificar onde está o personagem ofensor, escolha a opção de caminho para URL

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

Ryan Heitner
fonte
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

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

fady
fonte
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