Swift3.0 Swift2.3 獲取IP地址 獲取閘道器地址
最近需要在Swift專案中獲取路由器的閘道器地址,在網上找了半天的程式碼也沒發現太多有價值的東西,而且大多都是OC程式碼,很少有Swift的相關程式碼,只找到了一個通過Swift程式碼獲取裝置IP的程式碼,最後實在沒辦法只能曲線救國了。
在路由器預設登入地址方面,主流品牌預設地址都是一樣的,但也有不少國際品牌或者不太出名的路由器品牌預設地址不一樣,以下一起來看:
絕大多數主流品牌路由器預設管理登入地址為:http://192.168.1.1 /或者 http://192.168.0.1/
其它品牌路由器預設登入地址彙總如下:
實達2110EH ROUTER路由器預設管理地址:
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.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
}
大家可以根據這個程式碼自己再修改為合適自己的程式碼使用。