1413

I would like to check to see if I have an Internet connection on iOS using the Cocoa Touch libraries or on macOS using the Cocoa libraries.

I came up with a way to do this using an NSURL. The way I did it seems a bit unreliable (because even Google could one day be down and relying on a third party seems bad), and while I could check to see for a response from some other websites if Google didn't respond, it does seem wasteful and an unnecessary overhead on my application.

- (BOOL)connectedToInternet {
 NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
 return ( URLString != NULL ) ? YES : NO;
}

Is what I have done bad, (not to mention stringWithContentsOfURL is deprecated in iOS 3.0 and macOS 10.4) and if so, what is a better way to accomplish this?

Arasuvel
3,0121 gold badge29 silver badges42 bronze badges
asked Jul 5, 2009 at 8:45
9
  • 12
    Rather return (BOOL)URLString;, or even better, return !!URLString or return URLString != nil Commented Jun 24, 2012 at 20:48
  • 3
    I don't know what your use case is, but if you can it's preferable to try the request and handle any errors such as a lack of connection that arise. If you can't do this, then there's plenty of good advice here in this case. Commented Jul 1, 2013 at 5:06
  • 2
    Your solution is clever, and I prefer it. You can also use NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"https://twitter.com/getibox"] encoding:NSUTF8StringEncoding error:nil]; To get rid of the annoying warning. Commented Oct 29, 2013 at 16:56
  • 4
    try using Reachability class from the below link, it will work for you github.com/tonymillion/Reachability Commented Jan 1, 2014 at 12:11
  • 4
    For those recently finding this answer: stackoverflow.com/a/8813279 Commented Apr 17, 2014 at 20:16

39 Answers 39

1
2
1322

Important: This check should always be performed asynchronously. The majority of answers below are synchronous so be careful otherwise you'll freeze up your app.


Swift

  1. Install via CocoaPods or Carthage: https://github.com/ashleymills/Reachability.swift

  2. Test reachability via closures

    let reachability = Reachability()!
    reachability.whenReachable = { reachability in
     if reachability.connection == .wifi {
     print("Reachable via WiFi")
     } else {
     print("Reachable via Cellular")
     }
    }
    reachability.whenUnreachable = { _ in
     print("Not reachable")
    }
    do {
     try reachability.startNotifier()
    } catch {
     print("Unable to start notifier")
    }
    

Objective-C

  1. Add SystemConfiguration framework to the project but don't worry about including it anywhere

  2. Add Tony Million's version of Reachability.h and Reachability.m to the project (found here: https://github.com/tonymillion/Reachability)

  3. Update the interface section

    #import "Reachability.h"
    // Add this to the interface in the .m file of your view controller
    @interface MyViewController ()
    {
     Reachability *internetReachableFoo;
    }
    @end
    
  4. Then implement this method in the .m file of your view controller which you can call

    // Checks if we have an internet connection or not
    - (void)testInternetConnection
    {
     internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];
     // Internet is reachable
     internetReachableFoo.reachableBlock = ^(Reachability*reach)
     {
     // Update the UI on the main thread
     dispatch_async(dispatch_get_main_queue(), ^{
     NSLog(@"Yayyy, we have the interwebs!");
     });
     };
     // Internet is not reachable
     internetReachableFoo.unreachableBlock = ^(Reachability*reach)
     {
     // Update the UI on the main thread
     dispatch_async(dispatch_get_main_queue(), ^{
     NSLog(@"Someone broke the internet :(");
     });
     };
     [internetReachableFoo startNotifier];
    }
    

Important Note: The Reachability class is one of the most used classes in projects so you might run into naming conflicts with other projects. If this happens, you'll have to rename one of the pairs of Reachability.h and Reachability.m files to something else to resolve the issue.

Note: The domain you use doesn't matter. It's just testing for a gateway to any domain.

Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Aug 29, 2010 at 23:58
Sign up to request clarification or add additional context in comments.

18 Comments

