swift获取热点Gateway地址

在网上搜了很多文章,给出的都是连接Wi-Fi后如何获取本机IP:

// 获取本机Wi-Fi IP
func getWIFIIP() -> String? {
        var address: String?
        var ifaddr: UnsafeMutablePointer<ifaddrs>? = nil
        
        guard getifaddrs(&ifaddr) == 0 else {
            return nil
        }
        
        guard let firstAddr = ifaddr else {
            return nil
        }
        
        for ifptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) {
            let interface = ifptr.pointee
            
            let addrFamily = interface.ifa_addr.pointee.sa_family
            if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) {
                let name = String(cString: interface.ifa_name)
                if name == "en0" {
                    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(cString: hostName)
                }
            }
        }
        freeifaddrs(ifaddr)
        return address
    }

获取路由器IP方式如下:

class NWPathMonitor

官方解释:
An observer that you use to monitor and react to network changes.

官方文档

首先引入Network库

// 监听所有网络类型的状态
let monitor = NWPathMonitor()
// 监听特定网络类型状态,主要就是wifi和cellular
let monitor = NWPathMonitor(requiredInterfaceType: .wifi)
// 判断当前是否正在使用某种网络
let ret = monitor.currentPath.usesInterfaceType(.wifi)
// 获取热点Gateway
    func getGatewayAddr() {
        // 监听Wi-Fi是否连接
        let monitor = NWPathMonitor(requiredInterfaceType: .wifi)
        // 连上Wi-Fi后获取IP
        monitor.pathUpdateHandler = { path in
            if path.status == .satisfied {
                let endpoint = String(describing: path.gateways[0])
                self.gatewayAddr = endpoint.components(separatedBy: (":"))[0]
                print("gatewayAddr: \(self.gatewayAddr)")
            }
        }
        
        // Starts monitoring path changes, and sets a queue on which to deliver path events.
        monitor.start(queue: DispatchQueue(label: "get gateway successed"))
    }

很多东西官方文档都有说明,中文互联网iOS的博客确实不好找,还是得好好学英语。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取手机SSID和BSSID可以使用iOS的System Configuration框架中的Captive Network API,具体代码如下: ```swift import SystemConfiguration.CaptiveNetwork func getWifiInfo() -> (ssid: String?, bssid: String?) { var ssid: String? var bssid: String? if let interfaces = CNCopySupportedInterfaces() as NSArray? { for interface in interfaces { if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as! CFString) as NSDictionary? { ssid = interfaceInfo[kCNNetworkInfoKeySSID as String] as? String bssid = interfaceInfo[kCNNetworkInfoKeyBSSID as String] as? String } } } return (ssid, bssid) } ``` 获取IP地址可以使用iOS的网络接口API,具体代码如下: ```swift import UIKit import SystemConfiguration func getIPAddress() -> String? { var address: String? var ifaddr: UnsafeMutablePointer<ifaddrs>? = nil if getifaddrs(&ifaddr) == 0 { var ptr = ifaddr while ptr != nil { let flags = Int32(ptr!.pointee.ifa_flags) var addr = ptr!.pointee.ifa_addr.pointee if ((flags & (IFF_UP|IFF_RUNNING)) == (IFF_UP|IFF_RUNNING)) && (addr.sa_family == UInt8(AF_INET) || addr.sa_family == UInt8(AF_INET6)) { var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) if (getnameinfo(&addr, socklen_t(addr.sa_len), &hostname, socklen_t(hostname.count), nil, socklen_t(0), NI_NUMERICHOST) == 0) { if let addressString = String(validatingUTF8:hostname) { if addr.sa_family == UInt8(AF_INET) { address = addressString } } } } ptr = ptr!.pointee.ifa_next } freeifaddrs(ifaddr) } return address } ``` 注意,获取IP地址需要在应用的Info.plist文件中添加`Privacy - Local Network Usage Description`键,并在值中添加描述,否则应用将被拒绝。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值