Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reachability sometimes fails, even when we do have an internet connection

I've searched but can't see a similar question.

I've added a method to check for an internet connection per the Reachability example. It works most of the time, but when installed on the iPhone, it quite often fails even when I do have internet connectivity (only when on 3G/EDGE - WiFi is OK).

Basically the code below returns NO.

If I switch to another app, say Mail or Safari, and connect, then switch back to the app, then the code says the internet is reachable. Kinda seems like it needs a 'nudge'.

Anyone seen this before? Any ideas?

Many thanks James

+ (BOOL) doWeHaveInternetConnection{

BOOL success;
// google should always be up right?!
const char *host_name = [@"google.com" cStringUsingEncoding:NSASCIIStringEncoding];

SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL,
                                                                            host_name);
SCNetworkReachabilityFlags flags;
success = SCNetworkReachabilityGetFlags(reachability, &flags);
BOOL isAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);

if (isAvailable) {
    NSLog(@"Google is reachable: %d", flags);
}else{
    NSLog(@"Google is unreachable");
}

return isAvailable;

}

like image 360
stoutyhk Avatar asked Aug 15 '09 05:08

stoutyhk


1 Answers

Looks like you've stripped out some basic reachability code from the Apple example code. What happens when you leave it intact and do this?

Reachability *hostReach = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain];

NetworkStatus netStatus = [hostReach currentReachabilityStatus];

if (netStatus == NotReachable)
{
    NSLog(@"NotReachable");
}

if (netStatus == ReachableViaWiFi)
{
    NSLog(@"ReachableViaWiFi");
}

if (netStatus == ReachableViaWWAN)
{
    NSLog(@"ReachableViaWWAN");
}
like image 124
Matt Long Avatar answered Nov 16 '22 03:11

Matt Long