2015-11-03 10 views
5

Für mein Projekt muss ich die öffentliche IP-Adresse des IPhones abrufen, es sind so viele Beispiele verfügbar, die die öffentliche IP-Adresse mithilfe der externen URL anzeigen. Ich möchte nur wissen, wie man die IP-Adresse des IPhones ohne Hilfe einer anderen URL extrahiert.So erhalten Sie die öffentliche IP-Adresse des IPhone, ohne die URL eines Drittanbieters zu verwenden

Hinweis: - ich dieses verwendet, sondern zeigt nur die lokale IP-Adresse, ich brauche öffentliche IP-Adresse

func getIPAddress() -> [String] { 
    var addresses = [String]() 

    // Get list of all interfaces on the local machine: 
    var ifaddr : UnsafeMutablePointer<ifaddrs> = nil 
    if getifaddrs(&ifaddr) == 0 { 

     // For each interface ... 
     for (var ptr = ifaddr; ptr != nil; ptr = ptr.memory.ifa_next) { 
      let flags = Int32(ptr.memory.ifa_flags) 
      var addr = ptr.memory.ifa_addr.memory 

      // Check for running IPv4, IPv6 interfaces. Skip the loopback interface. 
      if (flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING) { 
       if addr.sa_family == UInt8(AF_INET) || addr.sa_family == UInt8(AF_INET6) { 

        // Convert interface address to a human readable string: 
        var hostname = [CChar](count: Int(NI_MAXHOST), repeatedValue: 0) 
        if (getnameinfo(&addr, socklen_t(addr.sa_len), &hostname, socklen_t(hostname.count), 
         nil, socklen_t(0), NI_NUMERICHOST) == 0) { 
          if let address = String.fromCString(hostname) { 
           addresses.append(address) 
          } 
        } 
       } 
      } 
     } 
     freeifaddrs(ifaddr) 
    } 

    return addresses 
} 

ich diese in meinem schnellen Projekt verwendet eine Header-Datei unter Verwendung, erzeugt es Local IP

+1

Hast du SO versucht? http://stackoverflow.com/questions/7072989/iphone-ipad-osx-how-to-get-my-ip-address-programmatically?lq=1 –

+0

dieser Link kann Ihnen helfen - http://stackoverflow.com/ Fragen/30748480/swift-get-devices-ip-adresse – Vinayk

+0

Einige Objective-C-Codes gefunden, könnten Sie mir bitte die schnelle geben? :) –

Antwort

1
import Darwin 

var hostName = [Int8](count: 255, repeatedValue: 0) 
gethostname(&hostName, hostName.count) 

var hints = addrinfo() 
var res = UnsafeMutablePointer<addrinfo>() 
var p = UnsafeMutablePointer<addrinfo>() 
var p4 = UnsafeMutablePointer<sockaddr_in>() 
var p6 = UnsafeMutablePointer<sockaddr_in6>() 

hints.ai_flags = AI_ALL 
hints.ai_family = PF_UNSPEC 
hints.ai_socktype = SOCK_STREAM 
var ipstr = [CChar](count: Int(INET6_ADDRSTRLEN), repeatedValue: 0) 

print("List of IP addresses on host \(String.fromCString(hostName)!)\n") 

if getaddrinfo(hostName, "0", &hints, &res) == 0 { 

    var ipFamily = "" 
    var s: Int32 = 0 
    var port: in_port_t = 0 
    for(p = res; p != nil; p = p.memory.ai_next) { 

     switch p.memory.ai_family { 
     case PF_INET: 
      p4 = UnsafeMutablePointer<sockaddr_in>(p.memory.ai_addr) 
      inet_ntop(AF_INET, &p4.memory.sin_addr, &ipstr, socklen_t(INET6_ADDRSTRLEN)) 
      ipFamily = "IPv4" 
      port = p4.memory.sin_port.bigEndian 
     case PF_INET6: 
      p6 = UnsafeMutablePointer<sockaddr_in6>(p.memory.ai_addr) 
      inet_ntop(AF_INET6, &p6.memory.sin6_addr, &ipstr, socklen_t(INET6_ADDRSTRLEN)) 
      ipFamily = "IPv6" 
      port = p6.memory.sin6_port.bigEndian 
     default: 

      break 
     } 
     print("\t\(ipFamily):", String.fromCString(ipstr)!) 

    } 
    // free unmanaged memmory !!!!! 
    freeaddrinfo(res) 
} 

druckt auf meinem eigenen Computer

List of IP addresses on host Ivos-MacBook.local 

    IPv6: fe80::225:ff:fe40:9c72 
    IPv6: 2a02:130:200:1350:225:ff:fe40:9c72 
    IPv4: 192.168.1.106 

für externe IP, benötigen Sie Hilfe von externen Service (nicht swift specific :-))

+0

Danke für den Code, aber das Problem ist, das zeigt Telefon IP, muss ich das Iphone öffentliche IP, IP-Standort und zugehörige Daten zu bekommen. :( –

+0

Was meinst du mit "öffentliche" IP? Der Code listet alle öffentlichen IPs (IP, über die das Gerät in Ihrem LAN zugänglich ist). Es scheint, Sie suchen nach der Art, wie Sie externe IP Ihres Geräts erhalten .wie ich traurig bin, benötigst du Hilfe von externem Dienst dafür. Ich empfehle dir, https://en.wikipedia.org/wiki/Network_address_translation zu lesen – user3441734

+0

Yeah, ich möchte nicht externen Dienst verwenden. Ich benötige eine interne Kodierung Lösung, das ist das Problem, weil nicht auf externe Dienste verlassen können –