iOS如何获取手机的Mac地址
程序员文章站
2023-11-30 22:37:16
首先说明下,下面两种方法均可以获得手机的mac地址,但是有个限制,是在ios7以下才可以获得。ios7以后苹果对于sysctl和ioctl进行了技术处理,mac地址返回的都...
首先说明下,下面两种方法均可以获得手机的mac地址,但是有个限制,是在ios7以下才可以获得。ios7以后苹果对于sysctl和ioctl进行了技术处理,mac地址返回的都是02:00:00:00:00:00。
官方文档上这样写的:
"twolow-level networking apis that used to return a mac address now return thefixed value 02:00:00:00:00:00. the apis in question are sysctl(net_rt_iflist) and ioctl(siocgifconf). developers using the value of the mac address should migrate toidentifiers such as -[uidevice identifierforvendor].this change affects all apps running on ios 7”。
所以在ios7以后想要获取设备的唯一标示mac地址已经不行了,只能用其他的代替。
下面说下两种方式:
都需要导入几个头文件
#include <sys/sysctl.h> #include <net/if.h> #include <net/if_dl.h>
方法1:
// return the local mac addy // courtesy of freebsd hackers email list // accidentally munged during previous update. fixed thanks to mlamb. - (nsstring *) macaddress { int mib[6]; size_t len; char *buf; unsigned char *ptr; struct if_msghdr *ifm; struct sockaddr_dl *sdl; mib[0] = ctl_net; mib[1] = af_route; mib[2] = 0; mib[3] = af_link; mib[4] = net_rt_iflist; if ((mib[5] = if_nametoindex("en0")) == 0) { printf("error: if_nametoindex error/n"); return null; } if (sysctl(mib, 6, null, &len, null, 0) < 0) { printf("error: sysctl, take 1/n"); return null; } if ((buf = malloc(len)) == null) { printf("could not allocate memory. error!/n"); return null; } if (sysctl(mib, 6, buf, &len, null, 0) < 0) { printf("error: sysctl, take 2"); return null; } ifm = (struct if_msghdr *)buf; sdl = (struct sockaddr_dl *)(ifm + 1); ptr = (unsigned char *)lladdr(sdl); nsstring *outstring = [nsstring stringwithformat:@"%02x:%02x:%02x:%02x:%02x:%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)]; // nsstring *outstring = [nsstring stringwithformat:@"%02x%02x%02x%02x%02x%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)]; nslog(@"outstring:%@", outstring); free(buf); return [outstring uppercasestring]; }
方法2:
- (nsstring *)getmacaddress { int mgmtinfobase[6]; char *msgbuffer = null; size_t length; unsigned char macaddress[6]; struct if_msghdr *interfacemsgstruct; struct sockaddr_dl *socketstruct; nsstring *errorflag = null; // setup the management information base (mib) mgmtinfobase[0] = ctl_net; // request network subsystem mgmtinfobase[1] = af_route; // routing table info mgmtinfobase[2] = 0; mgmtinfobase[3] = af_link; // request link layer information mgmtinfobase[4] = net_rt_iflist; // request all configured interfaces // with all configured interfaces requested, get handle index if ((mgmtinfobase[5] = if_nametoindex("en0")) == 0) errorflag = @"if_nametoindex failure"; else { // get the size of the data available (store in len) if (sysctl(mgmtinfobase, 6, null, &length, null, 0) < 0) errorflag = @"sysctl mgmtinfobase failure"; else { // alloc memory based on above call if ((msgbuffer = malloc(length)) == null) errorflag = @"buffer allocation failure"; else { // get system information, store in buffer if (sysctl(mgmtinfobase, 6, msgbuffer, &length, null, 0) < 0) errorflag = @"sysctl msgbuffer failure"; } } } // befor going any further... if (errorflag != null) { nslog(@"error: %@", errorflag); return errorflag; } // map msgbuffer to interface message structure interfacemsgstruct = (struct if_msghdr *) msgbuffer; // map to link-level socket structure socketstruct = (struct sockaddr_dl *) (interfacemsgstruct + 1); // copy link layer address data in socket structure to an array memcpy(&macaddress, socketstruct->sdl_data + socketstruct->sdl_nlen, 6); // read from char array into a string object, into traditional mac address format nsstring *macaddressstring = [nsstring stringwithformat:@"%02x:%02x:%02x:%02x:%02x:%02x", macaddress[0], macaddress[1], macaddress[2], macaddress[3], macaddress[4], macaddress[5]]; nslog(@"mac address: %@", macaddressstring); // release the buffer memory free(msgbuffer); return macaddressstring; }
以上就是ios获取手机的mac地址的两种方法,希望对大家的学习有所帮助。
上一篇: CDR临摹花鸟国画教程
下一篇: CorelDraw制作漂亮五彩标志教程