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];
}
5 Responses to “T#017 – Ottenere l’indirizzo IP dell’iPhone/iPodTouch”
9 Dicembre 2009
PaoloCiao,
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
30 Agosto 2010
FabioUna curiosità, forse mi potrete aiutare.
Ho un sito che rileva la nazionalità di un visitatore grazie a un sistema di geolocation molto semplice, basato sull’associazione di range di ip ad aree geografiche.
Se mi collego da un’ADSL italiana mi vede come italiano, dagli Stati Uniti idem, e così via..
Secondo voi vale anche per l’iPhone? Intendo, se vado in Germania, e mi connetto a Google con l’iPhone mi redirige su http://www.google.de ?
22 Ottobre 2010
Alessandrociao,
a me interessa ottenere l’ UDID dell’iphone.
Come si può fare?
Grazie 🙂
22 Ottobre 2010
Francesco BurelliCiao, se guardi nella documentazione Apple troverai la classe UIDevice. Leggendo rapidamente penso tu possa ottenere quell’informazione eseguendo una cosa del ripo:
NSString * UDID = [[UIDevice currentDevice] uniqueIdentifier];
21 Marzo 2014
checccoVolevo ampliare il codice di cui sopra per creare uno scan network, per conoscere i dispositivi, nel caso di Lan, connessi. Sapete indicarmi come posso fare? in rete non trovo nulla sul tema.