2015-04-17 133 views
1

任何人都可以在設備連接到WiFi時建議我使用目標c中的方法獲取iPhone設備的IP地址。當連接到WiFi時獲取ios設備的IP地址

基本上我想知道有沒有其他的辦法除了getifaddrs(&接口),當它連接到WiFi檢索設備的IP地址?

+1

找到替代解決方案的原因是什麼?你在'getifaddrs(&interfaces)'方法中面臨什麼缺點?如果是這樣,請在你的問題中加入。 – Gandalf

+0

我正面臨這個問題。 http://stackoverflow.com/questions/29676138/ioscrash-in-64-bit-device – rishu1992

+0

這很奇怪。我一直在使用相同的技術來獲取我的64位設備的IP地址,它的工作原理非常完美。你有沒有在其他64位設備上試過它?也許這個特定設備有問題。 – Gandalf

回答

0

在iOS類型系統(如iOS或Mac OS X)中獲取有關網絡接口的信息需要使用一些神祕的C API。這些API在,中具有不同的可見度。

如果您專門用Objective-C定位macOS,那麼是您的最佳解決方案。但是,如果您需要iOS兼容性,那麼您必須下降到較低級別的C API,例如getifaddrs(...)

如果您想要基於的解決方案,即使getifaddrs(...)附帶一些橋接頭要求(使其在框架中不可用)。

這裏是一個使用CFHostsockaddr_in struct的例子,它們可以在Swift和macOS和iOS(甚至在框架中)中工作。完整的示例請參見Host.swift

  1. 使用CFHost得到解決的信息,這將是CFDataCFArray OBJETS。

    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 structsockaddr_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的項目,我創建解決使用上述技術的這些問題。

+0

我可以問你請[如何提供個人開源庫?](https://meta.stackexchange.com/q/229085)?你已經複製並粘貼到很多不同的地方。 –

相關問題