Non dimenticare di includere avvisi di errore di rete nel tuo codice

Nella pagina App Store Submission Tips di cui già ho accennato, c’è un suggerimento particolarmente interessante:

Don’t Forget to Include Network Error Alerts in Your Code

Gli utenti, viene spiegato, gradirebbero sapere perché il contenuto di una certa parte dell’app non è disponibile. E se la ragione è la mancanza di connessione internet allora è bene mostrare un alert per avvisare l’utente.

Reachability è il codice di esempio che Apple propone come punto di partenza. Eliminando il superfluo si può fare come segue.

Nella classe in cui serve sapere se c’è rete (ad esempio in un UIViewController che contiene un UIWebView o un parser RSS), aggiungiamo il framework SystemConfiguration, importiamo nel file .h tre intestazioni:

1
2
3
#import <SystemConfiguration/SystemConfiguration.h>
#import <sys/socket.h>
#import <netinet/in.h>
#import <SystemConfiguration/SystemConfiguration.h>
#import <sys/socket.h>
#import <netinet/in.h>

definiamo una enumerazione

1
2
3
4
5
6
typedef enum
{
    NoConnection = 0,
    WiFiConnected,
    WWANConnected
} NetworkStatus;
typedef enum
{
    NoConnection = 0,
    WiFiConnected,
    WWANConnected
} NetworkStatus;

e dichiariamo un metodo:

1
-(NetworkStatus) getNetworkStatus;
-(NetworkStatus) getNetworkStatus;

Nel file .m implementiamo tale metodo come segue:

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
28
29
-(NetworkStatus) getNetworkStatus
{
    struct sockaddr_in nullAddress;
 
    bzero(&nullAddress, sizeof(nullAddress));
    nullAddress.sin_len = sizeof(nullAddress);
    nullAddress.sin_family = AF_INET;
 
    SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*) &nullAddress);
 
    SCNetworkReachabilityFlags flags;
    SCNetworkReachabilityGetFlags(ref, &flags);
 
    if (!(flags & kSCNetworkReachabilityFlagsReachable))
        return NoConnection;
 
    if (!(flags & kSCNetworkReachabilityFlagsConnectionRequired))
        return WiFiConnected;
 
    if (((flags & kSCNetworkReachabilityFlagsConnectionOnDemand) ||
         (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic)) &&
        !(flags & kSCNetworkReachabilityFlagsInterventionRequired))
        return WiFiConnected;
 
    if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
        return WWANConnected;
 
    return NoConnection;
}
-(NetworkStatus) getNetworkStatus
{
    struct sockaddr_in nullAddress;

    bzero(&nullAddress, sizeof(nullAddress));
    nullAddress.sin_len = sizeof(nullAddress);
    nullAddress.sin_family = AF_INET;

    SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*) &nullAddress);

    SCNetworkReachabilityFlags flags;
    SCNetworkReachabilityGetFlags(ref, &flags);

    if (!(flags & kSCNetworkReachabilityFlagsReachable))
        return NoConnection;

    if (!(flags & kSCNetworkReachabilityFlagsConnectionRequired))
        return WiFiConnected;

    if (((flags & kSCNetworkReachabilityFlagsConnectionOnDemand) ||
         (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic)) &&
        !(flags & kSCNetworkReachabilityFlagsInterventionRequired))
        return WiFiConnected;

    if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
        return WWANConnected;

    return NoConnection;
}

In questo modo, ogni qualvolta ci serva di conoscere lo stato della connessione potremo chiamare [self getNetworkStatus]. Per seguire il tip di Apple potremo fare così:

1
2
3
4
if ([self getNetworkStatus] == NoConnection) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Errore di caricamento", @"") message:NSLocalizedString(@"Nessuna connessione internet", @"") delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [alert show];
}
if ([self getNetworkStatus] == NoConnection) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Errore di caricamento", @"") message:NSLocalizedString(@"Nessuna connessione internet", @"") delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [alert show];
}

2 pensieri su “Non dimenticare di includere avvisi di errore di rete nel tuo codice

  1. Ragazzi grazie per la fantastica guida, ho qualche piccolo errore:
    1] non so dove mettere: ” if ([self getNetworkStatus] == NoConnection) {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@”Errore di caricamento”, @”") message:NSLocalizedString(@”Nessuna connessione internet”, @”") delegate:self cancelButtonTitle:@”OK” otherButtonTitles: nil];
    [alert show];
    }” xke quando lo metto nel .m mi dice errore
    2] come risolvo questi 3 piccoli errori –> http://d.pr/i/qy52 ?
    3] sono disposto a passare il codice via mail dato che si tratta di una semplice webview
    4] Grazie a chi mi risponderà e sopratutto cordiali saluti da iLucas e tutto lo staff di AppleLife.it :D

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code lang=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" extra="">