When they talk about the host being reachable, they are actually talking about whether or not a gateway to the host is reachable or not. They don't mean to say that "google.com" or "apple.com" is available, but moreso that a means of getting there is available.
@gonzobrains: The domain you use doesn't matter. It's just testing for a gateway to any domain.
Oh, btw you need to add SystemConfiguration.framework to the project as well (for method 1).
Use www.appleiphonecell.com instead of google.com - this url was created by apple for precisely this reason.
Use of www.appleiphonecell.com is now (2018) a bad choice. It now redirects to Apple.com which is a > 40kB html file. Back to google.com - it is only 11kB. BTW google.com/m is same size but is reported to be slower by 120 msec.
|
316

I like to keep things simple. The way I do this is:

//Class.h
#import "Reachability.h"
#import <SystemConfiguration/SystemConfiguration.h>
- (BOOL)connected;
//Class.m
- (BOOL)connected
{
 Reachability *reachability = [Reachability reachabilityForInternetConnection];
 NetworkStatus networkStatus = [reachability currentReachabilityStatus];
 return networkStatus != NotReachable;
}

Then, I use this whenever I want to see if I have a connection:

if (![self connected]) {
 // Not connected
} else {
 // Connected. Do some Internet stuff
}

This method doesn't wait for changed network statuses in order to do stuff. It just tests the status when you ask it to.

Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Aug 26, 2011 at 13:34

2 Comments

For those who just copy and paste like i did with the above code. Also add SystemConfiguration.framework manually or you will get linking error.
Always come as reachable if i connect with WiFi. WiFi doesn't mean that it is having internet connection. I wanna verify internet connection even it has WiFi connectivity. Can you please help me out?
147

Using Apple's Reachability code, I created a function that'll check this correctly without you having to include any classes.

Include the SystemConfiguration.framework in your project.

Make some imports:

#import <sys/socket.h>
#import <netinet/in.h>
#import <SystemConfiguration/SystemConfiguration.h>

Now just call this function:

/*
Connectivity testing code pulled from Apple's Reachability Example: https://developer.apple.com/library/content/samplecode/Reachability
 */
+(BOOL)hasConnectivity {
 struct sockaddr_in zeroAddress;
 bzero(&zeroAddress, sizeof(zeroAddress));
 zeroAddress.sin_len = sizeof(zeroAddress);
 zeroAddress.sin_family = AF_INET;
 SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress);
 if (reachability != NULL) {
 //NetworkStatus retVal = NotReachable;
 SCNetworkReachabilityFlags flags;
 if (SCNetworkReachabilityGetFlags(reachability, &flags)) {
 if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
 {
 // If target host is not reachable
 return NO;
 }
 if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
 {
 // If target host is reachable and no connection is required
 // then we'll assume (for now) that your on Wi-Fi
 return YES;
 }
 if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
 (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
 {
 // ... and the connection is on-demand (or on-traffic) if the
 // calling application is using the CFSocketStream or higher APIs.
 if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
 {
 // ... and no [user] intervention is needed
 return YES;
 }
 }
 if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
 {
 // ... but WWAN connections are OK if the calling application
 // is using the CFNetwork (CFSocketStream?) APIs.
 return YES;
 }
 }
 }
 return NO;
}

And it's iOS 5 tested for you.

Cœur
39k25 gold badges206 silver badges281 bronze badges
answered Oct 28, 2011 at 20:37

2 Comments

@JezenThomas This doesn't perform the internet check asynchronously, which is why it is "much slimmer"... You should always be doing this asynchronously by subscribing to notifications so that you don't hang up the app on this process.
This leaks memory - the 'readability' structure (object, thing) needs to be freed with CFRelease().
124

This used to be the correct answer, but it is now outdated as you should subscribe to notifications for reachability instead. This method checks synchronously:


You can use Apple's Reachability class. It will also allow you to check if Wi-Fi is enabled:

Reachability* reachability = [Reachability sharedReachability];
[reachability setHostName:@"www.example.com"]; // Set your host name here
NetworkStatus remoteHostStatus = [reachability remoteHostStatus];
if (remoteHostStatus == NotReachable) { }
else if (remoteHostStatus == ReachableViaWiFiNetwork) { }
else if (remoteHostStatus == ReachableViaCarrierDataNetwork) { }

The Reachability class is not shipped with the SDK, but rather a part of this Apple sample application. Just download it, and copy Reachability.h/m to your project. Also, you have to add the SystemConfiguration framework to your project.

Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Jul 5, 2009 at 10:58

