2015-11-03 11 views
5

私のプロジェクトでは、IPhoneのパブリックIPアドレスを取得する必要があります。私はちょうど別のURLを使用する助けなしにIPhonesのIPアドレスを抽出する方法を知りたいです。サードパーティのURLを使用せずにIPhoneのパブリックIPアドレスを取得する方法

注: - 私はこの1を使用しますが、ローカルIPアドレスを示し、私はパブリックIPアドレス

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 
} 

を必要とし、私はそれがローカルIP

を生成し、ヘッダファイルを使用して、私の迅速なプロジェクトで、このいずれかを使用自分のコンピュータ上の
+1

あなたはSOを試しましたか? http://stackoverflow.com/questions/7072989/iphone-ipad-osx-how-to-get-my-ip-address-programmatically?lq=1 –

+0

このリンクはあなたを助けます - http://stackoverflow.com/質問/ 30748480/swift-get-devices-ip-address – Vinayk

+0

Objective-Cコードが見つかりました。 :) –

答えて

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) 
} 

印刷物外部IPのための

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 

、あなたは外部の助けが必要サービス(迅速な特定ではありません:-))

+0

コードのおかげで、しかし、問題は、これは電話のIPを示しています、私はIPの場所と関連するデータにIphoneのパブリックIPを取得する必要があります。 :( –

+0

「パブリック」IPについて話すことで意味することは何ですか?コードには、パブリックIP(すべてのIPがLAN上でアクセス可能なIP)がリストされています。私は悲しいことに、あなたはそれのための外部サービスの助けが必要です。私はあなたがhttps://en.wikipedia.org/wiki/Network_address_translationを読むことをお勧めします – user3441734

+0

ええ、私は外部サービスを使用したくないです。ソリューション、それは問題です。外部サービスに頼ることができないので –

関連する問題