Vérification de la connectivité Internet dans l'objectif C

voix
15

Je travaille dans le cours de codage iPhone Stanford et d'accrochage actuellement dans l'API Twitter. Ce que je voudrais faire est gérer avec précision les deux conditions d'erreur: un lorsque le nom d'utilisateur est invalide, et un autre lorsque l'appareil n'est pas connecté à Internet. Malheureusement, tel qu'il est, le meilleur que je peux deviner est de savoir si oui ou non le retour de l'API est nulle ou non - qui est le cas pour les deux conditions.

Ce que je suis à la recherche est une ligne ou deux de code qui peut vérifier une connexion avant de tenter une des données à distance d'extraction. Je pourrais passer en revue la documentation Apple, mais je me suis dit: Pourquoi ne pas poser la question à vous les gars pour mon bénéfice et peut-être celle des autres?

Informations complémentaires: Utilisation Objective-C et l'iPhone SDK dans XCode.

Créé 25/01/2009 à 16:53
source utilisateur
Dans d'autres langues...                            


8 réponses

voix
30

Jetez un oeil à l'exemple de code d'Apple. Le projet joignabilité montre comment détecter une connexion.

http://developer.apple.com/iphone/library/samplecode/Reachability/index.html

Créé 25/01/2009 à 17:35
source utilisateur

voix
9

Ce code fonctionne, mais ne crée pas toujours le résultat souhaité.

La façon dont la pile TCP sur l'iPhone fonctionne est très différent de ce qui devrait être prévu. Avec le code « joignabilité », parfois une connexion réseau sera présent, mais ne sera pas détectée de manière fiable. Cependant, le lancement MobileSafari réessayé puis pour vérifier la connectivité avec le code « joignabilité » entraînera le résultat correct.

La façon dont je l'ai trouvé plus efficace pour déterminer la connectivité réseau est d'exécuter un contrôle de NSURLConnection lorsque les charges d'application, dans un thread séparé. Faire un appel à une URL que vous savez retourner quelque chose comme « Oui » (c.-à-fichier HTML sur votre serveur ou quelque chose). Ensuite, vérifiez pour être sûr que le résultat retourné est égal au texte statique. De cette façon, vous savez que la pile NSURLConnection atteint correctement, par opposition au code « joignabilité » qui ne fonctionne pas tout à fait cohérente.

Créé 10/05/2009 à 05:45
source utilisateur

voix
9

Vous aurez besoin de lire dans les codes d'erreur et répondre mieux que vous pouvez. J'ai eu une certaine expérience avec ce essentiellement, il peut dépendre de quel service vous interagissez avec mais avec delicious.com j'obtiens l'erreur -1012 pour un mauvais utilisateur / passwd qui, si vous regardez vers le haut est

NSURLErrorUserCancelledAuthentication =     -1012,

si bien que le libellé est trompeur, bien que je peux reproduire constamment mettre en mauvais utilisateur / passwd et obtenir ce code d'erreur. Techniquement l'iPhone est de ne jamais connecté à Internet, sauf si vous êtes dans une région étrange qui a des problèmes avec la connexion de données. Je vois aussi qu'il ya un code d'erreur

NSURLErrorNotConnectedToInternet =      -1009,

Je passe par NSURLError.h (et il y a plus comme ça)

NSURLErrorUnsupportedURL =          -1002,
NSURLErrorCannotFindHost =          -1003,
NSURLErrorCannotConnectToHost =         -1004,
NSURLErrorNetworkConnectionLost =       -1005,

etc...

tout ce que vous devez faire est d'obtenir une référence à l'objet NSError vous passé dans et vérifier son code d'erreur comme si

//NSError *returnedError

if([returnedError code] == kERROR_CODE_BAD_USERNAME_OR_PASSWORD)

la constante est quelque chose que j'ai défini dans mon propre code source qui est essentiellement -1012

Créé 25/01/2009 à 17:31
source utilisateur

voix
8

cela fonctionne pour moi et est tirée de projet xml sismique Apple:

- (BOOL)isDataSourceAvailable
{
    static BOOL checkNetwork = YES;
    if (checkNetwork) { // Since checking the reachability of a host can be expensive, cache the result and perform the reachability check once.
        checkNetwork = NO;

        Boolean success;    
        const char *host_name = "twitter.com"; // your data source host name

        SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name);
        SCNetworkReachabilityFlags flags;
        success = SCNetworkReachabilityGetFlags(reachability, &flags);
        _isDataSourceAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
        CFRelease(reachability);
    }
    return _isDataSourceAvailable;
}
Créé 26/03/2009 à 16:18
source utilisateur

voix
3

joignabilité est séparée par classe, vous pouvez accéder au code

   Reachability *curReach = [Reachability reachabilityForInternetConnection];
NetworkStatus netStatus = [curReach currentReachabilityStatus];
switch (netStatus)
{
    case NotReachable:
    {
        UIAlertView *connectionAlert = [[UIAlertView alloc] init];
        [connectionAlert setTitle:@"Error"];
        [connectionAlert setMessage:@"Please check your network connection."];
        [connectionAlert setDelegate:self];
        [connectionAlert setTag:1];
        [connectionAlert addButtonWithTitle:@"Back"];
        [connectionAlert show];

        break;
    }
    case ReachableViaWWAN:
    {


    }
    case ReachableViaWiFi:
    {
    }
}
Créé 20/08/2013 à 06:40
source utilisateur

voix
2
-(BOOL)returnInternetConnectionStatus{
    ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
    NetworkStatus internetStatus = [reach currentReachabilityStatus];
    if ((internetStatus != NotReachable)) {
        return TRUE;
    } else {
        return FALSE;
    }
}
Créé 14/08/2012 à 07:40
source utilisateur

voix
2

Lors de l'utilisation d'Apple joignabilité garder à l'esprit que vous pouvez vous retrouver être connecté via WWAN (ReachableViaWWAN) ou WiFi (ReachableViaWiFi) sans être connecté à Internet, même lorsque vous essayez d'atteindre un hôte comme google.com ou apple.com (peut-être une mise en cache problème). Je fini par appeler mon propre serveur et revenir un chiffre - la meilleure solution dans mon cas au moins.

Créé 18/05/2011 à 11:40
source utilisateur

voix
2

Quel est votre code de connexion actuel ressemble? Si vous utilisez NSURLConnection +sendSynchronousRequest:returningResponse:error:, vous avez juste besoin de passer l'adresse d'une variable NSError et vérifier que par la suite; avec connectionWithRequest:delegate:, vous devez mettre en œuvre -connection:didFailWithError:dans le délégué.

Créé 25/01/2009 à 16:59
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more