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 }