【发布时间】:2017-11-27 03:38:26
【问题描述】:
我通过这种方式获取手机的ipaddress。
func getIPAddress() -> String? {
var address : String?
var ifaddr : UnsafeMutablePointer<ifaddrs>? = nil
if getifaddrs(&ifaddr) == 0 {
var ptr = ifaddr
while ptr != nil {
defer { ptr = ptr?.pointee.ifa_next }
let interface = ptr?.pointee
let addrFamily = interface?.ifa_addr.pointee.sa_family
if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) {
if let name:String = String(cString: (interface?.ifa_name)!), name == "en0" {
var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
getnameinfo(interface?.ifa_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
}
但这仅在连接到 wifi 时返回。连接移动数据时如何获取ipaddress。
【问题讨论】:
-
那个代码looks familiar! – 请注意,它显式检查“en0”接口(这是 iOS 设备上的 WiFi 接口)。要获取所有接口地址的列表,请查看stackoverflow.com/a/25627545/1187415。
-
How to get Ip address in swift 的可能重复项。
-
@MartinR 感谢您的评论,是的,我现在也可以在使用移动数据时获取地址。但我有一个小问题。当我连接到 wifi 时,它会将 ipaddress 重新设置为第一个值,但是在移动数据上它返回为第 0 个位置,那么我如何检查它的移动数据或 wifi 以引用正确的索引?
-
@user1960169 移动数据接口名称前缀为 pdp_ip,wifi 前缀为 en
-
@user3441734 哦,谢谢,所以我需要做的就是检查 en0 和 pdp_ip?
标签: ios swift3 ip-address