ios - 连接到移动数据swift 3时如何获取IP地址

标签 ios swift3 ip-address

我通过这种方式获取手机的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。

最佳答案

要获取打开Wifi移动数据 的设备的IP 地址,请使用以下方法:

func getIPAddress() -> 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" || name == "pdp_ip0" {

                // 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
}

此处 if name == "en0"|| name == "pdp_ip0" 适用于Wifi移动数据

希望对您有所帮助! :)

关于ios - 连接到移动数据swift 3时如何获取IP地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44723431/

相关文章:

ios - 由于图像存储导致内存崩溃

ios - 带有延迟标题和消息的 actionSheet 样式警报

ios - 我的用户默认设置不保存我的 slider 值 - Swift 3

ios - 在用户注销时使 iOS 设备推送 token 无效

swift3 - swift 3 : How to write Equatable func

ios - 如何为所有按钮定义单个 UILongPressGestureRecognizer?在 swift 3

javascript - 使用 jquery 从 HTTPS 托管网站获取客户端的 IP 地址

java - spring security 从同一个ip地址多次登录

mysql - 无法使用外部IP地址连接到MySQL数据库

iphone - handleOpenURL 仅在应用程序已启动时有效,在应用程序关闭时崩溃