URLWithString: restituisce nil


93

può essere molto facile, ma non mi sembra di scoprire perché stia URLWithString:tornando a zero qui.

//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 è il valore di webNameprima della tua chiamata stringWithFormat:? Allora, qual è il valore di stringURLprima della tua chiamata URLWithString:? Utilizzare NSLog()per stamparli passo dopo passo oppure impostare i punti di interruzione e controllare i valori man mano che vengono impostati.
Kevin Conner,

Risposte:


203

Devi anche eseguire l'escape dei caratteri non ASCII nel tuo URL codificato:

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

Probabilmente puoi rimuovere l'escape di localisationName poiché sarà gestito dall'escape dell'intera stringa.


Sto cercando di capire perché URLWithString sta dando zero qui. I documenti Apple dicono "Deve essere un URL conforme a RFC 2396. Questo metodo analizza URLString in base a RFC 1738 e 1808.". Facendo un po 'di lettura ...
russau

1
LOL, ho copiato un URL da un'e-mail e questo è successo! Grazie.
Echelon

1
si interrompe se l'URL contiene un #. stringByAddingPercentEscapesUsingEncodingconverte # in% 2
Ali Saeed

3
L'API sopra è deprecata. È possibile utilizzare la seguente API webStringURL = [stringURL stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
Rushabh

41

Usa questa funzione se hai a che fare con file salvati su file manager.

NSURL *_url = [NSURL fileURLWithPath:path];

GRAZIE!
Ricevevo un

8

Immagino che tu debba usare -[NSString stringByAddingPercentEscapesUsingEncoding:]. Vedi il documento Apple .

Un altro commento è che, come un vecchio timer, trovo un po 'a disagio inserire caratteri non ASCII in un file sorgente. Detto questo, questo documento Apple dice, a partire dalla 10.4, le stringhe UTF-16 sono OK all'interno @"...". In qualche modo GCC sembra convertire correttamente il file sorgente in Latin-1 in UTF-16 nel binario, ma penso che sia più sicuro usare caratteri ASCII a 7 bit solo all'interno del codice sorgente e utilizzare NSLocalizedString.


2

Penso che i tuoi personaggi accentati stiano buttando via le cose; non saranno gestiti da -stringByAddingPercentEscapesUsingEncoding :.



0

La chiamata URLWithString: restituirà un valore nullo se la stringa passata non è valida. Poiché NSURL restituisce zero per gli URL non corretti, NSLog la stringa e impostare i punti di interruzione per vedere esattamente cosa viene passato al metodo di creazione NSURL. Se il tuo URLWithString funziona con un valore hardcoded, è un'ulteriore prova che qualunque cosa tu stia passando non è valida. vedere


-1

Puoi usare NSURL direttamente senza NSString.

//.h file

@interface NewsBrowser : UIViewController {

    UIWebView *webView;
    NSURL *NewsUrl;

}

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

@property(nonatomic,assign)NSURL *NewsUrl;

@end

//.m file

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

E passo l'URL da un'altra vista (usando la variabile NewsUrl) a questa vista.

Provalo.


Questa risposta non risolveva affatto la domanda, che chiedeva perché URLWithString: restituiva zero. (Inoltre, non hai nemmeno mostrato un mezzo per cambiare una stringa in un URL.)
ArtOfWarfare
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.