2 Comments

See my comment above about not using Reachability like that. Use it in asynchronous mode and subscribe to the notifications it sends - don't.
This code is a good starting point for things that you need to set before you can use the delegate methods for the reachability class.
83

Here's a very simple answer:

NSURL *scriptUrl = [NSURL URLWithString:@"http://www.google.com/m"];
NSData *data = [NSData dataWithContentsOfURL:scriptUrl];
if (data)
 NSLog(@"Device is connected to the Internet");
else
 NSLog(@"Device is not connected to the Internet");

The URL should point to an extremely small website. I use Google's mobile website here, but if I had a reliable web server I'd upload a small file with just one character in it for maximum speed.

If checking whether the device is somehow connected to the Internet is everything you want to do, I'd definitely recommend using this simple solution. If you need to know how the user is connected, using Reachability is the way to go.

Careful: This will briefly block your thread while it loads the website. In my case, this wasn't a problem, but you should consider this (credits to Brad for pointing this out).

Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered May 14, 2012 at 22:25

4 Comments

I really like this idea, but I would say for the 99.999% reliability while maintaining a small response size, go with www.google.com/m which is the mobile view for google.
Apple docs recommend not to do this since it can block the thread on a slow network, can cause app to be terminated in iOS
do not use syncronous calls.. as Apple states. (and note that syncronsus call will wrap an asyn call.. :) )
dont use Async code "masked" as async. Doing do you can end up waiting forever (App stuck) if for example DNS are not set.. call will block indefinitely.
74

Here is how I do it in my apps: While a 200 status response code doesn't guarantee anything, it is stable enough for me. This doesn't require as much loading as the NSData answers posted here, as mine just checks the HEAD response.

Swift Code

func checkInternet(flag:Bool, completionHandler:(internet:Bool) -> Void)
{
 UIApplication.sharedApplication().networkActivityIndicatorVisible = true
 let url = NSURL(string: "http://www.google.com/")
 let request = NSMutableURLRequest(URL: url!)
 request.HTTPMethod = "HEAD"
 request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
 request.timeoutInterval = 10.0
 NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.mainQueue(), completionHandler:
 {(response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
 UIApplication.sharedApplication().networkActivityIndicatorVisible = false
 let rsp = response as! NSHTTPURLResponse?
 completionHandler(internet:rsp?.statusCode == 200)
 })
}
func yourMethod()
{
 self.checkInternet(false, completionHandler:
 {(internet:Bool) -> Void in
 if (internet)
 {
 // "Internet" aka Google URL reachable
 }
 else
 {
 // No "Internet" aka Google URL un-reachable
 }
 })
}

Objective-C Code

typedef void(^connection)(BOOL);
- (void)checkInternet:(connection)block
{
 NSURL *url = [NSURL URLWithString:@"http://www.google.com/"];
 NSMutableURLRequest *headRequest = [NSMutableURLRequest requestWithURL:url];
 headRequest.HTTPMethod = @"HEAD";
 NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration ephemeralSessionConfiguration];
 defaultConfigObject.timeoutIntervalForResource = 10.0;
 defaultConfigObject.requestCachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;
 NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:self delegateQueue: [NSOperationQueue mainQueue]];
 NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:headRequest
 completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
 {
 if (!error && response)
 {
 block([(NSHTTPURLResponse *)response statusCode] == 200);
 }
 }];
 [dataTask resume];
}
- (void)yourMethod
{
 [self checkInternet:^(BOOL internet)
 {
 if (internet)
 {
 // "Internet" aka Google URL reachable
 }
 else
 {
 // No "Internet" aka Google URL un-reachable
 }
 }];
}
answered Nov 30, 2012 at 3:26

5 Comments

Caution: In my experience, this solution doesn't work all the time. In many cases the response returned is 403, after taking its sweet time. This solution seemed perfect, but doesn't guarantee 100% results.
As of June 2014, this will fail in mainland China, owing to the Chinese government now completely blocking google.com. (google.cn works, though, but in mainland China, no baidu.com, no internet) Probably better to ping whatever server you need to be communicating with.
Use www.appleiphonecell.com instead - apple created this url for precisely this reason.
May I suggest an update to your solution, as if there is an error or your block will never be called. (Also, I always check the block for nil, a it will crash if it is) -> BOOL isConnected = NO; if (!error && response) { isConnected = ([(NSHTTPURLResponse *)response statusCode] == 200); } if ( block ) { block(isConnected); }
my previous comment was referring to the ObjectiveC solution
59

