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地址的两种方法,希望对大家的学习有所帮助。