【问题标题】:How to get ipaddress when connected to mobile data swift3连接到移动数据时如何获取IP地址swift 3
【发布时间】:2017-11-27 03:38:26
【问题描述】:

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

【问题讨论】:

  • 那个代码looks familiar! – 请注意,它显式检查“en0”接口(这是 iOS 设备上的 WiFi 接口)。要获取所有接口地址的列表,请查看stackoverflow.com/a/25627545/1187415
  • How to get Ip address in swift 的可能重复项。
  • @MartinR 感谢您的评论,是的,我现在也可以在使用移动数据时获取地址。但我有一个小问题。当我连接到 wifi 时,它会将 ipaddress 重新设置为第一个值,但是在移动数据上它返回为第 0 个位置,那么我如何检查它的移动数据或 wifi 以引用正确的索引?
  • @user1960169 移动数据接口名称前缀为 pdp_ip,wifi 前缀为 en
  • @user3441734 哦,谢谢,所以我需要做的就是检查 en0 和 pdp_ip?

标签: ios swift3 ip-address


【解决方案1】:

要在开启Wifi移动数据时获取设备的IPAddress,请使用以下方法:

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移动数据

希望能有所帮助! :)

【讨论】:

    猜你喜欢
    • 2012-11-03
    • 2011-08-14
    • 2020-03-29
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多