Eccoci con il sesto tutorial dedicati alla programmazione per iPhone/iPod Touch! Purtroppo in queste settimane non siamo riusciti a pubblicare i tutorial con la solita puntualità, vedremo di rifarci nelle prossime settimane.
Vi proponiamo oggi un piccolo tutorial, in cui creeremo un’applicazione per rilevare l’indirizzo IP del proprio iPhone/iPod Touch.
1. Creiamo un nuovo progetto
Aprimo Xcode, selezioniamo “File -> New Project”. Nel menù che ci appare selezioniamo “View-based Application”, clicchiamo su “Choose…” e inseriamo come nome “SearchIP” e fate clic su “Save”. Abbiamo così creato il nostro nuovo progetto.
Definiamo subito l’unico elemento che ci servirà, una semplice label. Aprite, quindi, il file “SearchIPViewController.h” e inserite la seguente definizione:
#import <UIKit/UIKit.h>
@interface SearchIPViewController : UIViewController {
IBOutlet UILabel *labelIP;
}
-(NSString*)getIP;
@end
Abbiamo definito una UILabel (riga 4), che conterrà l’indirizzo IP del nostro dispositivo. Abbiamo definito, inoltre, un semplice metodo “getIP”, che ci servirà per ricavare l’indirizzo IP del nostro dispositivo.
Abbiamo già concluso questa fase, salviamo e apriamo il file “SearchIPViewController.xib”.
2. Creiamo l’interfaccia grafica
Inseriamo al centro della nostra applicazione una semplice label, in modo da avere una semplicissima struttura grafica come questa:
Apriamo il “File’s Owner” dal Pannello dei documenti, dal Connections Inspector e colleghiamo l’elemento “labelIP” con la label appena inserita. Se abbiamo eseguito tutto correttamente avremo un risultato come questo:
Salviamo e chiudiamo pure Interface Builder.
3. Scriviamo il codice necessario.
Dobbiamo ora inserire il codice che si occupa di leggere l’indirizzo IP del nostro dispositivo. Aprite il file “SearchIPViewController.m” e inserite il seguente codice:
- (void)viewDidLoad {
[super viewDidLoad];
labelIP.text = [self getIP];
}
-(NSString*)getIP{
NSHost *myhost = [NSHost currentHost];
if (myhost){
return [NSString stringWithFormat:@"%@",[myhost address]];
}else{
return [NSString stringWithFormat:@"127.0.0.1"];
}
}
Nel metodo “viewDidLoad” richiamiamo la funzione “getIP”, che imposta il valore della label “labelIP”. Tale metodo ricava l’indirizzo dell’host corrente e, se non è vuoto, lo imposta nella label, altrimenti se è vuoto imposta alla label il valore 127.0.0.1, ovvero l’indirizzo di loopback.
Ecco la nostra applicazione in funzione:
Se Avete Problemi, questo è il file di progetto.
Nota 1: la prima nota che devo farvi è che purtroppo questo metodo funziona solo sul dispositivo reale, mentre non funziona sull’iPhone Simulator.
Nota 2: le istruzioni che abbiamo utilizzato sono delle API private, che quindi Apple (solitamente) non accetta nelle applicazioni. Purtroppo non ho trovato metodi alternativi, quindi se sapete un metodo diverso segnalatemelo, così provvederò a correggere il tutorial!
La guida è stata realizzata da Andrea Busi per “Bubi Devs” e “iSpazio“. Tutti i diritti sono del legittimo autore.
3 comments On DevTutorial #6 – SearchIP: come ricavare il nostro indirizzo IP del nostro iPhone
Ciao,
per prima cosa complimenti per il blog e per tutto il tuo lavoro: io ho un problema che non riesco a risolvere e che riguarda il check della disponibilità di un IP address: in sostanza ho bisogno di fa un ping su un IP address dato da utente per poi stabilire una connessione a socket (la connessione a socket è già testata e funzionante 🙂 ). Ho provato con diverse soluzioni ma la più gettonata è quella che prevede l’uso di SCNetworkReachabilityCreateWithName … Solo che a me da sempre disponibile… tu hai un suggerimento/esempio da darmi? Riepilogando: mi servirebbe una funzione che dato un IP address mi dice se è raggiungibile (con timeout…)
Grazie
@nebula_1979: ciao! sinceramente non ho niente che possa fare al caso tuo.. Nella documentazione di Apple non hai trovato niente?
grazie ugualmente… alla fine ho scoperto questo:
impostando il timeout nella socket option in modo opportuno, l’iPhone simulator non gestisce correttamente il timeout del socket (scade sempre dopo 95 secondi circa), mentre l’iPhone reale si. Inoltre nel header del simulatore manca il define del codice di timeout…
Alla fine questa è la soluzione (da chiamare prima della connessione al sockect).
//iPhone simulator actually does not handle tcp connection timeout
#if TARGET_IPHONE_SIMULATOR
#define TCP_CONNECTIONTIMEOUT 0x20 /* connection timeout */
#endif
// Set timeout value to stop hanging
struct timeval timeout;
timeout.tv_sec = timeout_ms / 1000;
timeout.tv_usec = timeout_ms % 1000;
setsockopt(socketfd, IPPROTO_TCP, TCP_CONNECTIONTIMEOUT, &timeout, sizeof(timeout));