栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Swift中使用SCNetworkReachability

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Swift中使用SCNetworkReachability

(此答案由于Swift语言的更改而反复扩展,这使它有点混乱。我现在将其重写并删除了所有与Swift
1.x相关的内容。如果有人需要,可以在编辑历史记录中找到较旧的代码。它。)

这就是您在 Swift 2.0(Xpre 7)中的 做法:

import SystemConfigurationfunc connectedToNetwork() -> Bool {    var zeroAddress = sockaddr_in()    zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))    zeroAddress.sin_family = sa_family_t(AF_INET)    guard let defaultRouteReachability = withUnsafePointer(&zeroAddress, {        SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))    }) else {        return false    }    var flags : SCNetworkReachabilityFlags = []    if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) {        return false    }    let isReachable = flags.contains(.Reachable)    let needsConnection = flags.contains(.ConnectionRequired)    return (isReachable && !needsConnection)}

说明:

  • 从Swift 1.2(Xpre 6.3)开始,导入的C结构在Swift中具有默认的初始化程序,该初始化程序将该结构的所有字段初始化为零,因此可以使用以下方式初始化套接字地址结构:

    var zeroAddress = sockaddr_in()
  • sizeofValue()
    给出此结构的大小,必须将其转换
    UInt8
    sin_len

    zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
  • AF_INET
    Int32
    ,必须将其转换为以下类型的正确类型
    sin_family

    zeroAddress.sin_family = sa_family_t(AF_INET)
  • withUnsafePointer(&zeroAddress) { ... }
    将结构的地址传递到闭包,在闭包处作为实参
    SCNetworkReachabilityCreateWithAddress()
    。该
    UnsafePointer($0)
    转换是必要的,因为该功能需要一个指针
    sockaddr
    ,而不是
    sockaddr_in

  • 从中

    withUnsafePointer()
    返回的值是从的返回值
    SCNetworkReachabilityCreateWithAddress()
    ,其类型为
    SCNetworkReachability?
    ,即它是可选的。的
    guard let
    声明(在夫特2.0新功能)分配展开值到
    defaultRouteReachability
    如果不是可变
    nil
    。否则
    else
    执行该块,然后函数返回。

  • 从Swift 2开始,

    SCNetworkReachabilityCreateWithAddress()
    返回一个托管对象。您不必显式释放它。

  • 从Swift 2开始,
    SCNetworkReachabilityFlags
    符合的
    OptionSetType
    具有类似set的界面。您使用创建一个空标志变量
    var flags : SCNetworkReachabilityFlags = []

并检查标志

    let isReachable = flags.contains(.Reachable)let needsConnection = flags.contains(.ConnectionRequired)
  • 的第二个参数
    SCNetworkReachabilityGetFlags
    具有type
    UnsafeMutablePointer<SCNetworkReachabilityFlags>
    ,这意味着您必须传递flags变量的 地址

另请注意,从Swift2开始,可以注册一个通告程序回调,将使用Swift和Swift2中的C API与Swift 2-UnsafeMutablePointer

<Void>
与object进行比较。


Swift 3/4的更新:

不安全的指针不能再简单地转换为其他类型的指针(请参见-SE-0107 UnsafeRawPointer
API)。这里是更新的代码:

import SystemConfigurationfunc connectedToNetwork() -> Bool {    var zeroAddress = sockaddr_in()    zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size)    zeroAddress.sin_family = sa_family_t(AF_INET)    guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {        $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { SCNetworkReachabilityCreateWithAddress(nil, $0)        }    }) else {        return false    }    var flags: SCNetworkReachabilityFlags = []    if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) {        return false    }    let isReachable = flags.contains(.reachable)    let needsConnection = flags.contains(.connectionRequired)    return (isReachable && !needsConnection)}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/436390.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号