Trovare l’indirizzo IP del dispositivo iPhone, iPod Touch o iPad

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.

trova indirizzo ip ios

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]