Domanda

Quando i miei lanci di app, posso controllare per raggiungibilità perché ho bisogno di una connessione ad internet immediato. Il mio problema, però, è che sembra ci sia alcuna conferma immediata per l'NetworkStatus, il che significa che subito dopo la raggiungibilità è messa a punto, a verificare se ci sia una connessione, e restituisce che non c'è, indipendentemente dal fatto che io sono in realtà su Wi-Fi / 3G, o hanno trasformato la radio.

Posso confermare che sono in realtà ottenere una connessione a Internet, perché immediatamente dopo applicationDidFinishLaunching, c'è una notifica che poi registra "ReachableViaWiFi" ..

Che cosa sto facendo di sbagliato? Perché non è la conferma di una connessione a Internet valida subito?

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    NetworkStatus netStatus = [hostReach currentReachabilityStatus];
    if (netStatus == NotReachable) {
        ErrorViewController *errorViewController = [[ErrorViewController alloc] initWithNibName:@"ErrorView" bundle:[NSBundle mainBundle]];
        [tabBarController.view removeFromSuperview];
        [window addSubview:[errorViewController view]];
        return;
    }
}

-(void)setupReachability {
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name:kReachabilityChangedNotification object: nil];
    hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain];
    [hostReach startNotifier];
}

-(void)reachabilityChanged:(NSNotification *)notification {
    Reachability* curReach = [notification object];
    NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
    NetworkStatus netStatus = [curReach currentReachabilityStatus];
    BOOL connectionRequired = [curReach connectionRequired];
    switch (netStatus)
    {
        case NotReachable:
        {
            [[NSUserDefaults standardUserDefaults] setInteger:kNOTREACHABLE forKey:kREACHABILITYSTATUS];
            NSLog(@"NotReachable");
            connectionRequired = NO;  
            break;
        }

        case ReachableViaWWAN:
        {
            [[NSUserDefaults standardUserDefaults] setInteger:kREACHABLEVIAWWAN forKey:kREACHABILITYSTATUS];
            NSLog(@"ReachableViaWWAN");
            break;
        }
        case ReachableViaWiFi:
        {
            [[NSUserDefaults standardUserDefaults] setInteger:kNOTREACHABLE forKey:kREACHABILITYSTATUS];
            NSLog(@"ReachableViaWiFi");
            break;
        }
    }
}
È stato utile?

Soluzione

OK, quindi dopo aver provato un paio di cose fuori io stesso, in realtà ho preso a lavorare, con l'aggiunta di una riga in più di codice:

-(void)setupReachability {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotificationV2 object:nil];
    hostReach = [[ReachabilityV2 reachabilityWithHostName:@"www.google.com"] retain];
    [hostReach connectionRequired]; // this line was added, and apparently forces a connection requirement..
    [hostReach startNotifier];
}

Altri suggerimenti

Il codice di esempio raggiungibilità fornisce callback asincroni / notifiche per informarti di come / quando la raggiungibilità è cambiato. Affinché il codice funzioni, è necessario modificare il codice come segue:

- (void) applicationDidFinishLaunching:(UIApplication *)application {

 // setup reachability
    [self setupReachability];
 }

Poi, nel tuo richiamata, quando si ottiene la notifica di reagire come necessario per la vostra applicazione.

In altre parole, non si può verificare subito per lo stato della rete in applicationDidFinishLaunching(). Se si vuole fare così, allora è necessario utilizzare un metodo sincrono / blocco, per esempio, è possibile utilizzare il codice fornito nella mia risposta al questa domanda .

Devi fare hostReach come variabile livello di classe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top