ios7 以后准确获取iphone设备的MAC(物理地址)

摘要:
通过参考钉钉项目,知道是通过wifi拿到路由的MAC地址。那么可不可以拿到iphone设备的MAC地址呢?而且方法也都是同一篇文章上面的,对于ios7以后完全没提示。而使用网络上的方法,在大于ios7的环境下,永远返回的MAC为02:00:00:00:00:00下面说下我获取的MAC的思路,在连接wifi的情况下,通过wifi,获取当前设备的IP。[NSStringstringWithUTF8String:buffer]:nil;}//endIPv4Ntop:将数值格式转化为点分的十进制ip地址格式然后发送mDNS组播"_apple-mobdev2._tcp.local"查询PTR记录。unsignedcharresponse[NS_PACKETSZ];intlen;//sendmdnsqueryif{fprintf;returnnil;}//endif从Respond中解析MAC地址;//parsemdnsmessagens_msghandle;if{fprintf;returnnil;}//endif//getanswerlengthlen=ns_msg_count;if{fprintf;returnnil;}//endif//trytogetmacaddressfromdataNSString*macAddress=nil;for{ns_rrrr;ns_parserr;if(ns_rr_class(rr)==ns_c_in&&ns_rr_type(rr)==ns_t_ptr&&!

通过参考 钉钉 项目,知道是通过wifi拿到路由的MAC地址。那么可不可以拿到iphone 设备的MAC 地址呢?

经过一番搜索,发现所有文章都是针对 ios 7 以前 可以拿到。 而且方法也都是同一篇文章上面的,对于ios7 以后完全没提示。

而使用网络上的方法,在 大于 ios 7 的环境下, 永远返回的MAC 为02:00:00:00:00:00

下面说下我获取的MAC的思路,

在连接wifi 的情况下,通过 wifi(读取ARP),获取当前设备的IP。

+ (nonnull NSString *)currentIPAddressOf: (nonnull NSString *)device {

struct ifaddrs *addrs;

NSString *ipAddress = nil;

if(getifaddrs(&addrs) != 0) {

return nil;

}//end if

//get ipv4 address

for(struct ifaddrs *addr = addrs ; addr ; addr = addr->ifa_next) {

if(!strcmp(addr->ifa_name, [device UTF8String])) {

if(addr->ifa_addr) {

struct sockaddr_in *in_addr = (struct sockaddr_in *)addr->ifa_addr;

if(in_addr->sin_family == AF_INET) {

ipAddress = [Address IPv4Ntop:in_addr->sin_addr.s_addr];

break;

}//end if

}//end if

}//end if

}//end

freeifaddrs(addrs);

return ipAddress;

}//end currentIPAddressOf:

+ (nullable NSString *)IPv4Ntop: (in_addr_t)addr {

char buffer[INET_ADDRSTRLEN] = {0};

return inet_ntop(AF_INET, &addr, buffer, sizeof(buffer)) ? [NSString stringWithUTF8String:buffer] : nil;

}//end IPv4Ntop:将数值格式转化为点分的十进制ip地址格式

然后发送mDNS组播"_apple -mobdev2. _tcp.local" 查询PTR记录。

  unsigned charresponse[NS_PACKETSZ];
    intlen;
    //send mdns query
    if((len = res_query(QUERY_NAME, ns_c_in, ns_t_ptr, response, sizeof(response))) < 0) {
        fprintf(stderr, "res_search(): %s
", hstrerror(h_errno));
        returnnil;
    }//end if

从Respond 中解析MAC地址;

 //parse mdns message
ns_msg handle;
    if(ns_initparse(response, len, &handle) < 0) {
        fprintf(stderr, "ns_initparse(): %s
", hstrerror(h_errno));
        returnnil;
    }//end if
    //get answer length
    len =ns_msg_count(handle, ns_s_an);
    if(len < 0) {
        fprintf(stderr, "ns_msg_count return zero
");
        returnnil;
    }//end if
    //try to get mac address from data
    NSString *macAddress =nil;
    for(int i = 0 ; i < len ; i++) {
        ns_rr rr;
        ns_parserr(&handle, ns_s_an, 0, &rr);
        if(ns_rr_class(rr) == ns_c_in &&
           ns_rr_type(rr) == ns_t_ptr &&
           !strcmp(ns_rr_name(rr), QUERY_NAME)) {
            char *ptr = (char *)(ns_rr_rdata(rr) + 1);
            int l = (int)strcspn(ptr, "@");
            char *tmp = calloc(l + 1, sizeof(char));
            if(!tmp) {
                perror("calloc()");
                continue;
            }//end if
memcpy(tmp, ptr, l);
            macAddress =[NSString stringWithUTF8String:tmp];
            free(tmp);
        }//end if
    }//end for each
    return macAddress;

具体的我已经写好了一个demo,如果对你有帮助,希望你能给个start!

https://github.com/deskOfDafa/GetMacAddress.git

免责声明:文章转载自《ios7 以后准确获取iphone设备的MAC(物理地址)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇.Net Core System.IO.Compression.ZipFile实现Zip格式压缩和Zip格式解压缩字符加密(cipher)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

iOS NSDictionary 转Json 去掉换行去掉空格

//dic 转json 如果用系统自带的会出现空格。 + (NSString *)returnJSONStringWithDictionary:(NSDictionary *)dictionary{ //系统自带 // NSError * error; // NSData *...

转载:嵌入式C语言面试题(二)

BSS段 是“Block Started by Symbol”的缩写,意为“以符号开始的块”。   BSS是Unix链接器产生的未初始化数据段。其他的段分别是包含程序代码的“text”段和包含已初始化数据的“data”段。BSS段的变量只有名称和大小却没有值。此名后来被许多文件格式使用,包括PE。“以符号开始的块”指的是编译器处理未初始化数据的地方。BS...

MAC OS 如何安装命令行工具:Command Line Tools

打开终端输入:xcode-select --install 回车 安装好了测试结果:gcc -v 显示如下: xcode-select: note: install requested for command line developer tools apple-1tekiiMac:~ apple-1$ gcc -v Configured with:...

Mac 删除非当前AppleID安装的APP

Mac上面的APP一般都是通过App Store安装,这样 APP就与AppleID建立了绑定关系。 Mac无法更新一款APP,是因为下载这个APP的AppleID已经不能正常登录。 不要紧,独辟蹊径,找到APP和AppleID的关联文件,删除之,就可以通过当前登录的AppleID更新了。 需要删除的关联文件叫“_MASReceipt”。 它的路径地址一般...

PHP 配置文件中open_basedir选项作用

如下是php.ini中的原文说明以及默认配置: ; open_basedir, if set, limits all file operations to the defined directory ; and below. This directive makes most sense if used in a per-directory or ; pe...

Xcode版本对应的iOS SDK和Mac OS

iPhone SDK 2.2.1 Leopard (10.5.4) iPhone SDK 3.0 (Xcode 3.1.3) Leopard (10.5.7) iPhone SDK 3.0 (Xcode 3.2) Snow Leopard (10.6.0) iPhone SDK 3.1 with Xcode 3.1.4 Leopard (10.5.7) i...