有什么方法可以使用Swift快速获取iOS上的默认网关IP?

时间:2019-10-22 11:51:35

标签: ios swift ip gateway

在使用swift获取iOS上的默认网关IP时遇到一些问题。我在苹果商店中找到了一个名为“ Net Analyzer”的应用程序,该应用程序可以获取默认网关IP,如下图所示。

enter image description here

在屏幕快照上,您可以看到默认网关IP,DNS服务器IP和设备IP地址。谁能给我一个提示,怎么做?

当前,我可以获取设备接口来获取设备IP,但是我想获取设备所连接的默认网关。

我正在使用当前代码来获取接口地址

func getIFAddresses() -> [String] {
        var addresses = [String]()

        // Get list of all interfaces on the local machine:
        var ifaddr : UnsafeMutablePointer<ifaddrs>?
        guard getifaddrs(&ifaddr) == 0 else { return [] }
        guard let firstAddr = ifaddr else { return [] }

        // For each interface ...
        for ptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) {
            let flags = Int32(ptr.pointee.ifa_flags)
            let addr = ptr.pointee.ifa_addr.pointee

            // Check for running IPv4, IPv6 interfaces. Skip the loopback interface.
            if ((flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING)) &&
                (addr.sa_family == UInt8(AF_INET) || addr.sa_family == UInt8(AF_INET6)) {

                // Convert interface address to a human readable string:
                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, socklen_t(0), NI_NUMERICHOST) == 0) {
                    let address = String(cString: hostname)
                    addresses.append(address)
                }
            }
        }

        freeifaddrs(ifaddr)
        return addresses
    }

顺便问一下,有什么方法可以将Wi-Fi接口与移动网络接口区分开吗?

1 个答案:

答案 0 :(得分:1)

获取网关

如果您能够使用iOS≥12,则可以使用Network框架。

NWPath获得的NWPathMonitor.pathUpdateHandler会将NWPath.gateways变量设置为网关IP。

let monitor = NWPathMonitor(requiredInterfaceType: .wifi)
monitor.pathUpdateHandler = { path in
    print(path.gateways)
}
monitor.start(queue: DispatchQueue(label: "nwpathmonitor.queue"))

从移动网络接口中区分Wi-Fi接口

ptr.pointee.ifa_name包含接口名称。 WiFi接口的接口名称为en0,单元接口的接口名称为pdp_ip0。它是cString,因此let interfaceName = String(cString: ptr.pointee.ifa_name)会将其转换为快速String