Eccoci con un nuovo tutorial dedicato alla programmazione per iPhone SDK. In questo appuntamento vedremo come controllare le connessioni disponibili nel nostro dispositivo, operazione molto importante in tutte le applicazioni che devono accedere, per qualsiasi motivo, alla rete. Vedremo come utilizzare la classe “Reachability” (messa a disposizione da Apple), per testare se è attiva una connessione WiFi o 3G. Piccola nota, in questo tutorial parleremo sempre di connessione 3G, sarebbe più corretto parlare di connessione dati (potrebbe essere anche una semplice connessione EDGE), ma per semplicità utilizzeremo sempre la dicitura 3G. Buon tutorial a tutti allora!
1. Creiamo il nostro progetto
In questo tutorial l’aspetto grafico dell’applicazione non sarà rilevante, infatti servirà solo per mostrare le connessioni disponibili. Iniziamo creando un nuovo progetto di tipo “View-based Application” e chiamiamolo “ControllaConnessioni”.

Apriamo il file “ControllaConnessioniViewController.h” e definiamo i seguenti oggetti:
#import
@interface ControllaConnessioniViewController : UIViewController {
IBOutlet UILabel *labelWifi;
IBOutlet UILabel *label3g;
}
-(IBAction)eseguiControllo;
@end
Abbiamo definito due UILabel e un’azione IBAction, che andremo poi a collegare con degli oggetti che inseriremo in Interface Builder.
Salviamo il file e apriamo “ControllaConnessioniViewController.xib”. Definiamo una struttura a nostro piacere, l’importante è che ci siano due label (una per la connessione WiFi e una per quella 3G) e un bottone, che dovrà avviare il controllo delle connessioni. Ecco come ho impostato io l’aspetto grafico:

Selezioniamo il “File’s Owner” e dal pannello “Connections Inspector” colleghiamo “labelWifi” e “label3g” con le rispettive label, mentre associate l’azione “eseguiControllo” con il bottone. Se avete eseguito tutto correttamente avrete un pannello come questo:

Possiamo salvare e chiudere Interface Builder.
2. Aggiungiamo la classe “Reachability”
Dobbiamo ora scaricare la classe “Reachability” messa a disposizione da Apple e inserirla nel nostro progetto. Scaricate l’esempio “Reachability” presente nel Developer Connections (link diretto). Estratelo e copiate i due file “Reachability.h” e “Reachability.m” all’interno del vostro progetto:

Inserite, poi, la spunta a “Copy items into destination group’s folder” e cliccate su “Add”.

Se avete eseguito correttamente questa operazione troverete la classe “Reachability” all’interno del vostro progetto:

Dobbiamo infine inserire un framework in modo che la classe funzioni correttamente. Cliccate con il tasto destro su “Frameworks” e scegliete “Add -> Existing Frameworks…”. Dal menù che vi apparirà scegliete poi “SystemConfiguration.framework”:
Cliccate infine su “Add” per importare nel vostro progetto questo framework.
3. Scriviamo il codice che controlla le connessioni
Dobbiamo ora scrivere il codice che controlla le connessioni presenti. Apriamo il file “ControllaConnessioniViewController.h” e modifichiamo così il codice già presente:
#import
@class Reachability;
@interface ControllaConnessioniViewController : UIViewController {
IBOutlet UILabel *labelWifi;
IBOutlet UILabel *label3g;
Reachability* internetReach;
Reachability* wifiReach;
}
-(IBAction)eseguiControllo;
-(void)check:(Reachability*) curReach;
@end
Vediamo le modifiche apportare. Alla riga 3 abbiamo definito l’utilizzo della classe “Reachability”, questa istruzione ci permette di evitare l’importazione della classe, che poi faremo successivamente. Alle righe 9 e 10 abbiamo definito due oggetti, che avranno il compito di eseguire i test sulle connessioni. Abbiamo, infine, definito un nuovo metodo, “check: curReach”, che servirà per il test delle connessioni.
Possiamo salvare questo file e passare a “ControllaConnessioniViewController.m”. Per prima cosa importiamo la libreria “Reachability”, semplicemente inserendo questa importazione (riga 2):
#import "ControllaConnessioniViewController.h"
#import "Reachability.h"
@implementation ControllaConnessioniViewController
Ora dobbiamo scrivere il codice che controlla effettivamente le connessioni. Inserite, quindi, i seguenti due metodi (di cui abbiamo definito le intestazioni prima):
-(IBAction)eseguiControllo {
internetReach = [[Reachability reachabilityForInternetConnection] retain];
[self check:internetReach];
wifiReach = [[Reachability reachabilityForLocalWiFi] retain];
[self check:wifiReach];
}
-(void)check:(Reachability*) curReach{
NetworkStatus netStatus = [curReach currentReachabilityStatus];
switch (netStatus){
case NotReachable:{
label3g.text = @"No";
labelWifi.text = @"No";
break;
}
case ReachableViaWWAN:{
label3g.text = @"Si";
break;
}
case ReachableViaWiFi:{
labelWifi.text = @"Si";
break;
}
}
}
Vediamo come funzionano i due metodi. “eseguiControllo” inizializza i due oggetti di tipo “Reachability” (righe 2 e 5), che vengono, uno alla volta, passati al metodo “check”. Questo ne esamina lo stato: se è disponibile la connessione in questione (quindi WiFi o 3G) entra nel caso della struttura switch predisposta (riga 12) e varia la label della connessione. Se invece non sono presenti le connessioni vengono settate entrambe le label a “No”.
Concludiamo implementando il metodo “dealloc”, che vi ricordo essere molto importante (soprattutto nelle applicazioni complesse):
- (void)dealloc {
[wifiReach release];
[internetReach release];
[super dealloc];
}
Possiamo testare la nostra applicazione cliccando su “Build and Run”.

