iOSI dispositivi iOS hanno dimostrato che adoperare un cellulare o un tablet per connettersi ad Internet non solo è possibile ma anche utile. Infatti verificando le statistiche di accesso si nota che tali dispositivi sono sempre i primi nell’accesso alla rete.

Anche io, personalmente, annovero i software che si connettono a servizi esterni, tra quelli più usati sui miei dispositivi.

Anzi posso tranquillamente affermare che il 90% degli applicativi da me scritti finora realizzavano una connessione ad internet per inviare e ricevere i dati sotto varie forme. Tali connessioni sono rivolte principalmente alla chiamata di servizi secondo i protocolli più disparati (sia standard che meno), di conseguenza nel codice sorgente mi sono trovato spesso a dover passare farametri di chiamata sia in formato GET che POST appropriatamente elaborati per poter essere trasferiti.

Tale operazione di codifica viene definita, generalmente, URLEncode e consiste nel sostituire determinati caratteri di una stringa nel loro equivalente esadecimale precedendoli con il simbolo di % (per esempio il carattore ‘ ‘, spazio, viene tradotto in %20, ovvero il 32 decimale che nel set di caratteri standard ASCII o UTF8 identifica appunto lo spazio). Tali caratteri verrano poi ricondotti alla loro forma normale direttamente dal webserver che riceverà la chiamata.

Come sempre l’SDK di iOS ci mette a disposizione tutto il necessario per poter effettuare tale operazione.

La classe preposta è NSString ed il metodo stringByAddingPercentEscapesUsingEncoding: esegue tale compito, ad esempio volendo convertire “Ciao Mondo” si dovrebbe proseguire con il seguente codice:

NSString *encodedString = [@"Ciao Mondo" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

in encodedString troveremo la stringa “Ciao%20Mondo“.

Purtroppo, però, questo metodo non è sufficiente, se infatti proviamo a convertire un numero telefonico con tanto di prefisso internazionale (ad esempio “+393334455667″), il testo contenuto in encodedString sarà il medesimo di partenza. Il risultato è che tale parametro non sarà interpretato correttamente dal web server e quindi il servizio si comporterà in modo inatteso. Per scovare questo tipo di Bug potreste quindi perdere intere giornate in quanto apparentemente tutto è corretto, ma il risultatto è comunque errato.

Per risolvere questo difetto è quindi necessario abbandonare la classe NSString ed adoperare direttamente le funzioni C dell’SDK ed in particolar modo la funzione CFURLCreateStringByAddingPercentEscapes.

Quindi supponendo di avere nella variabile stringValue, di tipo NSString, il testo da codificare la sintassi sarà la seguente:

NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)stringValue, NULL, (CFStringRef)@”!*’();:@&=+$,/?%#[]“, kCFStringEncodingUTF8 );

Nel caso adoperiate ARC potreste dover modificare la sintassi nel modo seguente:

NSString *encodedString = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (__bridge CFStringRef)stringValue, NULL, (CFStringRef)@”!*’();:@&=+$,/?%#[]“, kCFStringEncodingUTF8 );

In questo modo anche i caratteri indicati nel quarto parametro verranno debitamente codificati.

Arrivederci al prossimo suggerimento,

Roberto S.



Related Posts Plugin for WordPress, Blogger...

Tagged with: