ios获取设备其它信息这里就不说了,网上一大堆,也都很简单,一般信息获取都有提供方法,今天主要介绍下ipAddress 和 macAddress的获取方法(WIFI和蜂窝网络状态下).
二话不说直接代码:
首先,咱们要在libraries里加入libresolv.9.tbd
然后,然后就往下看...
系统头文件的引入和宏定义
#import <ifaddrs.h> #import <resolv.h> #import <arpa/inet.h> #import <net/if.h> #import <netdb.h> #import <netinet/ip.h> #import <net/ethernet.h> #import <net/if_dl.h> #define MDNS_PORT 5353 #define QUERY_NAME "_apple-mobdev2._tcp.local" #define DUMMY_MAC_ADDR @"02:00:00:00:00:00" #define IOS_CELLULAR @"pdp_ip0" #define IOS_WIFI @"en0" #define IOS_VPN @"utun0" #define IP_ADDR_IPv4 @"ipv4" #define IP_ADDR_IPv6 @"ipv6"
/* * 获取设备当前网络IP地址 */ - (NSString *)getIPAddress {
NSArray *searchArray = [self isIpv6] ? @[ IOS_VPN @"/" IP_ADDR_IPv4, IOS_VPN @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6 ] : @[ IOS_VPN @"/" IP_ADDR_IPv6, IOS_VPN @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4 ] ; NSDictionary *addresses = [self getIPAddr]; __block NSString *address; [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL * _Nonnull stop) { address = addresses[key]; //筛选出IP地址格式 if([self isValidatIP:address]) *stop = YES; }]; return address ? address : @"0.0.0.0"; } - (BOOL)isValidatIP:(NSString *)ipAddress { if (ipAddress.length == 0) { return NO; } NSString *urlRegEx = @"^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"; NSError *error; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlRegEx options:0 error:&error]; if (regex != nil) { NSTextCheckingResult *firstMatch=[regex firstMatchInString:ipAddress options:0 range:NSMakeRange(0, [ipAddress length])]; return firstMatch; } return NO; } - (NSDictionary *)getIPAddr { NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8]; // retrieve the current interfaces - returns 0 on success struct ifaddrs *interfaces; if(!getifaddrs(&interfaces)) { // Loop through linked list of interfaces struct ifaddrs *interface; for(interface=interfaces; interface; interface=interface->ifa_next) { if(!(interface->ifa_flags & IFF_UP) /* || (interface->ifa_flags & IFF_LOOPBACK) */ ) { continue; // deeply nested code harder to read } const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr; char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ]; if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) { NSString *name = [NSString stringWithUTF8String:interface->ifa_name]; NSString *type; if(addr->sin_family == AF_INET) { if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) { type = IP_ADDR_IPv4; } } else { const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr; if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) { type = IP_ADDR_IPv6; } } if(type) { NSString *key = [NSString stringWithFormat:@"%@/%@", name, type]; addresses[key] = [NSString stringWithUTF8String:addrBuf]; } } } // Free memory freeifaddrs(interfaces); } return [addresses count] ? addresses : nil; } /* * 获取设备物理地址 */ - (nullable NSString *)getMacAddress { res_9_init(); int len; //get currnet ip address NSString *ip = [self currentIPAddressOf:IOS_WIFI]; if(ip == nil) { fprintf(stderr, "could not get current IP address of en0\n"); return DUMMY_MAC_ADDR; }//end if //set port and destination _res.nsaddr_list[0].sin_family = AF_INET; _res.nsaddr_list[0].sin_port = htons(MDNS_PORT); _res.nsaddr_list[0].sin_addr.s_addr = [self IPv4Pton:ip]; _res.nscount = 1; unsigned char response[NS_PACKETSZ]; //send mdns query if((len = res_9_query(QUERY_NAME, ns_c_in, ns_t_ptr, response, sizeof(response))) < 0) { fprintf(stderr, "res_search(): %s\n", hstrerror(h_errno)); return DUMMY_MAC_ADDR; }//end if //parse mdns message ns_msg handle; if(ns_initparse(response, len, &handle) < 0) { fprintf(stderr, "ns_initparse(): %s\n", hstrerror(h_errno)); return DUMMY_MAC_ADDR; }//end if //get answer length len = ns_msg_count(handle, ns_s_an); if(len < 0) { fprintf(stderr, "ns_msg_count return zero\n"); return DUMMY_MAC_ADDR; }//end if //try to get mac address from data NSString *macAddress = nil; for(int i = 0 ; i < len ; i++) { ns_rr rr; ns_parserr(&handle, ns_s_an, 0, &rr); if(ns_rr_class(rr) == ns_c_in && ns_rr_type(rr) == ns_t_ptr && !strcmp(ns_rr_name(rr), QUERY_NAME)) { char *ptr = (char *)(ns_rr_rdata(rr) + 1); int l = (int)strcspn(ptr, "@"); char *tmp = calloc(l + 1, sizeof(char)); if(!tmp) { perror("calloc()"); continue; }//end if memcpy(tmp, ptr, l); macAddress = [NSString stringWithUTF8String:tmp]; free(tmp); }//end if }//end for each macAddress = macAddress ? macAddress : DUMMY_MAC_ADDR; return macAddress; }//end getMacAddressFromMDNS - (nonnull NSString *)currentIPAddressOf: (nonnull NSString *)device { struct ifaddrs *addrs; NSString *ipAddress = nil; if(getifaddrs(&addrs) != 0) { return nil; }//end if //get ipv4 address for(struct ifaddrs *addr = addrs ; addr ; addr = addr->ifa_next) { if(!strcmp(addr->ifa_name, [device UTF8String])) { if(addr->ifa_addr) { struct sockaddr_in *in_addr = (struct sockaddr_in *)addr->ifa_addr; if(in_addr->sin_family == AF_INET) { ipAddress = [self IPv4Ntop:in_addr->sin_addr.s_addr]; break; }//end if }//end if }//end if }//end for freeifaddrs(addrs); return ipAddress; }//end currentIPAddressOf: - (nullable NSString *)IPv4Ntop: (in_addr_t)addr { char buffer[INET_ADDRSTRLEN] = {0}; return inet_ntop(AF_INET, &addr, buffer, sizeof(buffer)) ? [NSString stringWithUTF8String:buffer] : nil; }//end IPv4Ntop: - (in_addr_t)IPv4Pton: (nonnull NSString *)IPAddr { in_addr_t network = INADDR_NONE; return inet_pton(AF_INET, [IPAddr UTF8String], &network) == 1 ? network : INADDR_NONE; }//end IPv4Pton:
// 判断当前网络是否是ipv6 - (BOOL)isIpv6{ NSArray *searchArray = @[ IOS_VPN @"/" IP_ADDR_IPv6, IOS_VPN @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4 ] ; NSDictionary *addresses = [self getIPAddr]; NSLog(@"addresses: %@", addresses); __block BOOL isIpv6 = NO; [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop) { NSLog(@"---%@---%@---",key, addresses[key] ); if ([key rangeOfString:@"ipv6"].length > 0 && ![[NSString stringWithFormat:@"%@",addresses[key]] hasPrefix:@"(null)"] ) { if ( ![addresses[key] hasPrefix:@"fe80"]) { isIpv6 = YES; } } } ]; return isIpv6; }
相关推荐
获取IP地址: 在iOS中,获取设备的IP地址通常通过网络接口(如Wi-Fi或蜂窝数据)来实现。可以使用`CFNetwork`框架中的`CFHost`来获取本地主机的IP信息。以下是一个简单的示例代码: ```swift import Foundation ...
在IT行业中,网络通信是不可或缺的一部分,而获取设备的IP和MAC地址是网络通信的基础。本文将详细讲解如何使用C#编程语言来实现获取本地IP和MAC地址的功能。 首先,让我们了解一下IP和MAC地址的基本概念。IP地址...
在iOS开发中,获取用户...需要注意的是,获取IP地址时应考虑到用户的隐私问题,确保在必要且合法的情况下进行,并提供足够的透明度。同时,由于网络环境的动态变化,建议在需要时实时获取IP地址,而不是一次性存储。
在MFC中,获取IP地址和MAC地址的方法如下: 1. 获取本地IP地址: 可以使用Winsock库,包含`winsock2.h`头文件,初始化Winsock后,可以调用`gethostbyname`或`gethostbyaddr`函数获取主机信息,再通过`socket`、`...
发现是基于arp来和路由器交互然后获取当前路由器下的缓存设备表,然后我们就可以根据ip来判断本机mac地址了。但是我发现这个缓存表数据时多时少,很难找全,但fing却可以。所以希望靠大家的力量一起来研究分享!
总之,无论是普通用户还是IT专业人士,理解并能获取IP和MAC地址都是网络通信的基本技能。在移动设备上,通过Wi-Fi获取这些信息通常是通过设备设置或编程接口实现的,它们在网络通信中扮演着不可或缺的角色。
Delphi 12 ios,android,mswindows获取设备唯一标识符和mac地址.rar Delphi 12 fmx 跨平台(Win,Android,IOS)获取设备唯一标识符 在IT行业中,跨平台开发是一项重要的技术,它允许开发者用一套代码库在多个操作系统...
除了获取IP地址,iOS开发者还需要了解其他网络相关的知识,如网络状态检测、URLSession的使用、错误处理等。例如,可以使用 `Reachability` 库来检测网络连通性,使用 `NSURLSession` 进行网络请求,以及通过 `...
总的来说,这个"获取本地MAC地址小程序"是一个结合了Windows API和VC++编程技术的小型实用工具,对于理解网络编程和设备识别有很好的学习价值。通过深入研究源代码,我们可以了解到如何利用C++和Windows API进行本地...
例如,使用Python可以调用`scapy`库获取Mac地址,用`socket`库获取IP地址。以下是一个简单的Python示例,演示如何获取本机的Mac地址和IP地址: ```python import socket import uuid def get_mac_address(): mac ...
总之,获取IP地址和主机名是网络通信的基础操作,无论是开发、运维还是日常使用,都经常需要用到。通过了解并熟练掌握这些方法,可以更好地理解和管理网络连接。同时,公网IP和内网IP的区分对于理解网络架构和安全也...
在Python编程语言中,获取iPhone或其他移动设备的型号信息是一项常见的任务,特别是在自动化测试、数据分析或者设备特定功能开发时。...同时,遵守相关的数据保护法规,确保在获取和处理用户数据时尊重用户隐私。
在上述代码中,两个ActiveX插件被用于获取IP和MAC地址: - `locator` 对象:具有CLSID `76A64158-CB41-11D1-8B02-00600806D9B6`,用于获取网络适配器的信息。 - `foo` 对象:具有CLSID `75718C9A-F029-11d1-A1AC-...
- 主动扫描:使用Nmap工具,能主动发现并扫描终端,获取详细的指纹信息,如IP地址、产品信息、MAC地址、操作系统和服务信息等。 3. 哑终端合规化准入条件: - 定义特定的准入条件,例如终端类型(Network ...
- PowerShell:同样可以通过`Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object {$_.IPEnabled -eq $true} | Select-Object -Property MACAddress`命令获取MAC地址。 2. **Linux系统**: - 使用`...
4. **扫描工具**:这类工具能自动发现局域网内的设备,通过发送数据包并监听响应来获取IP地址、MAC地址等信息。这有助于网络管理员了解网络拓扑、设备状态和安全状况。 5. **共享资源**:在局域网中,用户可以共享...
这种方式增强了网络的安全性,因为每个尝试连接的设备都需要经过验证,而不仅仅是固定的IP地址或MAC地址。 iNode MC 7.3.15的更新可能包含了性能优化和bug修复,以提升用户体验和网络连接的稳定性。安装文件"iNode....
// 获取IP地址示例,需额外引入第三方库Reachability ``` 以上就是关于获取iPhone设备信息的详细解释,包括openUDID、MAC地址、IP地址、设备型号和系统版本的相关知识。请注意,随着iOS系统的更新和隐私政策的变化...
//直接连外网代理,如何有连外面vpn就不需要,下面的连接是例子不能直接连改自己IP和端口 export http_proxy=http://192.168.0.122:1111 https_proxy=http://192.168.0.122:111 cd /Users/Documents/mac/...
6. **连接Redis**: 在iOS应用中,配置Redis连接,通常包括设置主机名(通常是localhost或服务器IP)、端口(6379)、密码(如果设置了)和超时时间。使用LXReactiveRedis或其他库提供的方法,你可以执行Redis命令并...