【问题标题】:The function getWiFiAddress() always returns nil?函数 getWiFiAddress() 总是返回 nil?
【发布时间】:2018-01-05 21:12:52
【问题描述】:

如果我打印接口名称没有名称“en0”,该函数总是返回 nil。我需要获取设备的本地 IP 地址,我该怎么做?

func getWiFiAddress() -> String? {
var address : String?

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

// For each interface ...
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 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

}

【问题讨论】:

    标签: ios swift ip-address


    【解决方案1】:

    你需要使用

    lo0

    本地地址

    func getWiFiAddress() -> String? {
        // Get list of all interfaces on the local machine:
        var ifaddr : UnsafeMutablePointer<ifaddrs>?
        guard getifaddrs(&ifaddr) == 0 else { return nil }
        guard let firstAddr = ifaddr else { return nil }
    
        // For each interface ...
        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 == "lo0" {
    
                    // Convert interface address to a human readable string:
                    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)
                    freeifaddrs(ifaddr)
                    return String(cString: hostname)
                }
            }
        }
        return nil
    }
    

    【讨论】:

    • lo0 用于环回接口...如果我们需要获取本地 LAN ip,我们需要将 en0 用于有线网络,将 en1 用于无线...
    【解决方案2】:

    我将它改为 en1 而不是 en0,它会获取我的本地 IP 地址....原因是 en0 用于有线或以太网,对于无线我们需要使用 en1。

    【讨论】:

      【解决方案3】:

      您没有为 ifaddr 设置任何值。

      【讨论】:

        猜你喜欢
        • 2012-09-15
        • 2017-03-28
        • 2015-03-05
        • 2014-08-25
        • 2016-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多