Reputation: 4722
I am facing weird problem on iPhone 5 with iOS 7, i have tested same code with other devices like iPad1, 2, 3 and iPhone 4, 4s etc. with different iOS combination including iOS 7.
Problem :
When i turn on airplane mode i do get reachability notification as expected with status NotReachable
but immediately after that app receives notification with status code ReachableViaWWAN
which is not expected.
Code :
+(BOOL)checkReachability
{
Reachability* internetReachable = [Reachability reachabilityForInternetConnection];
NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
switch (internetStatus)
{
case NotReachable:
{
DebugLog(@"The internet is down.");
return NO;
break;
}
default:
return YES;
break;
}
return YES;
}
I added log before switch which is returning status as ReachableViaWWAN
in airplane mode..
Possible workaround could be:
Add case for ReachableViaWWAN
and check host reachable in that case. And return BOOL value accordingly.
Anyone faced similar problem ?? i have searched but haven't found similar scenario.
Thanks in advance !!
Upvotes: 5
Views: 6608
Reputation: 3053
- (void)handleReachability:(Reachability *)reachability
{
NetworkStatus netStatus = [reachability currentReachabilityStatus];
BOOL connectionRequired = [reachability connectionRequired];
NSString* statusString = @"";
switch (netStatus)
{
case NotReachable:
{
if (connectionRequired) {
[TSMessage setDefaultViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
[TSMessage showNotificationWithTitle:NSLocalizedString(@"Something failed", nil)
subtitle:NSLocalizedString(@"The internet connection seems to be down. Please check that!", nil)
type:TSMessageNotificationTypeError];
}
connectionRequired = NO;
break;
}
default:
break;
}
}
Upvotes: 0
Reputation: 176
Reachability classes can give strange results if you are using the Network Link Conditioner tool provided by Apple.
Upvotes: 0
Reputation: 12503
The old Reachability files are no good. Apple has updated their reachability files.
Check here.
https://developer.apple.com/Library/ios/samplecode/Reachability/Introduction/Intro.html
Download here.
https://developer.apple.com/Library/ios/samplecode/Reachability/Reachability.zip
Upvotes: 2
Reputation: 101
I had the same problem. The solution is to check the flag isConnectionRequired. The documentation says:
WWAN may be available, but not active until a connection has been established.
BOOL isServerAvailable;
Reachability *reachability = [Reachability reachabilityForInternetConnection];
if ((reachability.isConnectionRequired) || (NotReachable == reachability.currentReachabilityStatus)) {
isServerAvailable = NO;
} else if((ReachableViaWiFi == reachability.currentReachabilityStatus) || (ReachableViaWWAN == reachability.currentReachabilityStatus)){
isServerAvailable = YES;
}
Upvotes: 10
Reputation: 157
I encountered this problem and found a solution here. Basically for some reason it's possible to get ReachableViaWWAN
even when in airplane mode. However, there's another flag that will indicate whether a connection must first be established. This is the kSCNetworkReachabilityFlagsConnectionRequired
flag which has a nice helper method in the Reachability class called connectionRequired
Upvotes: 1