Non esiste nessuna funzione ufficiale nella documentazione Apple per iOS che ci permetta in quattro e quattrotto di trovare e maneggiare l’indirizzo IP del dispositivo quindi siamo nelle condizioni di doverci creare una funzione ad hoc da usare quando necessario.
In realtà la mia prima affermazione non è del tutto vera, infatti esiste la classe NSHost per ricavare gli indirizzi, ma Apple dice di usarla solo per applicazioni Mac, e non vorrebbe certo che la nostra app sia rifiutata da AppStore solo perché siamo pigri….
Quindi ricorrendo alle nostre conoscenze di programmazione base di C sappiamo che esiste una funzione in grado di fornirci l’indirizzo IP di un dispositivo sapendo il nome attraverso l’interrogazione a server DNS, ovvero: gethostbyname(const char *name). Il nome, però, non è completo: manca della parte finale “.local” che informa della sua appartenenza alla rete locale.
Innanzitutto importiamo in cima al file .h le due librerie di sistema UNIX.
[code lang=”obj-c”]#import <netdb.h>
#import <arpa/inet.h>[/code]
poi spostiamoci nel file di implementazione .m ed inseriamo la funzione
[code lang=”obj-c”]-(NSString*)getAddress {
struct hostent *myHost;
struct in_addr **addr_list;
char *mioIP;
// ottengo il nome del dispositivo in rete
NSString *nomeHost = [[NSProcessInfo processInfo] hostName];
// aggiungo ".local" poichè indica la rete locale, cosa non necessaria sul simulatore
#if (!TARGET_IPHONE_SIMULATOR)
nomeHost = [nomeHost stringByAppendingFormat:@".local"];
#endif
// ottengo l’host dal nome
myHost = gethostbyname([nomeHost cStringUsingEncoding:1]);
// ricavo tutti gli indirizzi dell’host
addr_list = (struct in_addr **)myHost->h_addr_list;
for(int i = 0; addr_list[i] != NULL; i++) {
//una stampa nel terminale giusto per controllare che le informazioni siano giuste
printf("%s \n", inet_ntoa(*addr_list[i]));
mioIP = inet_ntoa(*addr_list[i]);
}
// restituisco l’ultimo indirizzo trovato
return [NSString stringWithCString:mioIP encoding:1];
}[/code]
Rapidamente possiamo richiamarla in questo modo dove ci serve la stringa con l’indirizzo:
[code lang=”obj-c”]
NSString *address = [self getAddress];
[/code]