I am trying hard to get the authentic internet connectivity status. I have used Apple\'s Reachability but it\'s only giving me the status of wifi connectivity i.e. not covering
According to Reachability it checks for not only wifi but also for WWAN/3G and no internet access, why do you think it does not check other than WIFI?
typedef enum {
NotReachable = 0,
ReachableViaWiFi,
ReachableViaWWAN
} NetworkStatus;
if you want to check the reachability to a particular host then you could set the host yourself like this
Reachability *hostReach = [Reachability reachabilityWithHostName: @"www.google.com"];
NetworkStatus netStatus = [hostReach currentReachabilityStatus];
switch (netStatus)
{
case ReachableViaWWAN:
{
NSLog(@"WWAN/3G");
break;
}
case ReachableViaWiFi:
{
NSLog(@"WIFI");
break;
}
case NotReachable:
{
NSLog(@"NO Internet");
break;
}
}
See Jordan's Answer. There is a stupid bug in Apple's official Reachability.m. The type for returnValue should be "NetworkStatus" instead of "BOOL":
- (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags
{
...
NetworkStatus returnValue = NotReachable;
...
}
Otherwise, you end up with the following terrible consequences:
Can't believe Apple never bothered to fix this.
(P.S. New to stack overflow and have no reps to upvote Jordan)
I was getting too the Wifi flag even with it disconnected. There is a bug in the Reachability.m method:
- (NetworkStatus)networkStatusForFlags:(SCNetworkReachabilityFlags)flags
it uses a BOOL as return value, but it assigns to it the values of a struct with 3 values:
typedef enum : NSInteger {
NotReachable = 0,
ReachableViaWiFi,
ReachableViaWWAN
} NetworkStatus;
So if whether Wifi or Cellular are available, it will ReachableViaWiFi (as a BOOL can be 0 or 1, but not two)
To fix it, just change in the method above this:
BOOL returnValue = NotReachable;
For this:
int returnValue = NotReachable;
And you're good to go. Hope it helps.