任何人都可以建议我 objective-c 中的方法来在设备连接到WiFi时获取iPhone设备的IP地址。
基本上我想知道除了getifaddrs(&interfaces)之外还有其他方法可以在设备连接到WiFi时检索设备的IP地址吗?
最佳答案
获取有关 iOS 或 Mac OS X 等 Unix 类型系统中网络接口(interface)的信息需要使用一些晦涩难懂的 C API。这些 API 在 swift 中具有不同程度的可见性。和 objective-c , ios和 mac-os-x .
如果您专门针对使用 Objective-C 的 macOS,则 nshost是您最好的解决方案。但是,如果您需要 iOS 兼容性,则必须使用较低级别的 C API,例如 getifaddrs(...)
或 cfhost .
如果你想要 swift基于解决方案,甚至 getifaddrs(...)
也带有一些桥接 header 要求(使其在框架中无法使用)。
这里是一个使用 CFHost
和 sockaddr_in struct
的示例,它将在 Swift 以及 macOS 和 iOS 上工作(甚至在框架中)。请参阅Host.swift一个完整的工作示例。
使用
CFHost
获取寻址信息,这将是CFData
对象的CFArray
。let sockaddrs = CFHostGetAddressing("apple.com", &resolved)?.takeRetainedValue()
获取第一个对象
let data = CFArrayGetValueAtIndex(sockaddrs, 0)
将字节转换为
sockaddr 结构
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 项目我创建它是为了使用上述技术解决这些问题。
关于ios - 连接wifi时获取ios设备的IP地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29697505/