获取WI-FI信息以及蜂窝网络信息

最近的项目中需要获取wifi的相关信息, 包括SSID, BSSID, IP, 以及手机是否开始蜂窝网络, 是否开启个人热点等, 所以这里做一个汇总, 记录一下.

注意: 以下所有代码均为swift 4.0, 如果需要低版本语言的写法, 介于篇幅, 就不一一列举了, 有需要的小伙伴可以私信留言.

检查是否有网络(false 没有网络,true 有网络)

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(MemoryLayout.size(ofValue: zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)
    
        let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) { (unSafePointer) in
            SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer.init(OpaquePointer.init(unSafePointer))!)
        }

        var flags: SCNetworkReachabilityFlags = []
        if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
            return false
        }

        let isReachable = flags.contains(.reachable)
        let needsConnection = flags.contains(.connectionRequired)

        return isReachable && !needsConnection
 }

获取当前wifi的ssid

func getSSidInfo() -> String {
        if let cfas: NSArray = CNCopySupportedInterfaces() {
            for cfa in cfas {
                if let dict = CFBridgingRetain(CNCopyCurrentNetworkInfo(cfa as! CFString)) {
                    let dic = dict as! NSDictionary
                    if let ssid = dic["SSID"] as? String {
                        return ssid
                    }
                }
            }
        }
        return "未连接"
    }

获取当前wifi的IP地址

func getIPAddress() -> String {
        var address = ""
        
        // Get list of all interfaces on the local machine:
        var ifaddr : UnsafeMutablePointer<ifaddrs>? = nil
        if getifaddrs(&ifaddr) == 0 {
            
            // For each interface ...
            var ptr = ifaddr
            while ptr != nil {
                let interface = ptr?.pointee
                
                // Check for IPv4 or IPv6 interface:
                let addrFamily = interface?.ifa_addr.pointee.sa_family
                if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) {
                    
                    // Check interface name:
                    let name = String(cString: (interface?.ifa_name)!)
                    if name == "en0" {
                        
                        // Convert interface address to a human readable string:
                        var addr = interface?.ifa_addr.pointee
                        var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
                        getnameinfo(&addr!, socklen_t(interface!.ifa_addr.pointee.sa_len),
                                    &hostname, socklen_t(hostname.count),
                                    nil, socklen_t(0), NI_NUMERICHOST)
                        address = String.init(cString: hostname)
                    }
                }
                ptr = ptr?.pointee.ifa_next
            }
            freeifaddrs(ifaddr)
        }
        return (address == "") ? "255.255.255.255" : address
    }

检测系统此时正在使用的wifi情况(SSID,BSSID(mac))

func getWifiInfo() -> (ssid: String, mac: String) {
        if let cfas: NSArray = CNCopySupportedInterfaces() {
            for cfa in cfas {
                if let dict = CFBridgingRetain(CNCopyCurrentNetworkInfo(cfa as! CFString)) {
                    let dic = dict as! NSDictionary
                    if let ssid = dic["SSID"] as? String, let bssid = dic["BSSID"] as? String {
                        return (ssid, bssid)
                    }
                }
            }
        }
        return ("未连接", "未知")
    }

获取手机当前所有的网络信息(便于蜂窝网络&个人热点的判断)

func getAllIfaName() -> [String] {
        var ifaNames = [String]()
        var ifaddr: UnsafeMutablePointer<ifaddrs>? = nil
        if getifaddrs(&ifaddr) == 0 {
            var temp_addr = ifaddr
            while temp_addr != nil {
                let interface = temp_addr?.pointee
                let addrFamily = interface?.ifa_addr.pointee.sa_family
                if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) {
                    let ifaName = String.init(utf8String: (interface?.ifa_name)!)
                    if ifaName != nil {
                        ifaNames.append(ifaName!)
                    }
                }
                temp_addr = temp_addr?.pointee.ifa_next
            }
        }
        return ifaNames
    }

判断手机是否连接蜂窝网络

func judgeCellularNetworkLinkStatus() -> Bool {
        let ifaNames = getAllIfaName()
        for item in ifaNames {
            if item.contains("pdp_ip") {
                return true
            }
        }
        return false
    }

判断手机是否开启个人热点(此方法通过遍历所有ipv4网卡,查询网卡名称是否包含“bridge”即可判断当前热点是否启动,但是并不能准确的判断出,因为只有两种情况下才会出现以上情况,1.当前有设备连上此热点, 2.曾经连过,但是后来断开,但是个人热点在这个过程中未重新启动过)

func judgeHotPointIsOpen() -> Bool {
        let ifaNames = getAllIfaName()
        for item in ifaNames {
            if item.contains("bridge") {
                return true
            }
        }
        return false
    }

处理wifi的BSSID转换为常用的mac地址

func getMacInAPStyle() -> String {
        let bssid = getWifiInfo().mac
        return bssidToDeviceMac(bssid: bssid).uppercased() // 转换为大写
    }

fileprivate func bssidToDeviceMac(bssid: String) -> String {
        let charAry = bssid.components(separatedBy: ":")
        // 补足数据中只有一位的问题, 便于后面的数据拼接
        var newCharAry = [String]()
        for item in charAry {
            var newItem = ""
            if item.length == 1 {
                newItem = "0" + item
            } else {
                newItem = item
            }
            newCharAry.append(newItem)
        }
        
        var newBssid = ""
        for item in newCharAry {
            newBssid += item
        }
        
        let decimal = newBssid.hexToDecimal()
        let mac = (decimal - 1).decimalToHex()
        return mac
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容