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.
#import <netdb.h> #import <arpa/inet.h>
poi spostiamoci nel file di implementazione .m ed inseriamo la funzione
-(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]; }
Rapidamente possiamo richiamarla in questo modo dove ci serve la stringa con l’indirizzo:
NSString *address = [self getAddress];