Apple supplies sample code to check for different types of network availability. Alternatively there is an example in the iPhone developers cookbook.

Note: Please see @KHG's comment on this answer regarding the use of Apple's reachability code.

Moshe
58.2k81 gold badges277 silver badges431 bronze badges
answered Jul 5, 2009 at 8:59

3 Comments

Thanks. I discovered that the Xcode documentation in 3.0 also contains the source code, found by searching for "reachability" in the documentation.
Note that the new revision (09-08-09) of the Reachability sample code from Apple is asynchronous.
The links are dead
48

You could use Reachability by  (available here).

#import "Reachability.h"
- (BOOL)networkConnection {
 return [[Reachability reachabilityWithHostName:@"www.google.com"] currentReachabilityStatus];
}
if ([self networkConnection] == NotReachable) { /* No Network */ } else { /* Network */ } //Use ReachableViaWiFi / ReachableViaWWAN to get the type of connection.
answered Apr 25, 2012 at 12:20

1 Comment

@Supertecnoboff No, it's async.
42

Apple provides a sample app which does exactly this:

Reachability

NANNAV
4,9014 gold badges34 silver badges50 bronze badges
answered Jul 5, 2009 at 8:58

4 Comments

You should note that the Reachability sample only detects which interfaces are active, but not which ones have a valid connection to the internet. Applications should gracefully handle failure even when Reachability reports that everything is ready to go.
Happily the situation is a lot better in 3.0, as the system will present a login page for users behind a locked down WiFi where you have to login to use... you use to have to check for the redirect manually (and you still do if developing 2.2.1 apps)
I wouldn't say that the Reachability app does exactly what the is asked for. However it's a good starting point for adding the kind of functionality that is asked for,
Broken link!, would appreciate if this can be checked/fixed, many thanks
37

When using iOS 12 or macOS v10.14 (Mojave) or newer, you can use NWPathMonitor instead of the pre-historic Reachability class. As a bonus you can easily detect the current network connection type:

import Network // Put this on top of your class
let monitor = NWPathMonitor()
monitor.pathUpdateHandler = { path in
 if path.status != .satisfied {
 // Not connected
 }
 else if path.usesInterfaceType(.cellular) {
 // Cellular 3/4/5g connection
 }
 else if path.usesInterfaceType(.wifi) {
 // Wi-Fi connection
 }
 else if path.usesInterfaceType(.wiredEthernet) {
 // Ethernet connection
 }
}
monitor.start(queue: DispatchQueue.global(qos: .background))

More info here: https://developer.apple.com/documentation/network/nwpathmonitor

Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Oct 20, 2020 at 11:37

9 Comments

This should be set as the correct answer now since Apple has replaced Reachability with NWPathMonitor.
Is this the way to check for an internet connection? What if I’am on a Local network connected by wifi; then I do have WIFI, but when the wan modem/router has no connection, I still don’t have an Internet connection.
Anyone knows what is path.usesInterfaceType(.loopback)?
this also has energy impact at 80%
|
34

Only the Reachability class has been updated. You can now use:

Reachability* reachability = [Reachability reachabilityWithHostName:@"www.apple.com"];
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];
if (remoteHostStatus == NotReachable) { NSLog(@"not reachable");}
else if (remoteHostStatus == ReachableViaWWAN) { NSLog(@"reachable via wwan");}
else if (remoteHostStatus == ReachableViaWiFi) { NSLog(@"reachable via wifi");}
Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Aug 27, 2010 at 9:41

1 Comment

Unless something changed since 4.0 was released, that code is not asynchronous and you are guaranteed to see it show up in Crash Reports - happened to me before.
23

If you're using AFNetworking you can use its own implementation for internet reachability status.

The best way to use AFNetworking is to subclass the AFHTTPClient class and use this class to do your network connections.

One of the advantages of using this approach is that you can use blocks to set the desired behavior when the reachability status changes. Supposing that I've created a singleton subclass of AFHTTPClient (as said on the "Subclassing notes" on AFNetworking docs) named BKHTTPClient, I'd do something like:

