iosswiftreachabilitynetwork-connection

Checking for Network connection with Reachability - IsWWAN flag always 'false'


I have a newsfeed in my app which requires an internet connection, and as part of that I want a simple connection check, so that if the user is offline, they get an alert message. I have 90% of it working, but the below code simply doesn't work when you're on mobile network (i.e. cellular network, as opposed to WiFi).

It appears that the IsWWAN flag is always returning false - but I can't work out why?

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
    let isWan = flags == .IsWWAN

    return ((isReachable || isWan) && !needsConnection)
  }
}

I've seen there's many 3rd party versions of Reachability that offer things like call backs, notifications etc; but everything I've found is too elaborate for my needs; and I haven't found an explanation to why IsWWAN never returns whilst WiFi is off, and the mobile network is on.


Solution

  • I found a different version of the Reachability class found on the following question which has fixed this problem. Check for internet connection with Swift

    public class Reachability {
    class func isConnectedToNetwork() -> Bool {
        var zeroAddress = sockaddr_in()
        zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)
        let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
            SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
        }
        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)
       }
    }