DevTutorial # 24 – Controllare le connessioni disponibili
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 una semplice applicazione
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:
1 2 3 4 5 6 7 8 9 10 | #import <UIKit/UIKit.h> @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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #import <UIKit/UIKit.h> @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):
1 2 3 4 | #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):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | -(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):
1 2 3 4 5 | - (void)dealloc { [super dealloc]; [wifiReach release]; [internetReach release]; } |
Possiamo testare la nostra applicazione cliccando su “Build and Run”.
Se Avete Problemi, questo è il nostro file di progetto.
La guida è stata creata da Andrea Busi per “Bubi Devs”, prendendo spunto dall’esempio “Reachability” di Apple.
I meriti, quindi, sono del legittimo autore e di Apple per l’esempio originale.





















23 febbraio 2010 alle 10:24
Grazie mille… Oggi mi metterò al lavoro con questo tutorial!
24 febbraio 2010 alle 15:02
grande tutorial complimenti!
24 febbraio 2010 alle 22:31
provando il tutorial ho notato che non riesce a capire se l’iphone è connesso ad uan reti cellulare infatti dice 3G = no . Sai per caso il motivo ?? Grazie.
24 febbraio 2010 alle 23:20
@Davide: davvero? io non ho iPhone e non ho provato, ma un amico ha provato e mi aveva detto che gli funzionava correttamente.. che iPhone e versione di firmware hai?
24 febbraio 2010 alle 23:24
iphone 3g e firmware 3.1.3.
in pratica riesce a capire quando è in wifi e quando è senza linea , ma quando usa una connessione dati (vodafone) mi dice che non ‘è presente nessuna connessione .
25 febbraio 2010 alle 12:50
Ciao Andrea.
Grazie mille come al solito.
So che esiste un metodo per fare pressoché la stessa cosa, ma in maniera molto più semplice, verificando l’accesso ad un sito, riempiendo una stringa con il contenuto ricevuto dal sito e controllando se risulta NULL. Ora mi chiedo quali dei due metodi sia più corretto usare ed i vari pro e contro. Ovviamente la domanda è aperta a tutti. Questo è made in Apple e quindi darebbe una certa sicurezza, anche se sembra avere qualche problema col il collegamento via telefono, ma l’altro è veramente semplice ed efficace. Unico neo potrebbe essere il down del sito di riferimento, i.e. google.
Un grazie anticipato a chi vorrà commentare. Ciao
25 febbraio 2010 alle 13:28
se commentate questa codice
wifiReach = [[Reachability reachabilityForLocalWiFi] retain];
[self check:wifiReach];
il programma funziona esattamente sia in wifi , dati cellulare/ senza connessione . Ciao.
25 febbraio 2010 alle 15:43
@FulvioX: quello che ho proposto nel tutorial mi sembra il più efficace, in quanto non si basa su nessun sito web (che come hai ben detto potrebbe essere down al momento del test della connessione).
Ovviamente possono anche essere equivalenti come metodi, quindi sta a te scegliere quale usare
@Davide: wow, grazie.. vediamo se altri riscontrano il tuo stesso problema, in tal caso correggerò il tutorial
26 febbraio 2010 alle 11:52
@Andrea Busi: OK. Era più comoda l’altra soluzione ma questa in effetti sempre più corretta. Sto provando ad utilizzarla e per ora confermo il problema segnalato da Davide. Il suo suggerimento comunque risolve il problema. Grazie ad entrambi. Ciao
PS: Piccola divagazione … Per chi è in zona … domani parte il club sviluppatori iPhone a Milano. Magari puoi segnalarlo sul sito avvisando anche DevApp. Magari ci si vede.
27 febbraio 2010 alle 11:53
@FulvioX: ok grazie mille, appena riesco provo a fare un test definitivo e poi nel caso correggo la guida
8 marzo 2010 alle 16:45
@Andrea Busi: Il problema riscontrato da Davide è dovuto al fatto che nella classe Apple i flags letti non variano nel caso di 3g on + wifi on e 3g off + wifi on. In pratica quando il wifi è on il 3G risulta sempre spento, la ReachableViaWWAN non viene utilizzata e non è quindi possibile verificare lo stato del 3g.
Sperando di non aver detto stupidate lascio a voi esperti il commento ad un tale comportamento. Ciao
8 marzo 2010 alle 17:38
@Andrea Busi: Aggiungo … Penso la questione stia in questi termini … la ReachableViaWWAN non identifica la connessione telefonica ma indistintamente questa o quella WIFI. Da qui l’impossibilità di capire se stiamo utilizzando il 3G o il WIFI. Differentemente la ReachableViaWiFi segnala solo lo stato del WIFI. Spero di essere contraddetto ma mi sa che le cose stanno così. Ciao
30 aprile 2010 alle 14:17
ciao andrea,
complimenti per il lavoro pero’ una critica te la devo fare, perché mi ha incoraggiato a considerare di poca attendibilità il tutorial.
Chi legge questo tutorial si aspetta che il frutto dell’insegnamento che l’autore si propone di dare provenga una comprovata esperienza su quello che stai dicendo. E’ quindi inaccettabile, secondo il mio parere, pubblicare e dare per buono qualcosa che manco si è provato o che ha provato un amico.
@Davide: davvero? io non ho iPhone e non ho provato, ma un amico ha provato e mi aveva detto che gli funzionava correttamente.. che iPhone e versione di firmware hai?
spero che questa critica venga letta e compresa nel verso giusto e che sia spunto per un miglioramento.
un saluto.
Andrea
30 aprile 2010 alle 21:07
@Andrea: ciao, le critiche (costruttive) sono sempre ben accette..
io ho pubblicato questo tutorial dopo averlo fatto testare ad un paio di persone, che mi avevano confermato che funzionava correttamente..
la classe, inoltre, non è presa a caso, ma è stata fatta da Apple stessa, quindi si potrebbe anche pubblicare ad occhi chiusi
ovviamente tutti i tutorial li ho sempre testati, così come tutte le guide