BKHTTPClient *httpClient = [BKHTTPClient sharedClient];
[httpClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
{
 if (status == AFNetworkReachabilityStatusNotReachable) 
 {
 // Not reachable
 }
 else
 {
 // Reachable
 }
}];

You could also check for Wi-Fi or WLAN connections specifically using the AFNetworkReachabilityStatusReachableViaWWAN and AFNetworkReachabilityStatusReachableViaWiFi enums (more here).

answered May 30, 2013 at 1:18

Comments

16

Very simple.... Try these steps:

Step 1: Add the SystemConfiguration framework into your project.


Step 2: Import the following code into your header file.

#import <SystemConfiguration/SystemConfiguration.h>

Step 3: Use the following method

  • Type 1:

    - (BOOL) currentNetworkStatus {
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
     BOOL connected;
     BOOL isConnected;
     const char *host = "www.apple.com";
     SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host);
     SCNetworkReachabilityFlags flags;
     connected = SCNetworkReachabilityGetFlags(reachability, &flags);
     isConnected = NO;
     isConnected = connected && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
     CFRelease(reachability);
     return isConnected;
    }
    

  • Type 2:

    Import header : #import "Reachability.h"

    - (BOOL)currentNetworkStatus
    {
     Reachability *reachability = [Reachability reachabilityForInternetConnection];
     NetworkStatus networkStatus = [reachability currentReachabilityStatus];
     return networkStatus != NotReachable;
    }
    

Step 4: How to use:

- (void)CheckInternet
{
 BOOL network = [self currentNetworkStatus];
 if (network)
 {
 NSLog(@"Network Available");
 }
 else
 {
 NSLog(@"No Network Available");
 }
}
Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Apr 15, 2014 at 12:42

1 Comment

Is type 1 asynchronous?
13
-(void)newtworkType {
 NSArray *subviews = [[[[UIApplication sharedApplication] valueForKey:@"statusBar"] valueForKey:@"foregroundView"]subviews];
NSNumber *dataNetworkItemView = nil;
for (id subview in subviews) {
 if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
 dataNetworkItemView = subview;
 break;
 }
}
switch ([[dataNetworkItemView valueForKey:@"dataNetworkType"]integerValue]) {
 case 0:
 NSLog(@"No wifi or cellular");
 break;
 case 1:
 NSLog(@"2G");
 break;
 case 2:
 NSLog(@"3G");
 break;
 case 3:
 NSLog(@"4G");
 break;
 case 4:
 NSLog(@"LTE");
 break;
 case 5:
 NSLog(@"Wifi");
 break;
 default:
 break;
}
}
answered Jun 3, 2013 at 11:43

2 Comments

Even if the device is connected to Wifi or some other network type, the internet connection can still be unavailable. Simple test: connect to your home wifi and then unplug your cable modem. Still connected to wifi, but zero internet.
An explanation would be in order. E.g., what is the idea/gist? Please respond by editing (changing) your answer, not here in comments (without "Edit:", "Update:", or similar - the answer should appear as if it was written today).
12
- (void)viewWillAppear:(BOOL)animated
{
 NSString *URL = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
 return (URL != NULL ) ? YES : NO;
}

Or use the Reachability class.

There are two ways to check Internet availability using the iPhone SDK:

1. Check the Google page is opened or not.

2. Reachability Class

For more information, please refer to Reachability (Apple Developer).

Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Nov 22, 2012 at 11:46

2 Comments

There are two way to check internet availbility in iPhone SDK 1)Check the Google page is opened or not.
-1 : This is a synchronous method that will block the main thread (the one that the app UI is changed on) while it tries to connect to google.com. If your user is on a very slow data connection, the phone will act like the process is unresponsive.
11

First: Add CFNetwork.framework in framework

Code: ViewController.m

#import "Reachability.h"
- (void)viewWillAppear:(BOOL)animated
{
 Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
 NetworkStatus internetStatus = [r currentReachabilityStatus];
 if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
 {
 /// Create an alert if connection doesn't work
 UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection" message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
 [myAlert show];
 [myAlert release];
 }
 else
 {
 NSLog(@"INTERNET IS CONNECT");
 }
}
Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Apr 5, 2014 at 11:16

