iOS获取IP地址

1,557 阅读1分钟
static func getLocalIPAddress() -> String {
        var address: String?
        
        // get list of all interfaces on the local machine
        var ifaddr: UnsafeMutablePointer<ifaddrs>? = nil
        guard getifaddrs(&ifaddr) == 0 else {
            return ""
        }
        guard let firstAddr = ifaddr else {
            return ""
        }
        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.hasPrefix("en") && (address == nil || address!.isIP() == false) {
                    // 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)
                    if let add = address, add.isIP(), add.hasPrefix("169.254") == false {
                        break
                    } else {
                        address = nil
                    }
                }
            }
        }
        
        freeifaddrs(ifaddr)
        
        return address ?? ""
    }