Question

Mon application iPhone est assez simple avec un point de vue que tout les poignées, en échec viewDidLoad I si nous avons une connexion Internet et si nous nous chargeons du web et sinon on charge à partir d'une ressource locale. Et ce beau des travaux.

//in viewDidOnload    
[[NSNotificationCenter defaultCenter] addObserver:self 
                                          selector:@selector(handleNetworkChange:) 
                                          name:kReachabilityChangedNotification object:nil];
reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
NetworkStatus status = [reachability currentReachabilityStatus];

if (status == NotReachable) {
    //Do something offline
} else {
    //Do sometihng on line
}

- (void)handleNetworkChange:(NSNotification *)notice{
 NetworkStatus status = [reachability currentReachabilityStatus];
 if (status == NotReachable) {
  //Change to offline Message
 } else {
  //Relaunch online application
 }

}

Pour tester mon événement handleNetworkChange j'éteint toutes les données cellulaires, mais quitté le wifi sur. À portée du wifi j'ai commencé l'application et tout fonctionne parfaitement. Ensuite, je marche en dehors de la gamme du wifi, mais mon handleNetworkChange jamais feu (testé à l'aide d'un UIAlertView). Debout à l'extérieur des années wifi couvre mes app lance le message hors-ligne très bien.

Je soupçonne qu'il ya un problème avec le cycle de vie du ViewController, ce code doit être placé dans la fonction AppDelegate? Peut-être qui est une meilleure conception pour commencer.

Était-ce utile?

La solution

Il se trouve que c'était un problème de gestion de la mémoire, alors que je ne conserve pas la variable joignabilité, donc dès qu'il sortirait de la portée dealloc serait appelé et qui a appelé la méthode stopNotifier. Donc aucune mise à jour que je marcherais hors de portée.

Ainsi, au lieu de:

reachability = [Reachability reachabilityForInternetConnection];

Je ne

reachability = [[Reachability reachabilityForInternetConnection] retain];

et tout fonctionne!

Une fraîche que j'ai appris à travers tout cela est que vous pouvez simuler une perte de connexion dans le simulateur par l'aéroport ÉTEINDRE simplement. Plus besoin de se promener à l'extérieur. :)

Autres conseils

Jetez un oeil à l'exemple de joignabilité d'Apple. Je crois qu'ils commencent leurs notifications dans le AppDelegate. Dans l'une de mes applications, j'ai créé une variable booléenne qui est constamment mis à jour par la méthode de mise à jour de la connectivité AppDelegate donc dans mes autres contrôleurs de vue, j'ai juste besoin d'appeler le délégué et vérifier la valeur de la bool IsConnected.

Juste par une autre pensée ici ... J'ai remarqué des problèmes avec la classe joignabilité dans laquelle il peut geler votre application lorsque votre contrôle pour joignabilité. Dans mes nouvelles applications, je saute la classe et tout à fait joignabilité relais plutôt sur les méthodes de délégué DidFail pour NSURLConnection et UIWebView pour déterminer si j'ai une véritable connectivité. Je n'ai plus d'attendre la classe joignabilité pour le comprendre et ne parviennent pas à moi de décider ensuite ce qu'il faut faire, je procède simplement à l'appel Web et utiliser le local comme un retour à l'automne.

Hope this helps !!

Vous devez inclure systemconfiguration.framework pour votre projet.

Votre application ne fonctionne pas en arrière-plan.

S'il vous plaît ajouter cette méthode dans votre délégué de classe

- (void)applicationDidEnterBackground:(UIApplication *)application
{ UIApplication* app = [UIApplication sharedApplication];

    UIBackgroundTaskIdentifier __block bgTask = [app beginBackgroundTaskWithExpirationHandler: ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [app endBackgroundTask:bgTask];
            bgTask = UIBackgroundTaskInvalid;
        });
    }];

}

Merci

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top