SCNetworkReachability在Mac OS X上使用Swift

时间:2014-10-22 16:27:37

标签: macos swift network-programming

我在Objective C中有一个很好的工作方法来检查与IP地址的网络连接是否可用。转换为Swift有一个问题。

错误是:  非托管' SCNetworkReachability'与SCNetworkReachability'

不同

编译器在代码行停止:

让成功= SCNetworkReachabilityGetFlags(可达性和标志)

我想我忽略了一些重要的事情!

这种方法是检查连接是否存活以及主机是否可用的正确方法吗?

func hostReachable(ipadres:String) -> Bool {
    let host_name = ipadres.cStringUsingEncoding(NSASCIIStringEncoding)

    let reachability  = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, host_name!)
    var flags:SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(kSCNetworkReachabilityFlagsReachable)
    let success = SCNetworkReachabilityGetFlags(reachability, &flags)

    let isAvailable = success && (flags | kSCNetworkFlagsReachable) && !(flags | kSCNetworkFlagsConnectionRequired)
    println("Reachability results---> \(success) \(host_name)', flags: \(flags)")

    if (isAvailable) {
        return true
    } else {
        println("'hostReachable:--> \(host_name) is not reachable")
        return false
    }
   return  false
}

添加更正后,完整的工作版本就在这里。

func hostReachable(ipadres:String) -> Bool {
if let host_name = ipadres.cStringUsingEncoding(NSASCIIStringEncoding) {
    let reachability  = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, host_name).takeRetainedValue()
    var flags : SCNetworkReachabilityFlags = 0
    if SCNetworkReachabilityGetFlags(reachability, &flags) == 0 {
        return false
    }
    let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0
    let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0

    return (isReachable && !needsConnection)
}else{
    return false
}
}

此方法将检查网络更正是上升还是下降,但遗憾的是它不会检查主机或IP是否真的可以访问。怎么可能这样呢? (目前我正在使用带有NSTask的Ping命令)。

0 个答案:

没有答案