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

标签 ios objective-c wifi ip-address

任何人都可以建议我 objective-c 中的方法来在设备连接到WiFi时获取iPhone设备的IP地址。

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

最佳答案

获取有关 iOS 或 Mac OS X 等 Unix 类型系统中网络接口(interface)的信息需要使用一些晦涩难懂的 C API。这些 API 在 中具有不同程度的可见性。和 , .

如果您专门针对使用 Objective-C 的 macOS,则 是您最好的解决方案。但是,如果您需要 iOS 兼容性,则必须使用较低级别的 C API,例如 getifaddrs(...) .

如果你想要 基于解决方案,甚至 getifaddrs(...) 也带有一些桥接 header 要求(使其在框架中无法使用)。

这里是一个使用 CFHostsockaddr_in struct 的示例,它将在 Swift 以及 macOS 和 iOS 上工作(甚至在框架中)。请参阅Host.swift一个完整的工作示例。

  1. 使用CFHost获取寻址信息,这将是CFData对象的CFArray

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

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

    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)
    

这是一个名为 Hostess.swift 的 GitHub 项目我创建它是为了使用上述技术解决这些问题。

关于ios - 连接wifi时获取ios设备的IP地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29697505/

相关文章:

ios - 触发 UITapGesture 时从单元格的 subview 中获取单元格的引用

ios - 对 NSArray 结果进行排序很奇怪

ios - 调用 UIButton :setImage:forState makes button title disappear

php - 如何显示: "Error: no connection" in php when there's no internet connection?

android - 如何避免在标准安卓 WiFi 列表中重复 WiFi 网络?

linux - Wifi 不会在 BeagleBone 上持续运行

ios - iTunes 评论 URL 在 iOS9 中不起作用?

ios - A* 仅在某些情况下有效

objective-c - Cocoa 绑定(bind)到 NSTableView 选择

IOS:如何在创建上下文之前计算要绘制的文本大小?