T#017 – Ottenere l’indirizzo IP dell’iPhone/iPodTouch
Nella documentazione Apple non ci sono delle API specifiche per ottenere l’indirizzo IP dell’iPhone o iPodTouch, ma cercando su Google si può trovare un metodo, un po’ scorretto, ma funzionante. L’autore usa la classe NSHost per ricavarne gli indirizzi, ma questa, come da documentazione, può essere usata teoricamente solo per le applicazioni Mac e non per iPhone.
Indispettito da ciò ho cercato un metodo più “legale”: ho usato funzioni di più basso livello che sono incluse nelle librerie <netdb.h> e <arpa/inet.h>.
In queste librerie la funzione “chiave” è “gethostbyname(const char *name)” che restituisce una struttura contente tutte le informazioni della nostra macchina. Per trovare il nome del nostro host basti guardare nella documentazione che, sotto la classe NSProcessInfo, riporta un metodo per ottenere il nome dell’host appunto. Il nome, però, non è completo: manca della parte finale “.local” che informa della sua appartenenza alla rete locale.
Di seguito il codice del metodo:
-(NSString *)ottieniIP { // dichiaro le variabili che mi rerviranno struct hostent *myHost; struct in_addr **addr_list; char *mioIP; // ottengo il nome dell'host ovvero del dispositivo in rete NSString *nomeHost = [[NSProcessInfo processInfo] hostName]; // aggiungo ".local" poichè indica la rete locale nomeHost = [nomeHost stringByAppendingFormat:@".local"]; // ottengo l'host 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++) { 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]; }

















Ciao,
post interessante. Volevo segnalare solamente che l’aggiunta del ‘.local’ va fatta solo se tale codice viene usato sul dispositivo. Per il simulatore l’aggiunta non è necessaria (Xcode 3.1.4). Occorre racchiudere la riga di codice relativa all’interno di un #if .. #endif come segue:
#if !(TARGET_IPHONE_SIMULATOR)
nomeHost = [nomeHost stringByAppendingFormat:@".local"];
#endif