iOS如何获取手机的Mac地址
首先说明下,下面两种方法均可以获得手机的mac地址,但是有个限制,是在iOS7以下才可以获得。iOS7以后苹果对于sysctl和ioctl进行了技术处理,MAC地址返回的都是02:00:00:00:00:00。
官方文档上这样写的:
"Twolow-levelnetworkingAPIsthatusedtoreturnaMACaddressnowreturnthefixedvalue02:00:00:00:00:00.TheAPIsinquestionaresysctl(NET_RT_IFLIST)andioctl(SIOCGIFCONF).DevelopersusingthevalueoftheMACaddressshouldmigratetoidentifierssuchas-[UIDeviceidentifierForVendor].ThischangeaffectsallappsrunningoniOS7”。
所以在iOS7以后想要获取设备的唯一标示Mac地址已经不行了,只能用其他的代替。
下面说下两种方式:
都需要导入几个头文件
#include<sys/sysctl.h> #include<net/if.h> #include<net/if_dl.h>
方法1:
//ReturnthelocalMACaddy //CourtesyofFreeBSDhackersemaillist //Accidentallymungedduringpreviousupdate.Fixedthankstomlamb. -(NSString*)macaddress { intmib[6]; size_tlen; char*buf; unsignedchar*ptr; structif_msghdr*ifm; structsockaddr_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_nametoindexerror/n"); returnNULL; } if(sysctl(mib,6,NULL,&len,NULL,0)<0){ printf("Error:sysctl,take1/n"); returnNULL; } if((buf=malloc(len))==NULL){ printf("Couldnotallocatememory.error!/n"); returnNULL; } if(sysctl(mib,6,buf,&len,NULL,0)<0){ printf("Error:sysctl,take2"); returnNULL; } ifm=(structif_msghdr*)buf; sdl=(structsockaddr_dl*)(ifm+1); ptr=(unsignedchar*)LLADDR(sdl); NSString*outstring=[NSStringstringWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x",*ptr,*(ptr+1),*(ptr+2),*(ptr+3),*(ptr+4),*(ptr+5)]; //NSString*outstring=[NSStringstringWithFormat:@"%02x%02x%02x%02x%02x%02x",*ptr,*(ptr+1),*(ptr+2),*(ptr+3),*(ptr+4),*(ptr+5)]; NSLog(@"outString:%@",outstring); free(buf); return[outstringuppercaseString]; }
方法2:
-(NSString*)getMacAddress { intmgmtInfoBase[6]; char*msgBuffer=NULL; size_tlength; unsignedcharmacAddress[6]; structif_msghdr*interfaceMsgStruct; structsockaddr_dl*socketStruct; NSString*errorFlag=NULL; //SetupthemanagementInformationBase(mib) mgmtInfoBase[0]=CTL_NET;//Requestnetworksubsystem mgmtInfoBase[1]=AF_ROUTE;//Routingtableinfo mgmtInfoBase[2]=0; mgmtInfoBase[3]=AF_LINK;//Requestlinklayerinformation mgmtInfoBase[4]=NET_RT_IFLIST;//Requestallconfiguredinterfaces //Withallconfiguredinterfacesrequested,gethandleindex if((mgmtInfoBase[5]=if_nametoindex("en0"))==0) errorFlag=@"if_nametoindexfailure"; else { //Getthesizeofthedataavailable(storeinlen) if(sysctl(mgmtInfoBase,6,NULL,&length,NULL,0)<0) errorFlag=@"sysctlmgmtInfoBasefailure"; else { //Allocmemorybasedonabovecall if((msgBuffer=malloc(length))==NULL) errorFlag=@"bufferallocationfailure"; else { //Getsysteminformation,storeinbuffer if(sysctl(mgmtInfoBase,6,msgBuffer,&length,NULL,0)<0) errorFlag=@"sysctlmsgBufferfailure"; } } } //Beforgoinganyfurther... if(errorFlag!=NULL) { NSLog(@"Error:%@",errorFlag); returnerrorFlag; } //Mapmsgbuffertointerfacemessagestructure interfaceMsgStruct=(structif_msghdr*)msgBuffer; //Maptolink-levelsocketstructure socketStruct=(structsockaddr_dl*)(interfaceMsgStruct+1); //Copylinklayeraddressdatainsocketstructuretoanarray memcpy(&macAddress,socketStruct->sdl_data+socketStruct->sdl_nlen,6); //Readfromchararrayintoastringobject,intotraditionalMacaddressformat NSString*macAddressString=[NSStringstringWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x", macAddress[0],macAddress[1],macAddress[2], macAddress[3],macAddress[4],macAddress[5]]; NSLog(@"MacAddress:%@",macAddressString); //Releasethebuffermemory free(msgBuffer); returnmacAddressString; }
以上就是iOS获取手机的Mac地址的两种方法,希望对大家的学习有所帮助。