美文网首页
iOS 有关WIFI讯息获取

iOS 有关WIFI讯息获取

作者: ChanYuCung | 来源:发表于2018-08-29 14:48 被阅读0次

    iOS 有关WIFI讯息获取

        前几天碰到一个需求,是有关于监测App内获取网络权限的需求,由于之前没碰过这种需求 ,只能面向google编程,网上搜到的资料都是关于OC的。
    
        需求用到的类大部分是基于C,需要运用到大部分指针方面的写法。对于长期使用swift开发的人来说,写起来可能会感觉到很陌生。网上有关这种需求的写法的文章也不多,我只能自己一行一行地翻译成swift。 在这里记录一下。
    
    
    import SystemConfiguration.CaptiveNetwork
    
    import CoreTelephony
    
    

    流量监测

        //流量监测
        func getInterfaceBytes() -> UInt32 {
            var addrsPointer : UnsafeMutablePointer<ifaddrs>? = nil
            
            var inBytes : UInt32 = 0
            var outBytes : UInt32 = 0
            
            if getifaddrs(&addrsPointer) == 0 {
                var pointer = addrsPointer
                while pointer != nil {
                    if let addrs = pointer?.pointee {
                        let name = String(cString: addrs.ifa_name)
                        if addrs.ifa_addr.pointee.sa_family == UInt8(AF_LINK) {
                            if name.hasPrefix("en") { // Wifi
                                let networkData = unsafeBitCast(addrs.ifa_data, to: UnsafeMutablePointer<if_data>.self)
                                inBytes += networkData.pointee.ifi_ibytes
                                outBytes += networkData.pointee.ifi_obytes
                            } else if name.hasPrefix("pdp_ip") { // WWAN
                                let networkData = unsafeBitCast(addrs.ifa_data, to: UnsafeMutablePointer<if_data>.self)
                                inBytes += networkData.pointee.ifi_ibytes
                                outBytes += networkData.pointee.ifi_obytes
                            }
                        }
                    }
                    pointer = pointer?.pointee.ifa_next
                }
                freeifaddrs(addrsPointer)
            }
            return  inBytes
        }
    
    

    获取wifi地址

       func getWiFiAddress() -> String? {
            var address : String?
            // 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 {
                }
                freeifaddrs(ifaddr)
            }
            return address
        }
    

    获取wifi名称

       //获取wifi名称
        func fetchSSIDInfo() ->  String {
            var currentSSID = "WifiNameIsNil"
            
            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!
                        currentSSID = interfaceData![NSString(string: "SSID")] as! String
                    }
                }
            }
            return currentSSID
        }
    
    

    从手机状态栏获取当前网络状态

     //从状态栏获取网络状态
        func getNetworkTypeFromStatusBar() -> String {
            
            var type : Int = 0
            
            let app = UIApplication.shared
            let statusBar : UIView = app.value(forKeyPath: "statusBar") as! UIView
            if (statusBar is NSNull){
                return "Unknow";
            }
            
            if statusBar.isKind(of: NSClassFromString("UIStatusBar_Modern")!) {
                // 在 iPhone X 上 statusBar 属于 UIStatusBar_Modern ,需要特殊处理
                let currentData = statusBar.value(forKeyPath: "statusBar.currentData") as! NSObject
                //            BOOL wifiEnable = [[currentData valueForKeyPath:@"_wifiEntry.isEnabled"] boolValue];
                let wifiEnable = currentData.value(forKeyPath: "_wifiEntry.isEnabled") as! Bool
                //            // 这里不能用 _cellularEntry.isEnabled 来判断,该值即使关闭仍然有是 YES
                //            BOOL cellularEnable = [[currentData valueForKeyPath:@"_cellularEntry.type"] boolValue];
                return  wifiEnable ? "WiFi" : "CellularData"
                //                cellularEnable ? ZYNetworkTypeCellularData : ZYNetworkTypeOffline;
                
            } else {
                // 传统的状态栏
                let children = (statusBar.value(forKeyPath: "foregroundView") as! UIView).subviews
                for child in children {
                    if (child.isKind(of: NSClassFromString("UIStatusBarDataNetworkItemView")!)) {
                        
                        type = child.value(forKeyPath: "dataNetworkType") as! Int
                        return type == 5 ? "WiFi" : "CellularData"
                    }
                }
                
            }
            
            return ""
        }
    

    相关文章

      网友评论

          本文标题:iOS 有关WIFI讯息获取

          本文链接:https://www.haomeiwen.com/subject/qotkwftx.html