【问题标题】:How to check if WiFi is on or off in iOS Swift 2?如何在 iOS Swift 2 中检查 WiFi 是打开还是关闭?
【发布时间】:2016-10-04 10:17:58
【问题描述】:

我想检查 wifi 是否关闭,然后向用户显示警报以检查他/她的连接。

我找到了这样的代码,但它检查是否有互联网连接,而不是检查 wifi 是打开还是关闭:

func isConnectionAvailble()->Bool{

  var rechability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, "www.apple.com").takeRetainedValue()

  var flags : SCNetworkReachabilityFlags = 0

  if SCNetworkReachabilityGetFlags(rechability, &flags) == 0
  {
     return false
  }

  let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0
  let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
  return (isReachable && !needsConnection)
}

【问题讨论】:

标签: ios swift


【解决方案1】:

你不能。

有了Apple's reachability类,你可以根据NetworkStatus结构体区分三件事:

typedef enum : NSInteger {
  NotReachable = 0,         // 1
  ReachableViaWiFi,         // 2
  ReachableViaWWAN          // 3
} NetworkStatus;
  1. 您既没有 WiFi 也没有移动数据连接。
  2. 您有 WiFi 连接,但您可能有也可能没有移动数据连接。
  3. 您有移动数据连接,但没有 WiFi 连接。

无法检查WiFi是否已关闭,或者WiFi是否已打开但附近没有WiFi网络,或者是否已打开飞行模式。

对于移动数据,您可以使用telephony类来查找您的设备是否支持移动数据连接(iPhone而不是iPad,并且插入了SIM卡),您可以在首选项中检测是否禁用了移动数据你的申请。

【讨论】:

  • 我认为第二个wifi is turned off 应该是wifi is turned on。除此之外,这是一个非常好的解释!
【解决方案2】:

找到以下内容,这对我真的很有帮助(在 Apple Developer Forums 上找到)。以下代码适用于 Swift 4。

func fetchSSIDInfo() ->  String {  
    var currentSSID = ""  
    if let interfaces:CFArray = CNCopySupportedInterfaces() {  
        for i in 0..<CFArrayGetCount(interfaces){  
            let interfaceName: UnsafeRawPointer = CFArrayGetValueAtIndex(interfaces, i)  
            let rec = unsafeBitCast(interfaceName, to: AnyObject.self)  
            let unsafeInterfaceData = CNCopyCurrentNetworkInfo("\(rec)" as CFString)  
            if unsafeInterfaceData != nil {  
                let interfaceData = unsafeInterfaceData! as Dictionary!  
                for dictData in interfaceData! {  
                    if dictData.key as! String == "SSID" {  
                        currentSSID = dictData.value as! String  
                    }  
                }  
            }  
        }  
    }  
    return currentSSID  
}  

然后您可以通过以下方式检查设备是否连接到 Wi-Fi:

if fetchSSIDInfo() != nil { 
    /* Wi-Fi is Connected */ 
}

不完美,但如果设备未连接到 Wi-Fi 网络,您可以要求用户连接到 Wi-Fi 网络:

let wifiNotifcation = UIAlertController(title: "Please Connect to Wi-Fi", message: "Please connect to your standard Wi-Fi Network", preferredStyle: .alert)
wifiNotifcation.addAction(UIAlertAction(title: "Open Wi-Fi", style: .default, handler: { (nil) in
     let url = URL(string: "App-Prefs:root=WIFI")

     if UIApplication.shared.canOpenURL(url!){
           UIApplication.shared.openURL(url!)
           self.navigationController?.popViewController(animated: false)
     }
}))
self.present(wifiNotifcation, animated: true, completion: nil)

【讨论】:

  • 不错!请参阅下面@winklerrr 的答案 (stackoverflow.com/a/49760497/5492956) 以获得更简洁的实现。
  • 编译器给出此警告Comparing non-optional value of type 'String' to 'nil' always returns true 并且不起作用
