Ios 如何在连接到移动数据swift3时获取IP地址

Ios 如何在连接到移动数据swift3时获取IP地址,ios,swift3,ip-address,Ios,Swift3,Ip Address,我用这种方式获得电话的IP地址 func getIPAddress() -> String? { var address : String? var ifaddr : UnsafeMutablePointer<ifaddrs>? = nil if getifaddrs(&ifaddr) == 0 { var ptr = ifaddr while ptr != nil { defer {

我用这种方式获得电话的IP地址

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
}
func getIPAddress()->字符串?{
变量地址:字符串?
变量ifaddr:unsafemeutablepointer?=nil
如果getifaddrs(&ifaddr)==0{
var ptr=ifaddr
而ptr!=零{
延迟{ptr=ptr?.pointee.ifa_next}
让接口=ptr?.pointee
让addrFamily=interface?.ifa_addr.pointee.sa_family
如果addrFamily==UInt8(AF_INET)| | addrFamily==UInt8(AF_INET6){
如果let name:String=String(cString:.ifa_name)!),name=“en0”{
var hostname=[CChar](重复:0,计数:Int(NI_MAXHOST))
getnameinfo(接口?.ifa\u addr,socklen\u t((接口?.ifa\u addr.pointee.sa\u len)!),
&主机名,socklen\u t(hostname.count),
零,socklen_t(0),NI_numericost)
地址=字符串(cString:hostname)
}
}
}
FreeIFADRS(ifaddr)
}
回信地址
}

但当仅连接到wifi时,此功能会返回。如何在连接到移动数据时获取IP地址。

要在打开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
}
func getIPAddress()->字符串?{
变量地址:字符串?
//获取本地计算机上所有接口的列表:
var ifaddr:不可女性化的指针?
guard getifaddrs(&ifaddr)==0 else{return nil}
guard let firstAddr=ifaddr else{return nil}
//对于每个接口。。。
对于顺序中的ifptr(第一个:firstAddr,下一个:{$0.pointee.ifa_next}){
让接口=ifptr.pointee
//检查IPv4或IPv6接口:
让addrFamily=interface.ifa\u addr.pointee.sa\u family
如果addrFamily==UInt8(AF_INET)| | addrFamily==UInt8(AF_INET6){
//检查接口名称:
let name=String(cString:interface.ifa\u name)
如果名称==“en0”| |名称==“pdp|ip0”{
//将接口地址转换为人类可读的字符串:
var hostname=[CChar](重复:0,计数:Int(NI_MAXHOST))
getnameinfo(interface.ifa\u addr、socklen\u t(interface.ifa\u addr.pointee.sa\u len),
&主机名,socklen\u t(hostname.count),
零,socklen_t(0),NI_numericost)
地址=字符串(cString:hostname)
}
}
}
FreeIFADRS(ifaddr)
回信地址
}
这里的
if name==“en0”| | name==“pdp_ip0”
适用于Wifi移动数据


希望会有帮助!:)

要在打开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
}
func getIPAddress()->字符串?{
变量地址:字符串?
//获取本地计算机上所有接口的列表:
var ifaddr:不可女性化的指针?
guard getifaddrs(&ifaddr)==0 else{return nil}
guard let firstAddr=ifaddr else{return nil}
//对于每个接口。。。
对于顺序中的ifptr(第一个:firstAddr,下一个:{$0.pointee.ifa_next}){
让接口=ifptr.pointee
//检查IPv4或IPv6接口:
让addrFamily=interface.ifa\u addr.pointee.sa\u family
如果addrFamily==UInt8(AF_INET)| | addrFamily==UInt8(AF_INET6){
//检查接口名称:
let name=String(cString:interface.ifa\u name)
如果名称==“en0”| |名称==“pdp|ip0”{
//将接口地址转换为人类可读的字符串:
var hostname=[CChar](重复:0,计数:Int(NI_MAXHOST))
getnameinfo(interface.ifa\u addr、socklen\u t(interface.ifa\u addr.pointee.sa\u len),
&主机名,socklen\u t(hostname.count),
零,socklen_t(0),NI_numericost)
地址=字符串(cString:hostname)
}
}
}
FreeIFADRS(ifaddr)
回信地址
}
这里的
if name==“en0”| | name==“pdp_ip0”
适用于Wifi移动数据


希望会有帮助!:)

那个密码请注意,它会明确检查“en0”接口(iOS设备上的WiFi接口)。要获得所有接口地址的列表,请查看。可能重复的。@MartinR感谢您的评论是的,我现在也可以在移动数据上即时通讯时获取该地址。但我有个小问题。当我连接到wifi时,它将ipaddress作为第一个值重新注册,但在移动数据上,它将作为第0个位置返回,因此如何检查其移动数据或wifi以引用正确的索引?@user1960169对于移动数据,接口名称的前缀为pdp\U ip,因为wifi有前缀en@user3441734哦,谢谢,所以我需要做的就是检查en0和pdp_ip?那个代码请注意,它会明确检查“en0”接口(iOS设备上的WiFi接口)。要获得所有接口地址的列表,请查看。可能重复的。@MartinR感谢您的评论是的,我现在也可以在移动数据上即时通讯时获取该地址。但我有个小问题。当我连接到wifi时,它将ipaddress作为第一个值重新注册,但在移动数据上,它将作为第0个位置返回,因此如何检查其移动数据或wifi以引用正确的索引?@user1960169对于移动数据,接口名称的前缀为pdp\U ip,因为wifi有前缀en@user3441734哦,谢谢,所以我需要做的就是检查en0和pdp_ip?