in my app i am checking that if mobile data is off its showing the popup like check your data connection. for that i write this code
import Foundation
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(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, UnsafePointer($0))
}
var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0)
if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
return false
}
let isReachable = flags == .Reachable
let needsConnection = flags == .ConnectionRequired
return isReachable && !needsConnection
}
}
but by this code its only check that wifi is connected or not. but if i try with 3g mobile data its always showing me that your mobile data is not connected. so how can i solve this?
Try like below code:
Create object of reachability class like,
var internetReachability = Reachability()
Now write below code in viewDidLoad(),
NSNotificationCenter.defaultCenter().addObserver(self, selector: "reachabilityChanged:", name: kReachabilityChangedNotification, object: nil)
self.internetReachability = Reachability.reachabilityForInternetConnection()
self.internetReachability.startNotifier()
self.updateInterfaceWithReachability(self.internetReachability)
Now create function to check reachabilty of wifi as well as data pack,
func updateInterfaceWithReachability(reachability: Reachability)
{
let netStatus : NetworkStatus = reachability.currentReachabilityStatus()
switch (netStatus.rawValue)
{
case NotReachable.rawValue:
print("offline")
break
case ReachableViaWWAN.rawValue:
print("online")
break
case ReachableViaWiFi.rawValue:
print("online")
break
default :
print("offline")
break
}
}
// Rechability update status
func reachabilityChanged(sender : NSNotification!)
{
let curReach : Reachability = sender.object as! Reachability
self.updateInterfaceWithReachability(curReach)
}
Hope this will help you.
If you have any super Class in your application then use below code
override func viewWillAppear(animated: Bool)
{
super.viewWillAppear(animated)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "ShowNetConnectivity", name: SHOW_NO_INTERNET_CONNECTION, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "DisssmissConnectivity", name: DISMISS_INTERNET_CONNECTION, object: nil)
let reachability = SCNetworkReachabilityCreateWithName(nil, host)!
SCNetworkReachabilitySetCallback(reachability, { (_, flags, _) in
print(flags.rawValue)
if (flags.rawValue == NotReachable.rawValue && flags.rawValue != ReachableViaWiFi.rawValue && flags.rawValue != ReachableViaWWAN.rawValue)
{
if(isConnectionAvailable == true)
{
let nc = NSNotificationCenter.defaultCenter()
nc.postNotificationName(SHOW_NO_INTERNET_CONNECTION, object: nil)
}
}else
{
if(isConnectionAvailable == false)
{
let nc = NSNotificationCenter.defaultCenter()
nc.postNotificationName(DISMISS_INTERNET_CONNECTION, object: nil)
}
}
}, &context)
SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes)
}
override func viewWillDisappear(animated: Bool)
{
super.viewWillDisappear(animated)
NSNotificationCenter.defaultCenter().removeObserver(self, name: SHOW_NO_INTERNET_CONNECTION, object: nil)
NSNotificationCenter.defaultCenter().removeObserver(self, name: DISMISS_INTERNET_CONNECTION, object: nil)
}
Here's how I do it and it works for me.
In my viewDidLoad:
do {
reachability = try Reachability.reachabilityForInternetConnection()
} catch {
print("Unable to create Reachability")
return
}
NSNotificationCenter.defaultCenter().addObserver(self,
selector: #selector(MainViewController.reachabilityChanged(_:)),
name: ReachabilityChangedNotification,
object: reachability)
do {
try reachability.startNotifier()
} catch {
print("This is not working.")
return
}
And the reachabilityChanged
func reachabilityChanged(note: NSNotification) {
let reachability = note.object as! Reachability
if reachability.isReachable() {
if reachability.isReachableViaWiFi() {
print("Reachable via WiFi")
} else {
print("Reachable via Cellular")
}
} else {
showNoConnectionAlert()
print("Not reachable")
}
}
Using this Reachability