Comments

11

Swift 3 / Swift 4

You must first import

import SystemConfiguration

You can check the Internet connection with the following method:

func isConnectedToNetwork() -> Bool {
 var zeroAddress = sockaddr_in()
 zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
 zeroAddress.sin_family = sa_family_t(AF_INET)
 let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
 0ドル.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
 SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
 }
 }
 var flags = SCNetworkReachabilityFlags()
 if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
 return false
 }
 let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
 let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
 return (isReachable && !needsConnection)
}
Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Aug 10, 2017 at 14:00

1 Comment

energy impact at 80%
11

For my iOS projects, I recommend using

Reachability Class

Declared in Swift. For me, it works simply fine with

Wi-Fi and Cellular data

import SystemConfiguration
public class Reachability {
 class func isConnectedToNetwork() -> Bool {
 var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
 zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
 zeroAddress.sin_family = sa_family_t(AF_INET)
 let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
 0ドル.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
 SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
 }
 }
 var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0)
 if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
 return false
 }
 let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
 let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
 let ret = (isReachable && !needsConnection)
 return ret
 }
}

Use a conditional statement,

if Reachability.isConnectedToNetwork() {
 // Enter your code here
}
}
else {
 print("NO Internet connection")
}

This class is useful in almost every case your app uses the Internet connection. Such as if the condition is true, API can be called or task could be performed.

Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Mar 21, 2019 at 18:52

1 Comment

"Inspired" by Devang Tandel's answer?
10
  1. Download the Reachability file, https://gist.github.com/darkseed/1182373

  2. And add CFNetwork.framework and 'SystemConfiguration.framework' in framework

  3. Do #import "Reachability.h"


First: Add CFNetwork.framework in framework

Code: ViewController.m

- (void)viewWillAppear:(BOOL)animated
{
 Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
 NetworkStatus internetStatus = [r currentReachabilityStatus];
 if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
 {
 /// Create an alert if connection doesn't work
 UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection" message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
 [myAlert show];
 [myAlert release];
 }
 else
 {
 NSLog(@"INTERNET IS CONNECT");
 }
}
Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Nov 27, 2014 at 7:29

Comments

9

First download the reachability class and put reachability.h and reachabilty.m file in your Xcode.

The best way is to make a common Functions class (NSObject) so that you can use it any class. These are two methods for a network connection reachability check:

+(BOOL) reachabiltyCheck
{
 NSLog(@"reachabiltyCheck");
 BOOL status =YES;
 [[NSNotificationCenter defaultCenter] addObserver:self
 selector:@selector(reachabilityChanged:)
 name:kReachabilityChangedNotification
 object:nil];
 Reachability * reach = [Reachability reachabilityForInternetConnection];
 NSLog(@"status : %d",[reach currentReachabilityStatus]);
 if([reach currentReachabilityStatus]==0)
 {
 status = NO;
 NSLog(@"network not connected");
 }
 reach.reachableBlock = ^(Reachability * reachability)
 {
 dispatch_async(dispatch_get_main_queue(), ^{
 });
 };
 reach.unreachableBlock = ^(Reachability * reachability)
 {
 dispatch_async(dispatch_get_main_queue(), ^{
 });
 };
 [reach startNotifier];
 return status;
}
+(BOOL)reachabilityChanged:(NSNotification*)note
{
 BOOL status =YES;
 NSLog(@"reachabilityChanged");
 Reachability * reach = [note object];
 NetworkStatus netStatus = [reach currentReachabilityStatus];
 switch (netStatus)
 {
 case NotReachable:
 {
 status = NO;
 NSLog(@"Not Reachable");
 }
 break;
 default:
 {
 if (!isSyncingReportPulseFlag)
 {
 status = YES;
 isSyncingReportPulseFlag = TRUE;
 [DatabaseHandler checkForFailedReportStatusAndReSync];
 }
 }
 break;
 }
 return status;
}
+ (BOOL) connectedToNetwork
{
 // Create zero addy
 struct sockaddr_in zeroAddress;
 bzero(&zeroAddress, sizeof(zeroAddress));
 zeroAddress.sin_len = sizeof(zeroAddress);
 zeroAddress.sin_family = AF_INET;
 // Recover reachability flags
 SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
 SCNetworkReachabilityFlags flags;
 BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
 CFRelease(defaultRouteReachability);
 if (!didRetrieveFlags)
 {
 NSLog(@"Error. Could not recover network reachability flags");
 return NO;
 }
 BOOL isReachable = flags & kSCNetworkFlagsReachable;
 BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
 BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;
 NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"];
 NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];
 NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:self];
 return ((isReachable && !needsConnection) || nonWiFi) ? (testConnection ? YES : NO) : NO;
}