Se avete problemi con il tutorial, questo è il nostro file di progetto.
La guida è stata creata da Andrea Busi per “devAPP’, prendendo spunto dall’esempio”Reachability” di Apple.
I meriti, quindi, sono del legittimo autore e di Apple per l’esempio originale.









14 Responses to “T#070 – Controllare le connessioni disponibili nelle nostre applicazioni iPhone”
13 Settembre 2010
Tweets that mention Controllare le connessioni disponibili nelle nostre applicazioni iPhone | devAPP -- Topsy.com[…] This post was mentioned on Twitter by devAPP, Bubi Devs. Bubi Devs said: T#070 – Controllare le connessioni disponibili nelle nostre applicazioni iPhone: Eccoci con un nuovo tutorial dedi… http://bit.ly/ahcLNK […]
14 Settembre 2010
MuffaVorrei farti una piccola osservazione: cosa succede se il tuo dispositivo dispone della connessione 3G/Edge ma non di quella WiFi? 🙂
Te lo anticipo: entrambe le label mostreranno la stringa “No”, perchè la seconda chiamata al metodo check reimposterebbe anche la label che mostra lo stato del 3G.
Comunque un’articolo decisamente utile a chi si sta avvicinando alla gestione del network. Complimenti. 😉
15 Settembre 2010
Andrea Busiciao, la cosa non mi risulta, perchè le due label dovrebbero essere resettate solo se non è disponibile nessuna connessione..
domani eseguo delle prove in 3G e WiFi, così controllo se funziona correttamente 😉
16 Settembre 2010
SpaccaSolo una nota in merito al metodo dealloc.
[super dealloc] e’ bene chiamarlo alla fine, no prima. (Secondo le istruzioni Apple).
Se lo chiami prima rischi di perdere i riferimenti agli oggetti che devono essere rilasciati, il cui causa un EXC_BAD_ACCESS quando cerchi di ridurre il retain count di quelli oggetti.
Ci sono eccezioni, ma sono rare.
1 Ottobre 2010
Andrea Busihai assolutamente ragione, correggo subito 😉
grazie della precisazione..
4 Ottobre 2010
mat88Comunque ha ragione Muffa, se c’è il 3G e non c’è il WiFi il risultato è nessuna delle 2 connessioni, io ho risolto impostando (nel mio caso uso una variabile al posto delle label) a monte la variabile a “nessuna connessione” e cancellando dallo “switch” il “case NotReachable”
5 Gennaio 2011
salvoma si deve anche importare qualche framework?
Solo caricando le classi Rechability, senza aggiungere altro, mi mostra alcuni errori (6) dicendo alla fine “symbols not found”…
5 Gennaio 2011
salvotrovato: mancava SystemConfiguration Framework…
grazie
6 Gennaio 2011
salvoho fatto delle prove: se ho solo 3G (Vodafone, per la precisione) e wifi disabilitato è come se non vedesse ReachableViaWWAN.
Cosa sbaglio?
Se c’è wi-fi sembra tutto ok, e anche se non c’è connessione…
ReachableViaWWAN non dovrebbe controllare anche il 3G?
6 Gennaio 2011
salvook, dopo aver fatto varie prove da me funziona solo mettendo wifiReach prima di internetReach, altrimenti la scritta “3G on” non appare mai (come ReachableViaWWAN non venisse eseguita…)
Quasi perfetto: manca solo di fare apparire insieme (ammesso che sia possibile) 3G on – Wifi on
Il codice è qualcosa come:
[code]-(IBAction) controllaConnessione {
label3G.text = @””;
labelWifi.text = @””;
wifiReach = [[Reachability reachabilityForLocalWiFi] retain];
[self check:wifiReach];
internetReach = [[Reachability reachabilityForInternetConnection] retain];
[self check:internetReach];
if ((label3G.text==@””) && (labelWifi.text==@””)) {
labelWifi.text = @”Connessione assente”;
labelWifi.textColor = [UIColor redColor];
}
}
-(void)check:(Reachability*) curReach{
NetworkStatus netStatus = [curReach currentReachabilityStatus];
switch (netStatus){
case NotReachable:{
label3G.text = @””;
labelWifi.text = @””;
labelWifi.textColor = [UIColor redColor];
break;
}
case ReachableViaWiFi:{
labelWifi.text = @”Wifi on”;
labelWifi.textColor = [UIColor greenColor];
break;
}
case ReachableViaWWAN:{
label3G.text = @”3G on”;
label3G.textColor = [UIColor greenColor];
break;
}
}
}[code]
16 Febbraio 2011
spiazziCiao,
vedo che alcune app a fronte della mancanza della connessione internet rimandano alla pagina di impostazione della rete.
Come si riesce ad aprire le impostazioni?
9 Agosto 2011
seleanche a me fa così… qualcuno me lo sa spiegare??
6 Settembre 2011
SmarambaCiao a tutti,
credo di avere il vostro stesso problema, ho inserito un alert alla richiesta NotReach, ma l’alert mi esce sempre se non sono accesi contemporaneamente il Wi-Fi e il 3g….la cosa strana è che l’alert non esce se il Wifi è acceso mentre il 3g no…eppure non ho inserito nessun if.
Qualcuno ha qualche dritta?qualche variabile?
Grazie
7 Aprile 2013
DevTutorial # 24 – Controllare le connessioni disponibili - Bubi Devs[…] Leggi il tutorial completo su devAPP […]