2017-06-14 113 views
1

如何在不使用任何使用Swift 3编程语言的第三方库的情况下获取设备IP地址。其实我已经使用下面的代码来获取IP地址。获取iPhone或iPad设备的IP地址使用Swift 3

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

var ifaddr : UnsafeMutablePointer<ifaddrs> = nil 
if getifaddrs(&ifaddr) == 0 { 

    var ptr = ifaddr 
    while ptr != nil { 
     defer { ptr = ptr.memory.ifa_next } 

     let interface = ptr.memory 

     let addrFamily = interface.ifa_addr.memory.sa_family 
     if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) { 

      if let name = String.fromCString(interface.ifa_name) where name == "en0" { 

       var hostname = [CChar](count: Int(NI_MAXHOST), repeatedValue: 0) 
       getnameinfo(interface.ifa_addr, socklen_t(interface.ifa_addr.memory.sa_len), 
          &hostname, socklen_t(hostname.count), 
          nil, socklen_t(0), NI_NUMERICHOST) 
       address = String.fromCString(hostname) 
      } 
     } 
    } 
    freeifaddrs(ifaddr) 
} 

return address 

}

但UnsafeMutablePointer语法是行不通的。它通过语法错误。我是否需要导入任何框架试图帮助我。

+0

这看起来像https://stackoverflow.com/a/30754194/1187415的代码,这已经为斯威夫特3前段时间更新。 –

回答

0

在桥接头中添加#include<ifaddrs.h>

这是获取IP地址所需的框架。

您也可以参考以下链接:

Swift - Get device's IP Address

+0

根本没有必要..还有其他可能性如何获得所有接口的所有IP4/IP6地址所需的信息。看到我的答案。 – user3441734

1

试试这个(无桥接报是必要的,在游乐场它作品)

//: Playground - noun: a place where people can play 

import Darwin 

var temp = [CChar](repeating: 0, count: 255) 
enum SocketType: Int32 { 
    case SOCK_STREAM = 0, SOCK_DGRAM, SOCK_RAW 
} 

// host name 
gethostname(&temp, temp.count) 
// create addrinfo based on hints 
// if host name is nil or "" we can connect on localhost 
// if host name is specified (like "computer.domain" ... "My-MacBook.local") 
// than localhost is not aviable. 
// if port is 0, bind will assign some free port for us 

var port: UInt16 = 0 
let hosts = ["localhost", String(cString: temp)] 
var hints = addrinfo() 
hints.ai_flags = 0 
hints.ai_family = PF_UNSPEC 

for host in hosts { 
    print("\n\(host)") 
    print() 

    // retrieve the info 
    // getaddrinfo will allocate the memory, we are responsible to free it! 
    var info: UnsafeMutablePointer<addrinfo>? 
    defer { 
     if info != nil 
     { 
      freeaddrinfo(info) 
     } 
    } 
    var status: Int32 = getaddrinfo(host, String(port), nil, &info) 
    guard status == 0 else { 
     print(errno, String(cString: gai_strerror(errno))) 
     continue 
    } 
    var p = info 
    var i = 0 
    var ipFamily = "" 
    var ipType = "" 
    while p != nil { 
     i += 1 
     // use local copy of info 
     var _info = p!.pointee 
     p = _info.ai_next 

     switch _info.ai_family { 
     case PF_INET: 
      _info.ai_addr.withMemoryRebound(to: sockaddr_in.self, capacity: 1, { p in 
       inet_ntop(AF_INET, &p.pointee.sin_addr, &temp, socklen_t(temp.count)) 
       ipFamily = "IPv4" 
      }) 
     case PF_INET6: 
      _info.ai_addr.withMemoryRebound(to: sockaddr_in6.self, capacity: 1, { p in 
       inet_ntop(AF_INET6, &p.pointee.sin6_addr, &temp, socklen_t(temp.count)) 
       ipFamily = "IPv6" 
      }) 
     default: 
      continue 
     } 
     print(i,"\(ipFamily)\t\(String(cString: temp))", SocketType(rawValue: _info.ai_socktype)!) 

    } 

} 

它打印在我电脑

localhost 

1 IPv6 ::1 SOCK_RAW 
2 IPv6 ::1 SOCK_DGRAM 
3 IPv4 127.0.0.1 SOCK_RAW 
4 IPv4 127.0.0.1 SOCK_DGRAM 

Ivos-MacBook-Pro.local 

1 IPv6 fe80::18a2:e892:fbd7:558e SOCK_RAW 
2 IPv6 fe80::18a2:e892:fbd7:558e SOCK_DGRAM 
3 IPv4 172.20.10.3 SOCK_RAW 
4 IPv4 172.20.10.3 SOCK_DGRAM 
+0

不错,为我工作,纯粹Swift 3 – DwarDoh

+0

以上iOS 10和模拟器。没有在iPad 2和iOS 9上工作。对于IPv4,只返回本地主机信息127.0.0.1,而不是设备的,并且这个msg:“warning:无法执行支持代码来读取进程中的Objective-C类数据。可用类型信息的质量“。 – DwarDoh

+0

iPhone 6,iOS 10上的同样问题。没有设备IP返回。获取此信息:“警告:在主线程上调用mDNSResponder的Libinfo 0未知错误 警告:无法执行支持代码来读取进程中的Objective-C类数据,这可能会降低可用类型信息的质量。 – DwarDoh

2

我做了以下事情以获取设备的确切IP地址。由于我想包含更新后的代码以使用Swift 3获取IP地址,因此我在此发布答案。在你的桥接报从Swift - Get device's IP Address

  1. 简称添加#include<ifaddrs.h>

  2. ,以获取IP地址创建下面的函数。

    func getIP()-> 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 } // memory has been renamed to pointee in swift 3 so changed memory to pointee 
    
         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" { // String.fromCString() is deprecated in Swift 3. So use the following code inorder to get the exact IP Address. 
           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 
    } 
    
  3. 为了获得IP地址,print(getIP())

为了验证: - >转到设置 - >无线网络 - >点击我的象征 - >您可以检查您的设备IP地址。 IP Address in my iPhone

输出截图:Output