Now you can check network connection in any class by calling this class method.

Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Jun 7, 2013 at 13:53

Comments

9

There is also another method to check Internet connection using the iPhone SDK.

Try to implement the following code for the network connection.

#import <SystemConfiguration/SystemConfiguration.h>
#include <netdb.h>
/**
 Checking for network availability. It returns
 YES if the network is available.
*/
+ (BOOL) connectedToNetwork
{
 // Create zero addy
 struct sockaddr_in zeroAddress;
 bzero(&zeroAddress, sizeof(zeroAddress));
 zeroAddress.sin_len = sizeof(zeroAddress);
 zeroAddress.sin_family = AF_INET;
 // Recover reachability flags
 SCNetworkReachabilityRef defaultRouteReachability =
 SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
 SCNetworkReachabilityFlags flags;
 BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
 CFRelease(defaultRouteReachability);
 if (!didRetrieveFlags)
 {
 printf("Error. Could not recover network reachability flags\n");
 return NO;
 }
 BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
 BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
 return (isReachable && !needsConnection) ? YES : NO;
}
Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Nov 9, 2013 at 9:58

Comments

9

To do this yourself is extremely simple. The following method will work. Just be sure to not allow a hostname protocol such as HTTP, HTTPS, etc. to be passed in with the name.

-(BOOL)hasInternetConnection:(NSString*)urlAddress
{
 SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [urlAddress UTF8String]);
 SCNetworkReachabilityFlags flags;
 if (!SCNetworkReachabilityGetFlags(ref, &flags))
 {
 return NO;
 }
 return flags & kSCNetworkReachabilityFlagsReachable;
}

It is quick simple and painless.

Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Dec 4, 2013 at 18:17

Comments

9

I think this one is the best answer.

"Yes" means connected. "No" means disconnected.

#import "Reachability.h"
 - (BOOL)canAccessInternet
{
 Reachability *IsReachable = [Reachability reachabilityForInternetConnection];
 NetworkStatus internetStats = [IsReachable currentReachabilityStatus];
 if (internetStats == NotReachable)
 {
 return NO;
 }
 else
 {
 return YES;
 }
}
Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Oct 1, 2014 at 10:49

Comments

8

The Reachability class is OK to find out if the Internet connection is available to a device or not...

But in case of accessing an intranet resource:

Pinging the intranet server with the reachability class always returns true.

So a quick solution in this scenario would be to create a web method called pingme along with other webmethods on the service. The pingme should return something.

So I wrote the following method on common functions

-(BOOL)PingServiceServer
{
 NSURL *url=[NSURL URLWithString:@"http://www.serveraddress/service.asmx/Ping"];
 NSMutableURLRequest *urlReq=[NSMutableURLRequest requestWithURL:url];
 [urlReq setTimeoutInterval:10];
 NSURLResponse *response;
 NSError *error = nil;
 NSData *receivedData = [NSURLConnection sendSynchronousRequest:urlReq
 returningResponse:&response
 error:&error];
 NSLog(@"receivedData:%@",receivedData);
 if (receivedData !=nil)
 {
 return YES;
 }
 else
 {
 NSLog(@"Data is null");
 return NO;
 }
}

The above method was so useful for me, so whenever I try to send some data to the server I always check the reachability of my intranet resource using this low timeout URLRequest.

Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Jul 10, 2013 at 12:42

Comments

7

Swift 5 and later:

