Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift - Get device's WIFI IP Address

I need to get IP Address of iOS device in Swift. This is not a duplicate of other questions about this! I need to get only WiFi IP address, if there is no wifi ip address - I need to handle it. There are a few questions about it on Stack Overflow, but there are only functions that return ip addresses. For example (from How to get Ip address in swift):

func getIFAddresses() -> [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 } 

Here I get 2 values - address from mobile internet(I think) and WiFi address I need. Is there any other way to get ONLY WiFi IP Address?

like image 630
Nikita Zernov Avatar asked Jun 10 '15 06:06

Nikita Zernov


People also ask

How do I find the IP address of a device on my Wi-Fi?

How do I identify an unknown device on my network? To see all of the devices connected to your network, type arp -a in a Command Prompt window. This will show you the allocated IP addresses and the MAC addresses of all connected devices.

How do I find my IP address in Swift?

Swift 4 - Get device's IP Address:h> in your bridging header. This is the framework needed to get IP address. Getting a "Non-optional expression of type 'String' used in a check for optionals" warning.

How do I find the IP address of a specific device?

Type ipconfig /all at the command prompt to check the network card settings. The MAC address and IP address are listed under the appropriate adapter as Physical Address and IPv4 Address. Note: If you do not see the Physical Address and IPv4 Address, type ~ cd at the command prompt, then repeat step 3.

How do I find the IP address of someone else's Wi-Fi?

Starting with the simplest way to find someone's IP address is to use one of the many IP lookup tools available online. Resources such as WhatIsMyIPAddress.com or WhatIsMyIP.com offer tools to enter an IP address and search for its free public registry results.


1 Answers

According to several SO threads (e.g. What exactly means iOS networking interface name? what's pdp_ip ? what's ap?), the WiFi interface on an iOS device always has then name "en0".

Your code (which seems to be what I answered at How to get Ip address in swift :) retrieves a list of the IP addresses of all running network interfaces. It can easily be modified to return only the IP address of the "en0" interface, and actually that is what I originally had answered at that thread (and this is just a Swift translation of the answer to how to get ip address of iphone programmatically):

// Return IP address of WiFi interface (en0) as a String, or `nil` func getWiFiAddress() -> String? {     var address : String?      // Get list of all interfaces on the local machine:     var ifaddr : UnsafeMutablePointer<ifaddrs> = nil     if getifaddrs(&ifaddr) == 0 {          // For each interface ...         var ptr = ifaddr         while ptr != nil {             defer { ptr = ptr.memory.ifa_next }              let interface = ptr.memory              // Check for IPv4 or IPv6 interface:             let addrFamily = interface.ifa_addr.memory.sa_family             if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) {                  // Check interface name:                 if let name = String.fromCString(interface.ifa_name) where name == "en0" {                      // Convert interface address to a human readable string:                     var hostname = [CChar](count: Int(NI_MAXHOST), repeatedValue: 0)                     getnameinfo(interface.ifa_addr, socklen_t(interface.ifa_addr.memory.sa_len),                                 &hostname, socklen_t(hostname.count),                                 nil, socklen_t(0), NI_NUMERICHOST)                     address = String.fromCString(hostname)                 }             }         }         freeifaddrs(ifaddr)     }      return address } 

Usage:

if let addr = getWiFiAddress() {     print(addr) } else {     print("No WiFi address") } 

Update for Swift 3: In addition to adopting the code to the many changes in Swift 3, iterating over all interfaces can now use the new generalized sequence() function:

Do NOT forget to add #include <ifaddrs.h> in your bridging header

// Return IP address of WiFi interface (en0) as a String, or `nil` func getWiFiAddress() -> String? {     var address : String?      // Get list of all interfaces on the local machine:     var ifaddr : UnsafeMutablePointer<ifaddrs>?     guard getifaddrs(&ifaddr) == 0 else { return nil }     guard let firstAddr = ifaddr else { return nil }      // For each interface ...     for ifptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) {         let interface = ifptr.pointee          // Check for IPv4 or IPv6 interface:         let addrFamily = interface.ifa_addr.pointee.sa_family         if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) {              // Check interface name:             let name = String(cString: interface.ifa_name)             if  name == "en0" {                  // Convert interface address to a human readable string:                 var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))                 getnameinfo(interface.ifa_addr, socklen_t(interface.ifa_addr.pointee.sa_len),                             &hostname, socklen_t(hostname.count),                             nil, socklen_t(0), NI_NUMERICHOST)                 address = String(cString: hostname)             }         }     }     freeifaddrs(ifaddr)      return address } 

For those of you who came looking for more than the WIFI IP you could modify this code a little

func getAddress(for network: Network) -> String? {     var address: String?      // Get list of all interfaces on the local machine:     var ifaddr: UnsafeMutablePointer<ifaddrs>?     guard getifaddrs(&ifaddr) == 0 else { return nil }     guard let firstAddr = ifaddr else { return nil }      // For each interface ...     for ifptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) {         let interface = ifptr.pointee          // Check for IPv4 or IPv6 interface:         let addrFamily = interface.ifa_addr.pointee.sa_family         if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) {              // Check interface name:             let name = String(cString: interface.ifa_name)             if name == network.rawValue {                  // Convert interface address to a human readable string:                 var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))                 getnameinfo(interface.ifa_addr, socklen_t(interface.ifa_addr.pointee.sa_len),                             &hostname, socklen_t(hostname.count),                             nil, socklen_t(0), NI_NUMERICHOST)                 address = String(cString: hostname)             }         }     }     freeifaddrs(ifaddr)      return address } 
enum Network: String {     case wifi = "en0"     case cellular = "pdp_ip0"     //... case ipv4 = "ipv4"     //... case ipv6 = "ipv6" } 

Then we have access to the cellular IP as well.

guard let wifiIp = getAddress(for: .wifi) else { return }

&

guard let cellularIp = getAddress(for: .cellular) else { return }

like image 181
Martin R Avatar answered Sep 21 '22 12:09

Martin R