欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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