当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS如何获取手机的Mac地址

iOS如何获取手机的Mac地址

2019年07月24日  | 移动技术网IT编程  | 我要评论

新军嫂论坛,绝世赌妃,职场大富翁

首先说明下,下面两种方法均可以获得手机的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地址的两种方法,希望对大家的学习有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网