1. 程式人生 > >Swift3.0 Swift2.3 獲取IP地址 獲取閘道器地址

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", "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
}

大家可以根據這個程式碼自己再修改為合適自己的程式碼使用。