1

我的应用程序中有一个需要互联网连接的新闻源,作为其中的一部分,我想要一个简单的连接检查,以便如果用户离线,他们会收到一条警报消息。我有 90% 的工作,但是当您在移动网络(即蜂窝网络,而不是 WiFi)上时,下面的代码根本不起作用。

似乎 IsWWAN 标志总是返回 false - 但我不知道为什么?

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)
  }
}

我看到有许多第 3 方版本的 Reachability 提供诸如回叫、通知等功能;但我发现的一切都太复杂了,无法满足我的需要;而且我还没有找到解释为什么在 WiFi 关闭且移动网络打开时 IsWWAN 永远不会返回的解释。

4

1 回答 1

2

我在以下问题中发现了一个不同版本的 Reachability 类,它已经解决了这个问题。使用 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)
   }
}
于 2016-02-23T19:41:14.913 回答