public class Reachability {
 class func isConnectedToNetwork() -> Bool {
 var zeroAddress = sockaddr_in()
 zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size)
 zeroAddress.sin_family = sa_family_t(AF_INET)
 guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
 0ドル.withMemoryRebound(to: sockaddr.self, capacity: 1) {
 SCNetworkReachabilityCreateWithAddress(nil, 0ドル)
 }
 }) else {
 return false
 }
 var flags: SCNetworkReachabilityFlags = []
 if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) {
 return false
 }
 let isReachable = flags.contains(.reachable)
 let needsConnection = flags.contains(.connectionRequired)
 return (isReachable && !needsConnection)
 }

Call this class like this:

if Reachability.isConnectedToNetwork() == true {
 // Do something
} else {
 // Do something
}
Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Feb 15, 2021 at 11:49

1 Comment

energy impact at 80% .....
6
  • Step 1: Add the Reachability class in your Project.
  • Step 2: Import the Reachability class
  • Step 3: Create the below function

    - (BOOL)checkNetConnection {
     self.internetReachability = [Reachability reachabilityForInternetConnection];
     [self.internetReachability startNotifier];
     NetworkStatus netStatus = [self.internetReachability currentReachabilityStatus];
     switch (netStatus) {
     case NotReachable:
     {
     return NO;
     }
     case ReachableViaWWAN:
     {
     return YES;
     }
     case ReachableViaWiFi:
     {
     return YES;
     }
     }
    }
    
  • Step 4: Call the function as below:

    if (![self checkNetConnection]) {
     [GlobalFunctions showAlert:@""
     message:@"Please connect to the Internet!"
     canBtntitle:nil
     otherBtnTitle:@"Ok"];
     return;
    }
    else
    {
     Log.v("internet is connected","ok");
    }
    
Peter Mortensen
31.5k22 gold badges110 silver badges134 bronze badges
answered Aug 19, 2015 at 6:37

1 Comment

Apple's docs state this Note: Reachability cannot tell your application if you can connect to a particular host, only that an interface is available that might allow a connection, and whether that interface is the WWAN.
6

Checking the Internet connection availability in (iOS) Xcode 8 , Swift 3.0

This is simple method for checking the network availability like our device is connected to any network or not. I have managed to translate it to Swift 3.0 and here the final code. The existing Apple Reachability class and other third party libraries seemed to be too complicated to translate to Swift.

This works for both 3G,4G and WiFi connections.

Don’t forget to add "SystemConfiguration.framework" to your project builder.

//Create new swift class file Reachability in your project.
import SystemConfiguration
public class InternetReachability {
class func isConnectedToNetwork() -> Bool {
 var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
 zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
 zeroAddress.sin_family = sa_family_t(AF_INET)
 let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
 SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer(0ドル)).takeRetainedValue()
 }
 var flags: SCNetworkReachabilityFlags = 0
 if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 {
 return false
 }
 let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0
 let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
 return isReachable && !needsConnection
 }
}
// Check network connectivity from anywhere in project by using this code.
 if InternetReachability.isConnectedToNetwork() == true {
 print("Internet connection OK")
 } else {
 print("Internet connection FAILED")
 }
answered Dec 17, 2015 at 12:14

2 Comments

MacOS version? Otherwise main question is NOT answered!
Please check main answer heading.
6

Import Reachable.h class in your ViewController, and use the following code to check connectivity:

#define hasInternetConnection [[Reachability reachabilityForInternetConnection] isReachable]
if (hasInternetConnection){
 // To-do block
}
Olcay Ertaş
6,2648 gold badges82 silver badges116 bronze badges
answered Oct 18, 2013 at 6:19

1 Comment

Doesn't work if you are connected to a WiFi without internet.
3

import "Reachability.h"

-(BOOL)netStat
{
 Reachability *test = [Reachability reachabilityForInternetConnection];
 return [test isReachable];
}
answered Sep 30, 2014 at 10:43

Comments

3

Create an object of AFNetworkReachabilityManager and use the following code to track the network connectivity

self.reachabilityManager = [AFNetworkReachabilityManager managerForDomain:@"yourDomain"];
[self.reachabilityManager startMonitoring];
[self.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
 switch (status) {
 case AFNetworkReachabilityStatusReachableViaWWAN:
 case AFNetworkReachabilityStatusReachableViaWiFi:
 break;
 case AFNetworkReachabilityStatusNotReachable:
 break;
 default:
 break;
 }
 }];
answered Mar 31, 2015 at 18:27

Comments

1
2

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.