任何人都可以在設備連接到WiFi時建議我使用目標c中的方法獲取iPhone設備的IP地址。當連接到WiFi時獲取ios設備的IP地址
基本上我想知道有沒有其他的辦法除了getifaddrs(&接口),當它連接到WiFi檢索設備的IP地址?
任何人都可以在設備連接到WiFi時建議我使用目標c中的方法獲取iPhone設備的IP地址。當連接到WiFi時獲取ios設備的IP地址
基本上我想知道有沒有其他的辦法除了getifaddrs(&接口),當它連接到WiFi檢索設備的IP地址?
在iOS類型系統(如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(甚至在框架中)中工作。完整的示例請參見Host.swift。
使用CFHost
得到解決的信息,這將是CFData
的CFArray
OBJETS。
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的項目,我創建解決使用上述技術的這些問題。
我可以問你請[如何提供個人開源庫?](https://meta.stackexchange.com/q/229085)?你已經複製並粘貼到很多不同的地方。 –
找到替代解決方案的原因是什麼?你在'getifaddrs(&interfaces)'方法中面臨什麼缺點?如果是這樣,請在你的問題中加入。 – Gandalf
我正面臨這個問題。 http://stackoverflow.com/questions/29676138/ioscrash-in-64-bit-device – rishu1992
這很奇怪。我一直在使用相同的技術來獲取我的64位設備的IP地址,它的工作原理非常完美。你有沒有在其他64位設備上試過它?也許這個特定設備有問題。 – Gandalf