现在的位置: 首页 > 综合 > 正文

iOS上获得MAC地址

2018年02月23日 ⁄ 综合 ⁄ 共 1516字 ⁄ 字号 评论关闭

      很多时候我们都需要唯一来确定一台设备,苹果设备本来有个UDID号,可以实现这个目的。在iOS5.0以前,还有一个uniqueIdentifier的API用来获得这个number。不过iOS5之后,这个API废除了。

      一条路不通,我们就换一条路走,于是MAC地址就成了一个不错的选择,苹果没有提供获得MAC地址的API,不过使用sysctl还是可以有点办法的,代码如下:

#include <sys/types.h>

#include <sys/param.h>

#include <sys/ioctl.h>

#include <sys/socket.h>

#include <net/if.h>

#include <netinet/in.h>

#include <net/if_dl.h>

#include <sys/sysctl.h>

void GetMACAddress(unsigned
char *mac)

{

    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 ;

    }

    

   
if (sysctl(mib,
6, NULL, &len,
NULL, 0) <
0
) {

        printf("Error: sysctl, take 1/n");

       
return ;

    }

    

   
if ((buf = malloc(len)) ==
NULL) {

        printf("Could not allocate memory. error!/n");

       
return ;

    }

    

   
if (sysctl(mib,
6, buf, &len, NULL,
0) < 0) {

        printf("Error: sysctl, take 2");

free(buf);

       
return ;

    }

    

    ifm = (struct
if_msghdr *)buf;

    sdl = (struct
sockaddr_dl *)(ifm +
1
);

    ptr = (unsigned
char *)LLADDR(sdl);

    memcpy(mac,ptr,
6);

   
free(buf);

}

   这段代码可以良好的工作,直到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
 

抱歉!评论已关闭.