乐闻世界logo
搜索文章和话题

How to get Ip address in swift

1 个月前提问
1 个月前修改
浏览次数16

1个答案

1

在 Swift 中获取设备的 IP 地址可以通过一些特定的网络接口函数来实现。具体来说,可以使用 getifaddrs() 函数来遍历设备的所有网络接口,并识别出与这些接口相关的 IP 地址。下面是一个基于 Swift 的示例代码,展示了如何获取当前设备的 IP 地址:

swift
import Foundation import SystemConfiguration func getIPAddress() -> String? { var address: String? var ifaddr: UnsafeMutablePointer<ifaddrs>? 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_LOOPBACK)) == (IFF_UP|IFF_RUNNING) { if addr?.sa_family == UInt8(AF_INET) || addr?.sa_family == UInt8(AF_INET6) { var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) if getnameinfo(ptr?.pointee.ifa_addr, socklen_t((addr?.sa_len)!), &hostname, socklen_t(hostname.count), nil, 0, NI_NUMERICHOST) == 0 { if let addressString = String(validatingUTF8: hostname) { if addr?.sa_family == UInt8(AF_INET) { // 只获取IPv4地址 address = addressString break } } } } } ptr = ptr?.pointee.ifa_next } freeifaddrs(ifaddr) } return address }

这个函数首先定义一个可变指针 ifaddr 用来存储网络接口地址结构体。通过调用 getifaddrs(&ifaddr) 函数,我们可以填充这个结构体链表,包含了设备所有的网络接口信息。

函数接下来遍历这个链表,检查每一个网络接口。通过检查接口的标志,我们只关注那些已经激活的并且正在运行的接口,同时忽略环回地址。通过判断 sa_family 属性,我们可以区分 IP 地址是 IPv4 还是 IPv6。在这个示例中,我们只考虑 IPv4 地址。

使用 getnameinfo() 函数可以将网络地址转化为一个字符数组,即 IP 地址的字符串形式。最后,如果成功找到了 IPv4 地址,我们将其保存在 address 变量中并返回。

请注意,由于获取 IP 地址涉及到底层网络配置,这段代码最好在真实设备上运行,而不是模拟器。此外,考虑到网络配置可能会改变,这种方法获取的 IP 地址可能会随着网络环境的变动而变动。

2024年8月5日 10:06 回复

你的答案