Search code examples
iosobjective-creachability

Reachability return ReachableViaWiFi when connected to 3G


In iPhone 5S WiFi detected as 3G and in my iPhone 4 it's normal. Both in iOS 7.1.

In some devices it happens as well.

WiFi disabled and 3G connected, I double checked to see if internet connection is ok and indeed it's ok in device itself.

Any idea why?

Edit 1:

Code below:

- (void)registerReachabilityNotification
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(checkNetworkStatus:)
                                                 name:kReachabilityChangedNotification object:nil];

    Reachability *reach = [Reachability reachabilityForInternetConnection];
    [reach startNotifier];

    NSNotification *note = [[NSNotification alloc] initWithName:kReachabilityChangedNotification object:reach userInfo:nil];
    [self checkNetworkStatus:note];
}

- (void)checkNetworkStatus:(NSNotification*)notification
{
    Reachability *reach = notification.object;
    NSParameterAssert([reach isKindOfClass: [Reachability class]]);

    NetworkStatus internetStatus = [reach currentReachabilityStatus];
    switch (internetStatus)
    {
        case NotReachable:
        {
            NSLog(@"No internet connection.");
            break;
        }
        case ReachableViaWiFi:
        {
            NSLog(@"The internet is working via WIFI.");
            break;
        }
        case ReachableViaWWAN:
        {
            NSLog(@"The internet is working via WWAN.");
            break;
        }
    }
}

Edit 1:

This code:

NetworkStatus nStats = [[Reachability reachabilityForLocalWiFi] currentReachabilityStatus];

    if (nStats != ReachableViaWiFi) {
        NSLog(@"nStats != ReachableViaWiFi");
    }

    if (nStats == ReachableViaWiFi) {
        NSLog(@"WIFI");
    }
    else if (nStats == ReachableViaWWAN) {
        NSLog(@"WWAN");
    }
    else if (nStats == NotReachable) {
        NSLog(@"not reachable");
    }
    else {
        NSLog(@"undetermined reachability.");
    }

Give me this:

Reachability Flag Status: WR t------ localWiFiStatusForFlags
nStats != ReachableViaWiFi
not reachable

Solution

  • My method was completely wrong, below code for correct way:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        NSLog(@"CONNECTION: %@", NSStringFromNetworkStatus([MobileControlHandler checkConnection]));
        return YES;
    }
    
    + (NetworkStatus)checkConnection
    {
        NetworkStatus wifiStatus = [[Reachability reachabilityForLocalWiFi] currentReachabilityStatus];
        NetworkStatus internetStatus = [[Reachability reachabilityForInternetConnection] currentReachabilityStatus];
    
        if (wifiStatus == ReachableViaWiFi) {
            return ReachableViaWiFi;
        }
        else if (wifiStatus != ReachableViaWiFi && internetStatus == ReachableViaWWAN) {
            return ReachableViaWWAN;
        }
        else {
            return NotReachable;
        }
    }
    
    FOUNDATION_EXPORT NSString *NSStringFromNetworkStatus(NetworkStatus netStatus)
    {
        if (netStatus == ReachableViaWiFi) {
            return @"ReachableViaWiFi";
        } else if (netStatus == ReachableViaWWAN) {
            return @"ReachableViaWWAN";
        } else if (netStatus == NotReachable) {
            return @"NotReachable";
        } else {
            return @"Undetermined reachbility flag";
        }
    }
    

    Plot:

    Reachability Flag Status: WR t------ localWiFiStatusForFlags
    Reachability Flag Status: WR t----l- networkStatusForFlags
    CONNECTION: ReachableViaWWAN