当设备连接到WiFi时,有人可以建议我使用目标c中的方法来获取iPhone设备的IP地址。
基本上我想知道除了 getifaddrs(& interfaces)之外还有其他方法可以在设备连接到WiFi时检索设备的IP地址吗?
答案 0 :(得分:0)
获取有关Unix类型系统(如iOS或Mac OS X)中的网络接口的信息,需要使用一些神秘的C API。这些API在swift和objective-c,ios和mac-os-x中具有不同的可见度。
如果您使用Objective-C专门定位macOS,那么nshost是您的最佳解决方案。但是,如果您需要iOS兼容性,那么您必须下载到较低级别的C API,例如getifaddrs(...)
或cfhost。
如果您想要基于swift的解决方案,即使getifaddrs(...)
也会附带一些桥接标头要求(使其在框架中无法使用)。
以下是使用CFHost
和sockaddr_in struct
的示例,它可以在Swift以及macOS和iOS(甚至是Frameworks)中使用。有关完整的示例,请参阅Host.swift。
使用CFHost
获取地址信息,这将是CFArray
个CFData
对象。
let sockaddrs = CFHostGetAddressing("apple.com", &resolved)?.takeRetainedValue()
获取第一个对象
let data = CFArrayGetValueAtIndex(sockaddrs, 0)
将字节转换为sockaddr struct
var storage = sockaddr_storage()
data.getBytes(&storage, length: sizeof(sockaddr_storage))
然后强制sockaddr struct
加入sockaddr_in struct
,以便我们可以使用
let addr = withUnsafePointer(&storage) { UnsafePointer<sockaddr_in>($0).memory
使用inet_ntoa(...)
功能将addr.sin_addr
(IP地址)转换为C字符串。然后我们可以使用String(Cstring: encoding:)
来获得一个很好的IP地址字符串。
let address = String(CString: inet_ntoa(addr.sin_addr), encoding: NSUTF8StringEncoding)
这是一个名为Hostess.swift的GitHub项目,我使用上述技术解决了这些问题。