Erreur réseau NSURLConnection

Bonjour :),


Dans mon appli, on récupère des données via un NSURLConnection asynchrone comme ceci:



[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse* response, NSData* data, NSError* error) {
// Récupération des données
}];

Le problème est que lorsque j'execute mon appli sur un appareil qui n'est pas connecté à  internet, l'appli quitte au moment d'essayer de récupérer les données.


À la place j'aimerais afficher un message d'erreur et ne pas quitter. Ma question est sûrement débile mais comment fait-on ?


 


Je pense qu'il faut vérifier la connexion avec une fonction comme celle-ci et annuler la requête:



-(BOOL)isInternetAvail
{
BOOL bRet = FALSE;
const char *hostName = [@google.com cStringUsingEncoding:NSASCIIStringEncoding];
SCNetworkConnectionFlags flags = 0;

if (SCNetworkCheckReachabilityByName(hostName, &flags) && flags > 0)
{
if (flags == kSCNetworkFlagsReachable)
{
bRet = TRUE;
}
else
{
}
}
else
{
}
return bRet;
}

Cela est-il valide ?


 


Merci beaucoup d'avance,


Flow


Réponses

  • Tu peux effectivement faire ca, une autre approche serais faire la requête et si une erreur est retourne tu peux afficher l'erreur a ce moment la. Comme tu auras sans doute d'autres erreurs et meme si SCNetworkConnection retourne qu'il y a une connection internet, il est toujours possible que la requête ne passe pas.


     


    Ce que je fais dans mes applications:


    - j'utilise Reachability (https://developer.apple.com/library/IOS/samplecode/Reachability/Introduction/Intro.html) et bloque toute requête jusqu'a ce que je reçoive la notification que le réseau est disponible


    - je regarde l'erreur qui revient dans le paramètre response et je la gère a ce moment la


     


    Olivier


     


  • Merci de ta réponse.


    Donc pour Reachability, il faudrait faire comme ça:



    self.internetReachability = [Reachability reachabilityForInternetConnection];

    [self.internetReachability startNotifier];

    [self updateInterfaceWithReachability:self.internetReachability];

    Puis on reçois la notification avec ça:



    - (void) reachabilityChanged:(NSNotification *)note

    Mais par contre je vois pas comment regarder l'erreur et bloquer la requête en attendant....


     


    Flow


  • samirsamir Membre
    juillet 2014 modifié #4

    Salut,


     


    Tout est dans la doc  :)


    https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/doc/uid/20001697-SW10


     


    + (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*,NSError*))handler .... Discussion

    If the request completes successfully, the data parameter of the handler block contains the resource data, and the error parameter is nil. If the request fails, the data parameter isnil and the error parameter contain information about the failure.



     


     


    Si ton le data dans le completionHandler est nil donc y a un problème et parmi ces problèmes il peut y avoir que le device n'est pas connecté à  internet. Donc ce cas il faut checker l'objet NSError retourné avec le code et le domain approprié et afficher le message approprié ( pas de connexion, time out, autre problème...).


     


    Un truc du genre :



    [NSURLConnection sendAsynchronousRequest:request
                                           queue:[NSOperationQueue mainQueue]
                               completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
                                  
                                   if (data) {
                                       NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error:nil];
                                       if (!jsonDict) {
                                      // Erreur avec ton parser                                       

                                       } else {
                                       // ici tout vas bien, tu peux continuer l'exécution de ton application.
                                       }
                                   }
                                   else{
                                    // La y a une erreur ( pas de connexion internet,...)

                                    if ([error code] == NSURLErrorNotConnectedToInternet)  {
                                       // Pas de connexion internet
                                    }         
                                    
                                   }
                                  
                        }];

    Lien vers les code erreur :


     


    https://developer.apple.com/library/ios/documentation/cocoa/reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference.html


  • TheFlow_TheFlow_ Membre
    juillet 2014 modifié #5

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse* response, NSData* data, NSError* error) {
    if (data == nil) {
    UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@Erreur message:[error localizedDescription] delegate:self cancelButtonTitle:@OK otherButtonTitles: nil];
    [errorAlert show];
    }
    else {
    // Requête
    }
    }];

    C'est aussi simple que ça samir ? :o


     


    Merci de ton aide ::) !


     


    EDIT: Pour les interessés, ce code fonctionne parfaitement ! Merci encore à  samir ! :D


Connectez-vous ou Inscrivez-vous pour répondre.