print("手机用户自定义的名称 === \(UIDevice.current.name)") print("设备名称systemName + iOS版本systemVersion == \(UIDevice.current.systemName + UIDevice.current.systemVersion)") print("设备型号(iPhone/ipad/iMac/watch) == \(UIDevice.current.model)") print("运营商IP == \(deviceIP ?? "本机IP为空")") print("wifiIP == \(wifiIP ?? "无线网IP为空")")
/// 设备运营商IP(联通/移动/电信的运营商给的移动IP) var deviceIP:String?{ var addresses = [String]() var ifaddr : UnsafeMutablePointer<ifaddrs>? = nil if getifaddrs(&ifaddr) == 0 { var ptr = ifaddr while (ptr != nil) { let flags = Int32(ptr!.pointee.ifa_flags) var addr = ptr!.pointee.ifa_addr.pointee 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) { var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) if (getnameinfo(&addr, socklen_t(addr.sa_len), &hostname, socklen_t(hostname.count),nil, socklen_t(0), NI_NUMERICHOST) == 0) { if let address = String(validatingUTF8:hostname) { addresses.append(address) } } } } ptr = ptr!.pointee.ifa_next } freeifaddrs(ifaddr) } return addresses.first }
/// WiFi获得的IP var wifiIP:String?{ var address: String? var ifaddr: UnsafeMutablePointer<ifaddrs>? = nil guard getifaddrs(&ifaddr) == 0 else { return nil } guard let firstAddr = ifaddr else { return nil } 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 }
公网IP : 把数据变为json 在解析 static func getPublicIP222(backBlock: @escaping ((String)->())){ DDLOG(message: " Thread = \(Thread.current)") let ipURL = URL(string: "http://pv.sohu.com/cityjson?ie=utf-8") var ip: String? = nil do { if let ipURL = ipURL { ip = try String(contentsOf: ipURL, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue)) } } catch { } //判断返回字符串是否为所需数据 if ip?.hasPrefix("var returnCitySN = ") ?? false { //对字符串进行处理,然后进行json解析 //删除字符串多余字符串 let range = NSRange(location: 0, length: 19) if let subRange = Range<String.Index>(range, in: ip ?? "") { ip?.removeSubrange(subRange) } let nowIp = (ip as NSString?)?.substring(to: (ip?.count ?? 0) - 1) //将字符串转换成二进制进行Json解析 let data = nowIp?.data(using: .utf8) var dict: [String : Any]? = nil do { if let data = data { dict = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String : Any] } } catch { } if let dict = dict { print("\(dict)") } backBlock(dict?["cip"] as? String ?? "") } backBlock("") }
类方法
/// 获得公网IP static func getPublicIP(backBlock: @escaping ((_ ipStr:String)->())){ let queue = OperationQueue() let blockOP = BlockOperation.init { if let url = URL(string: "http://pv.sohu.com/cityjson?ie=utf-8") , let s = try? String(contentsOf: url, encoding: String.Encoding.utf8) { DDLOG(message: "data:\(s)") let subArr = s.components(separatedBy: ":") if subArr.count > 1 { let ipStr = subArr[1].replacingOccurrences(of: "\"", with: "") let ipSubArr = ipStr.components(separatedBy: ",") if ipSubArr.count > 0 { let ip = ipSubArr[0].trimmingCharacters(in: CharacterSet.whitespaces) DDLOG(message: "公网IP:\(ip), Thread = \(Thread.current)") DispatchQueue.main.async { backBlock(ip) } return } } }else { DDLOG(message: "获得公网IP URL 转换失败") } DispatchQueue.main.async { JYLogsModel.JYLog(logType: JYLogsModel.JYLogType.errorType, logStr: "获取公网IP失败") backBlock("") } } queue.addOperation(blockOP) }
/// 获取当前设备IP static func getOperatorsIP() -> String? { var addresses = [String]() var ifaddr : UnsafeMutablePointer<ifaddrs>? = nil if getifaddrs(&ifaddr) == 0 { var ptr = ifaddr while (ptr != nil) { let flags = Int32(ptr!.pointee.ifa_flags) var addr = ptr!.pointee.ifa_addr.pointee 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) { var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST)) if (getnameinfo(&addr, socklen_t(addr.sa_len), &hostname, socklen_t(hostname.count),nil, socklen_t(0), NI_NUMERICHOST) == 0) { if let address = String(validatingUTF8:hostname) { addresses.append(address) } } } } ptr = ptr!.pointee.ifa_next } freeifaddrs(ifaddr) } return addresses.first }
//获取本机无线局域网ip static func getWifiIP() -> String? { var address: String? var ifaddr: UnsafeMutablePointer<ifaddrs>? = nil guard getifaddrs(&ifaddr) == 0 else { return nil } guard let firstAddr = ifaddr else { return nil } 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 }