连接到wifi时获取ios设备的IP地址

时间:2015-04-17 11:07:08

标签: ios objective-c wifi ip-address

当设备连接到WiFi时,有人可以建议我使用目标c中的方法来获取iPhone设备的IP地址。

基本上我想知道除了 getifaddrs(& interfaces)之外还有其他方法可以在设备连接到WiFi时检索设备的IP地址吗?

1 个答案:

答案 0 :(得分:0)

获取有关Unix类型系统(如iOS或Mac OS X)中的网络接口的信息,需要使用一些神秘的C API。这些API在中具有不同的可见度。

如果您使用Objective-C专门定位macOS,那么是您的最佳解决方案。但是,如果您需要iOS兼容性,那么您必须下载到较低级别的C API,例如getifaddrs(...)

如果您想要基于的解决方案,即使getifaddrs(...)也会附带一些桥接标头要求(使其在框架中无法使用)。

以下是使用CFHostsockaddr_in struct的示例,它可以在Swift以及macOS和iOS(甚至是Frameworks)中使用。有关完整的示例,请参阅Host.swift

  1. 使用CFHost获取地址信息,这将是CFArrayCFData对象。

    let sockaddrs = CFHostGetAddressing("apple.com", &resolved)?.takeRetainedValue() 
    
  2. 获取第一个对象

    let data = CFArrayGetValueAtIndex(sockaddrs, 0)
    
  3. 将字节转换为sockaddr struct

    var storage = sockaddr_storage()
    data.getBytes(&storage, length: sizeof(sockaddr_storage))
    
  4. 然后强制sockaddr struct加入sockaddr_in struct,以便我们可以使用

    let addr = withUnsafePointer(&storage) { UnsafePointer<sockaddr_in>($0).memory
    
  5. 使用inet_ntoa(...)功能将addr.sin_addr(IP地址)转换为C字符串。然后我们可以使用String(Cstring: encoding:)来获得一个很好的IP地址字符串。

    let address = String(CString: inet_ntoa(addr.sin_addr), encoding: NSUTF8StringEncoding)
    
  6. 这是一个名为Hostess.swift的GitHub项目,我使用上述技术解决了这些问题。

相关问题