Swift – Get device's 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?

  • Jumpy UISlider when scrubbing - Using UISlider with AVPlayer
  • In Interface Builder, how I do to resize correctly this image to make it device specific?
  • Underline text in a UITextView
  • iPhone upload multipart file using AFNetworking
  • How do I create launch images for iPhone 6 / 6 Plus Landscape Only Apps?
  • NSUserDefaults and KVO issues
  • 4 Solutions Collect From Internet About “Swift – Get device's IP Address”

    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
    }
    

    Create bridging header and Include #include <ifaddrs.h> in it.

    then write this method

    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
    }
    

    when I call this method in my viewController like var arr : NSArray = self.getIFAddresses() I get perfect response in my console like

    IP 🙁
    “10.0.0.94”
    )

    from this array you can access it where ever u want.
    Hope it helps

    You can fetch IP address using the code below:

    Note : I’ve used reachability so that it captures new IP address in case WiFi is changed to another.

    1. In Podfile file

      pod 'ReachabilitySwift' and then install pod

    2. In AppDelegate.swift file import ReachabilitySwift

      Note : If it prompts an error that Could not find ReachabilitySwift module then simply copy and paste this. It works!

    3. didFinishLaunchingOptions function

      NotificationCenter.default.addObserver(self, selector: #selector(self.reachabilityChanged), name: ReachabilityChangedNotification, object: reachability)
      
      do{
          try reachability.startNotifier()
      }
      catch {
          print("could not start reachability notifier")
      } 
      
    4. Then copy paste below code in AppDelegate file

      func reachabilityChanged(note: NSNotification) {
      
          let reachability = note.object as! Reachability
      
          if reachability.isReachable {
              if reachability.isReachableViaWiFi {
                  print("Reachable via WiFi")
              } else {
                  print("Reachable via Cellular")
              }
      
              setIPAddress()
          } else {
              ipAddress = "" // No IP captures
              print("Network not reachable")
          }
      }
      
      func setIPAddress() {
          if let addr = self.getWiFiAddress() {
              print("ipAddress : \(addr)")
              ipAddress = addr
          } else {
              ipAddress = "" // No IP captures
              print("No WiFi address")
          }
      }
      
      // 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 addr = interface.ifa_addr.pointee
                      var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
                      getnameinfo(&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
      }
      
    5. Add this in Bridging-Header file #include OpeningAngleBracket ifaddrs.h ClosingAngleBracket

      In case you don’t have this file then you can create it Check this link

    6.

    func applicationWillEnterForeground(_ application: UIApplication) {
            // Post notification
            NotificationCenter.default.post(name: ReachabilityChangedNotification, object: reachability)
            // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
        }
    
    1. If you want to remove observer, then:

      reachability.stopNotifier()  
      
      NSNotificationCenter.defaultCenter().removeObserver(self,name: ReachabilityChangedNotification,object: reachability)
      
    func getIPAddress() -> String {
        var address: String = "error"
    
        var interfaces: ifaddrs? = nil
    
        var temp_addr: ifaddrs? = nil
        var success: Int = 0
        // retrieve the current interfaces - returns 0 on success
        success = getifaddrs(interfaces)
        if success == 0 {
            // Loop through linked list of interfaces
            temp_addr = interfaces
            while temp_addr != nil {
                if temp_addr?.ifa_addr?.sa_family == AF_INET {
                    // Check if interface is en0 which is the wifi connection on the iPhone
                    if (String(utf8String: temp_addr?.ifa_name) == "en0") {
                        // Get NSString from C String
                        address = String(utf8String: inet_ntoa((temp_addr?.ifa_addr as? sockaddr_in)?.sin_addr))
                    }
                }
                temp_addr = temp_addr?.ifa_next
            }
        }
            // Free memory
        freeifaddrs(interfaces)
        return address
    }