【解决方案3】:

swift 4swift 5 测试

let nwPathMonitor = NWPathMonitor()
nwPathMonitor.pathUpdateHandler = { path in

    if path.usesInterfaceType(.wifi) {
        print("Path is Wi-Fi")
    } else if path.usesInterfaceType(.cellular) {
            print("Path is Cellular")
    } else if path.usesInterfaceType(.wiredEthernet) {
            print("Path is Wired Ethernet")
    } else if path.usesInterfaceType(.loopback) {
            print("Path is Loopback")
    } else if path.usesInterfaceType(.other) {
            print("Path is other")
    }
}

nwPathMonitor.start(queue: .main)

【讨论】:

    【解决方案4】:

    正如@abba_de_bo 已经提到的:您可以获取当前的 SSID 并检查它是否已设置或为零。

    这是answer Apple 的爱斯基摩人对这个问题的回答:

    使用 Swift 中基于 CF 的 API 的诀窍是尽快将数据放入“Swift 空间”。

    func currentSSIDs() -> [String] {  
      guard let interfaceNames = CNCopySupportedInterfaces() as? [String] else {  
        return []  
      } 
    
      return interfaceNames.flatMap { name in  
    
        guard let info = CNCopyCurrentNetworkInfo(name as CFString) as? [String:AnyObject] else {  
          return nil  
        }  
        guard let ssid = info[kCNNetworkInfoKeySSID as String] as? String else {  
          return nil  
        }  
    
        return ssid  
      }  
    }
    

    请注意,这会返回一个名称数组;如何处理非标准案例(无元素,多个元素)取决于您。

    确保您import SystemConfiguration.CaptiveNetwork。否则,构建将失败并显示以下错误消息:

    • 使用未解析的标识符“CNCopySupportedInterfaces”
    • 使用未解析的标识符“CNCopyCurrentNetworkInfo”
    • 使用未解析的标识符“kCNNetworkInfoKeySSID”

    【讨论】:

    • 对于较新的 Swift 版本,flatMap(_:) 被标记为已弃用。所以请改用compactMap(_:)
    • @Jay 你能告诉我更多关于你偶然发现的问题的信息吗?
    • 当我在 WIFI 上时,数组是空的,当我使用正常的蜂窝数据时,数组返回空。
    • @Jay 你试过调试它吗?
    • 除了全天在不同类型的网络/wifis上进行测试之外,不确定如何调试它......有什么建议吗?
    【解决方案5】:

    您可以查看 Apple 官方示例以了解 Reachability: https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html

    var netStatus = reachability.currentReachabilityStatus()
    var connectionRequired = reachability.connectionRequired()
    var statusString = ""
    switch netStatus {
        case NotReachable:
            break
        case ReachableViaWWAN:
            //DATA
            break
        case ReachableViaWiFi:
            //WIFI
            break
    

    }

    【讨论】:

    • 同样的问题。它检查是否有通过 wifi 连接的互联网如果不返回 false 不检查 wifi 是否打开或关闭
    【解决方案6】:

    你可以用这个方法来检查:

    首先你导入这个框架:

    import SystemConfiguration.CaptiveNetwork
    
    
    func isWifiEnabled() -> Bool {
    
            var hasWiFiNetwork: Bool = false
            let interfaces: NSArray = CFBridgingRetain(CNCopySupportedInterfaces()) as! NSArray
    
            for interface  in interfaces {
               // let networkInfo = (CFBridgingRetain(CNCopyCurrentNetworkInfo(((interface) as! CFString))) as! NSDictionary)
                let networkInfo: [AnyHashable: Any]? = CFBridgingRetain(CNCopyCurrentNetworkInfo(((interface) as! CFString))) as? [AnyHashable : Any]
                if (networkInfo != nil) {
                    hasWiFiNetwork = true
                    break
                }
            }
            return hasWiFiNetwork;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 2011-10-20
      • 2013-03-11
      相关资源
      最近更新 更多