【问题标题】:Get IP address of ios device when connectec to wifi连接wifi时获取ios设备的IP地址
【发布时间】:2015-04-17 11:07:08
【问题描述】:

当设备连接到 WiFi 时,谁能建议我在目标 c 中获取 iPhone 设备 IP 地址的方法。

基本上我想知道除了getifaddrs(&interfaces)还有什么方法可以在设备连接WiFi时获取设备的IP地址?

【问题讨论】:

  • 寻找替代解决方案的原因是什么?您是否面临getifaddrs(&interfaces) 方法的任何缺点?如果是这样,请将其包含在您的问题中。
  • 这很奇怪。我一直在使用相同的技术来获取我的 64 位设备的 IP 地址,并且效果很好。您是否在其他 64 位设备上尝试过?该特定设备可能有问题。
  • 如果我将方法移动到 appdelegate 类或任何其他类,它工作正常。当我从需要 IP 地址的同一个类中调用该方法时,这崩溃了。估计是内存问题!

标签: ios objective-c wifi ip-address


【解决方案1】:

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

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

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

这是一个使用 CFHostsockaddr_in struct 的示例,它们可以在 Swift 以及 macOS 和 iOS(甚至在框架中)上运行。请参阅 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)
    

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

【讨论】:

猜你喜欢
  • 2023-03-03
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 2017-04-01
  • 2022-01-18
相关资源
最近更新 更多