Swift3.0 Swift2.3 获取IP地址 获取网关地址

最近需要在Swift项目中获取路由器的网关地址,在网上找了半天的代码也没发现太多有价值的东西,而且大多都是OC代码,很少有Swift的相关代码,只找到了一个通过Swift代码获取设备IP的代码,最后实在没办法只能曲线救国了。

在路由器默认登录地址方面,主流品牌默认地址都是一样的,但也有不少国际品牌或者不太出名的路由器品牌默认地址不一样,以下一起来看:
绝大多数主流品牌路由器默认管理登录地址为:http://192.168.1.1 /或者 http://192.168.0.1/

其它品牌路由器默认登录地址汇总如下:

实达2110EH ROUTER路由器默认管理地址: http://192.168.10.1/

D-LINK路由器默认管理地址: http://192.168.0.1

阿尔法路由器默认管理地址: http://192.168.18.1

全向QL1680路由器默认管理地址: http://10.0.0.2

sunrise DSL-802E_R3A路由器默认管理地址: http://10.0.0.2/

GVC DSL-802E/R3A路由器默认管理地址: http://10.0.0.2/

艾玛 701g路由器默认管理地址: http://192.168.101.1或者http://192.168.0.1/

实达2110EH ROUTER路由器默认管理地址: http://192.168.10.1/

我这里有两个品牌的路由器,网关分别是:
TP-Link http://192.168.1.1/
小米 http://192.168.31.1/
华为 http://192.168.3.1/

根据以上的总结,这个网关大体都差不多的,我们可以通过获取设备的IP地址来修改为网关的地址,不过这种方法纯属无奈之举,目前的水平达不到,只能先这样用着了。

下面上代码:

--- Swift 2.3 ---

// ----- 获取 IP 地址 前提是你需要在桥接头文件里加上 #include <ifaddrs.h>
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 ...
        for (var ptr = ifaddr; ptr != nil; ptr = ptr.memory.ifa_next) {
            let interface = ptr.memory

            // Check for IPv4 or IPv6 interface:
            let addrFamily = interface.ifa_addr.memory.sa_family
            if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) {

                // Check interface name:
                if let name = String.fromCString(interface.ifa_name) where name == "en0" {

                    // Convert interface address to a human readable string:
                    var addr = interface.ifa_addr.memory
                    var hostname = [CChar](count: Int(NI_MAXHOST),repeatedValue: 0)
                    getnameinfo(&addr,socklen_t(interface.ifa_addr.memory.sa_len),&hostname,socklen_t(hostname.count),nil,socklen_t(0),NI_NUMERICHOST)
                    address = String.fromCString(hostname)!
                }
            }
        }
        freeifaddrs(ifaddr)
    }
    var ad = ["0","0","0"]
    ad = address.componentsSeparatedByString(".") // 把获取到的手机IP拆分开放到数组ad中
    ad[3] = "1" // 将最后一位强制修改为1
    address = ad[0] + "." + ad[1] + "."  + ad[2] + "."  + ad[3] // 再把修改后的ad数组组合成String
    print(address) // 看看修改结果
    return address // 返回值
}

思路就是把获取到的设备IP地址的最后一位手动修改为”1”,前面三位不需要修改,比如我的手机ip地址是 192.168.31.212,所以网关地址就是192.168.31.1。

这是一种比较无奈的方法,但是关键时刻也不能不说是一种思路。这种方法能适应大多数的路由器,分寸大家自己掌握,我的项目是允许的,先用着,以后再优化。

最近苹果更新了Swift3.0,这里更新一下代码。

--- Swift 3 ---

// ----- 获取 IP 地址 前提是你需要在桥接头文件里加上 #include <ifaddrs.h> 
func getLocalIPAddressForCurrentWiFi() -> String? {
    var address: String?

    // get list of all interfaces on the local machine 
    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

        // 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(cString: hostName)
            }
        }
    }
    freeifaddrs(ifaddr)
    return address
}

大家可以根据这个代码自己再修改为合适自己的代码使用。

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...