I am using the updated Reachability library to test whether the internet connexion is reachable. I try to Log a message in case the internet is not reachable, but the Log doesn't debug:
//Test the internet connection
Reachability* reach = [Reachability reachabilityForInternetConnection];
reach.unreachableBlock = ^(Reachability*reach)
{
NSLog(#"Internet connexion unreachable");//Although Internet cnx is off, this message is not displayed
return;
};
// start the notifier which will cause the reachability object to retain itself!
[reach startNotifier];
Am I misunderstanding the Reachability library? How to perform a given task when Internet is off? Thanx.
P.S: My iPad is only wifi, without 3G service.
Using Alamofire to check interner, In Swift 4
import Foundation
import Alamofire
class Connectivity {
class func isConnectedToInternet() ->Bool {
return NetworkReachabilityManager()!.isReachable
}
}
Then call this function
if Connectivity.isConnectedToInternet() {
print("Yes! internet is available.")
// do some tasks..
}
Actually, you should register for a notification to receive changed reachibility :
[[NSNotificationCenter defaultCenter] addObserver: self selector: #selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];
Look at Apple example here : http://developer.apple.com/library/ios/#samplecode/Reachability/Listings/Classes_ReachabilityAppDelegate_m.html#//apple_ref/doc/uid/DTS40007324-Classes_ReachabilityAppDelegate_m-DontLinkElementID_4
Ok, so best way I got is following Apple sample code:
//Test the internet connection
Reachability* reach = [Reachability reachabilityForInternetConnection];
NetworkStatus netStatus = [reach currentReachabilityStatus];
//See if the reachable object status is "ReachableViaWifi"
if (netStatus!=ReachableViaWiFi) {
//If not
NSLog(#"wifi unavailable");
//Alert the user about the Internet cnx
WBErrorNoticeView *notice = [WBErrorNoticeView errorNoticeInView:self.view title:#"Network Error" message:#"Check your internet connection."];
notice.sticky = NO;
[notice show];
return;//Exit the method
}
Related
In my app i am trying to get network status using NetworkReachability. I tried it when i am under wifi or 3g connection and it works perfectly.
The problem is when i am connected to a personal hotspot/tethering(tested with iPhone to iPhone, Android to iPhone and routers with sim) i get always 3g connection and not wifi.Tested with ios10. Is there any way without using private framework to control if i am under tethering connection or hotspot?
You have check Reachability for internet, Using following link to download Reachability demo project from Apple:
https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html
,and add both .h and .m files to your project.
[[NSNotificationCenter defaultCenter] addObserver:self selector:#selector(handleNetworkChange:) name:kReachabilityChangedNotification object:nil];
reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
- (void) handleNetworkChange:(NSNotification *)notice
{
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];
if(remoteHostStatus == NotReachable) {NSLog(#"no");}
else if (remoteHostStatus == ReachableViaWiFi) {NSLog(#"wifi"); }
else if (remoteHostStatus == ReachableViaWWAN) {NSLog(#"cell"); }
}
In GitHub, AFNetworking library provide the check the network Reachability status. Using the Network Reachability Manager object file to detect the status of internet reachability status.
Shared Network Reachability
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(#"Reachability: %#", AFStringFromNetworkReachabilityStatus(status));
}];
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
Hi i need to find out whether iPhone internet connected 3G or 2G or WIFI network
any suggestions
Thanks
Sravan
Download Reachability Class for iOS from this link:- https://github.com/tonymillion/Reachability
1)Add Reachability.h &.m in your Project, make sure you make it ARC compatible by adding flag -fno-objc-arc
2)Now, check the connection type in your view controller
Reachability *reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
NetworkStatus status = [reachability currentReachabilityStatus];
if(status == NotReachable)
{
//No internet
}
else if (status == ReachableViaWiFi)
{
//WiFi
}
else if (status == ReachableViaWWAN)
{
//3G
}
You can use the Reachability library written by tonymillion.
If you don't wan to use ARC, there is also the Apple Reachability library.
Also take a look inside of < CoreTelephony/CTTelephonyNetworkInfo.h >
You will see that there is a currentRadioAccessTechnology property exposed on CTTelephonyNetworkInfo.
CTTelephonyNetworkInfo *netInfo = [[CTTelephonyNetworkInfo alloc] init];
NSLog(#"Radio access technology:\n%#",
netInfo.currentRadioAccessTechnology);
You can subscribe to changes via:
[NSNotificationCenter.defaultCenter
addObserverForName:CTRadioAccessTechnologyDidChangeNotification
object:nil
queue:nil
usingBlock:^(NSNotification __unused *notification) {
CTTelephonyNetworkInfo *current =
[[CTTelephonyNetworkInfo alloc] init];
NSLog(#"Updated Radio access technology:\n%#",
current.currentRadioAccessTechnology);
}];
This question already has answers here:
How can I check for an active Internet connection on iOS or macOS?
(46 answers)
Closed 9 years ago.
I have the following code:
- (void) testInternetConnection {
internetConnection = [Reachability reachabilityWithHostname:#"www.google.com"];
// Internet is reachable
internetConnection.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
internetConnection.unreachableBlock = ^(Reachability*reach)
{
// Update the UI on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(#"Someone broke the internet :(");
});
};
[internetConnection startNotifier];
}
How do I tell if my internet has changed using the notifier? I understand the singleton method and use that when needed.
try to test your code on device when ever possible.
ensure
BOOL status = ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable)
, on device if you are testing in simulator
The simulator just uses your default Mac network connection so you need to disconnect your mac from the network and the simulator will experience the same loss of network connectivity.
Thanks
you can check reachability by this code,
//to make reachability object
reachability = [Reachability reachabilityForInternetConnection];
//start notifier
[reachability startNotifier];
//get reachability status
remoteHostStatus = [reachability currentReachabilityStatus];
Thanks.
//First import Reachability classes
// In Appdelegate .h file create variables
Reachability *hostReach,*internetReach,*wifiReach;
Reachability *internetReachable;
// After that add this code didfinish lonching with options
internetReachable = [Reachability reachabilityForInternetConnection] ;
[internetReachable startNotifier];
-(BOOL) connectedToNetwork
{
const char *host_name = "www.google.com";
BOOL _isDataSourceAvailable = NO;
Boolean success;
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL,host_name);
SCNetworkReachabilityFlags flags;
success = SCNetworkReachabilityGetFlags(reachability, &flags);
_isDataSourceAvailable = success &&
(flags & kSCNetworkFlagsReachable) &&
!(flags & kSCNetworkFlagsConnectionRequired);
CFRelease(reachability);
return _isDataSourceAvailable;
}
What I am trying to achieve, is monitor any internet connectivity? So the phone needs an active connection to the internet. If it does display a UIAlertView with the option to Try Again (try the connection again to see if it has changed).
I am trying to use Reachability and connection to the api.parse.com link.
In my AppDelegate I call the setup of Reachability like this:
// Use Reachability to monitor connectivity
[self monitorReachability];
The monitorReachability is setup like this:
- (void)monitorReachability {
[[NSNotificationCenter defaultCenter] addObserver:self selector:#selector(reachabilityChanged:) name:ReachabilityChangedNotification object:nil];
self.hostReach = [Reachability reachabilityWithHostName: #"api.parse.com"];
[self.hostReach startNotifier];
self.internetReach = [Reachability reachabilityForInternetConnection];
[self.internetReach startNotifier];
self.wifiReach = [Reachability reachabilityForLocalWiFi];
[self.wifiReach startNotifier];
}
I also have the reachability changed method as follows:
EDIT - updated method
- (void)reachabilityChanged:(NSNotification* )note {
Reachability *curReach = (Reachability *)[note object];
NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
NSLog(#"Reachability changed: %#", curReach);
networkStatus = [curReach currentReachabilityStatus];
if (networkStatus == NotReachable) {
NSLog(#"NOT REACHABLE");
return;
} else {
NSLog(#"REACHABLE");
}
What I am trying to understand is the responses back. From the above it looks like I have a pointer to the current status and I am not sure how to use this. Basically I want an if statement to check if that link is reachable via the internet connection, if its not I can through an AlertView. I can then setup a boolean for the UIAlertView to use i.e. showingConnectionAlert, which can then be brought down when the connection is changed and picked up. I am unsure where to put this too.
One of the simplest ways to use the Reachability class is to import the Reachability.h into your rootViewController or whatever one is going to need the connection, then simply run this code...
Reachability *reach = [Reachability reachabilityForInternetConnection];
NetworkStatus netStatus = [reach currentReachabilityStatus];
if (netStatus == NotReachable) {
NSLog(#"No internet connection!");
//Alert View in here
}
else {
//Do something in here with the connecion e.g:
[self performSelector:#selector(startNSURLRequest) withObject:nil afterDelay:30.0];
}
That should simplify the process a bit.. let me know how you get on. T
I am using Reachability in my IOS app to determine a connection.
Following from this post wifi on iphone simulator
If the wifi is turned off the internet connection for the simulator is not available but the phone is still connected to Wifi therefore a connection has not changed. This is all fine and understood and of course I can test on the device itself.
However, I am looking to handle the error that a user is connected to wifi but the wifi has no internet connection like the screenshot below.
I use reachability in the following way:
#pragma mark - ()
- (void)monitorReachability {
[[NSNotificationCenter defaultCenter] addObserver:self selector:#selector(reachabilityChanged:) name:ReachabilityChangedNotification object:nil];
self.hostReach = [Reachability reachabilityWithHostname: #"api.parse.com"];
[self.hostReach startNotifier];
self.internetReach = [Reachability reachabilityForInternetConnection];
[self.internetReach startNotifier];
self.wifiReach = [Reachability reachabilityForLocalWiFi];
[self.wifiReach startNotifier];
}
//Called by Reachability whenever status changes.
- (void)reachabilityChanged:(NSNotification* )note {
Reachability *curReach = (Reachability *)[note object];
NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
NSLog(#"Reachability changed: %#", curReach);
networkStatus = [curReach currentReachabilityStatus];
}
I am using Reachability for ARC from tonymillion's github here: https://github.com/tonymillion/Reachability
Does anyone know how I can handle this situation of connection with a better error?
create following method in appdelegate to use it on any class.
-(BOOL)isHostAvailable
{
//return NO; // force for offline testing
Reachability *hostReach = [Reachability reachabilityForInternetConnection];
NetworkStatus netStatus = [hostReach currentReachabilityStatus];
return !(netStatus == NotReachable);
}