通过参考 钉钉 项目,知道是通过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 char response[NS_PACKETSZ];
int len;
//send mdns query
if((len = res_query(QUERY_NAME, ns_c_in, ns_t_ptr, response, sizeof(response))) < ) {
fprintf(stderr, "res_search(): %s\n", hstrerror(h_errno));
return nil;
}//end if

从Respond 中解析MAC地址;

 //parse mdns message
ns_msg handle;
if(ns_initparse(response, len, &handle) < ) {
fprintf(stderr, "ns_initparse(): %s\n", hstrerror(h_errno));
return nil;
}//end if //get answer length
len = ns_msg_count(handle, ns_s_an);
if(len < ) {
fprintf(stderr, "ns_msg_count return zero\n");
return nil;
}//end if //try to get mac address from data
NSString *macAddress = nil;
for(int i = ; i < len ; i++) {
ns_rr rr;
ns_parserr(&handle, ns_s_an, , &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) + );
int l = (int)strcspn(ptr, "@"); char *tmp = calloc(l + , 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(物理地址)的更多相关文章

  1. C#通过SendARP()获取WinCE设备的Mac网卡物理地址

    ARP(Address Resolution Protocol) 即 地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议. SendARP(Int32 dest, Int32 host, ...

  2. Qt 中使用Java代码获取安卓设备的MAC地址(安卓9.0)

    public String GetDeviceMAC() { String strMacAddr = null; try { // 获得IpD地址 InetAddress ip = getLocalI ...

  3. 获取设备的mac地址可靠的方法

    参考自:http://www.open-open.com/lib/view/open1433406847322.html /** * 获取设备的mac地址 * * @param ac * @param ...

  4. 获取Android设备WIFI的MAC地址 “MAC地址”

    需要指出的是:wifi状态和wifi AP状态是互斥的状态:也就是一旦发现WIFI AP打开,WIFI是不能被打开的. 获取Android设备的WIFI MAC地址,首先需要将设备中的WIFI个人热点 ...

  5. 获取iOS设备型号的方法总结

    三种常用的办法获取iOS设备的型号: 1. [UIDevice currentDevice].model (推荐): 2. uname(struct utsname *name) ,使用此函数需要#i ...

  6. iOS 测试之非代码获取 iPhone 型号及其他信息

    首先 安装libimobiledevice和ideviceinstaller $ brew uninstall ideviceinstaller $ brew uninstall libimobile ...

  7. 稳定获取Android设备唯一码(UUID)的解决方案

    最近做的一个项目中需要用到Android设备唯一码(UUID)来标识一台设备, Android中设备唯一码有很多,如:MAC地址.IMEI号(DeviceId).IMSI号.ANDROID_ID.序列 ...

  8. 用 iOS-System-Services 框架获取iOS设备所用的设备信息

    参考资料地址 https://github.com/Shmoopi/iOS-System-Services 百度云盘下载地址 http://pan.baidu.com/s/1c05ot1m This ...

  9. 获取iOS设备唯一标识

    [获取iOS设备唯一标识] 1.已禁用-[UIDevice uniqueIdentifier] 苹果总是把用户的隐私看的很重要.-[UIDevice uniqueIdentifier]在iOS5实际在 ...

随机推荐

  1. Javascript中的Trait与代码重用

    Javascript中的Trait与代码重用 来源 http://www.ituring.com.cn/article/64103 我们知道,OOP中最普遍的代码重用方式是通过继承,但是,继承有一些缺 ...

  2. HDU 6143 Killer Names

    Killer Names Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  3. 关于php加密库加密数据上传数据库或解密出错的问题

    php加密拓展库随着php版本的更新,函数的使用方法有所改变,所以加密模式推荐使用ecb,其中加密算法19种,加密模式8种,通过这种方式加密后的数据上传数据库后提取出来进行解密会发现结果是乱码,我认为 ...

  4. Problem B: 开个餐馆算算账

    Description 小明创业了!他开了一家餐馆,每天客人还挺多的.每天下班后,他都要算算今天总共收入多少钱,但是手工算太麻烦了,所以他来向你求助了. Input 第1行N>0,表示餐馆提供N ...

  5. Java多线程Master-Worker模式

    Java多线程Master-Worker模式,多适用于需要大量重复工作的场景中. 例如:使用Master-Worker计算0到100所有数字的立方的和 1.Master接收到100个任务,每个任务需要 ...

  6. OpenCV畸变校正源代码分析

    图像算法中会经常用到摄像机的畸变校正,有必要总结分析OpenCV中畸变校正方法,其中包过普通针孔相机模型和鱼眼相机模型fisheye两种畸变校正方法. 普通相机模型畸变校正函数针对OpenCV中的cv ...

  7. wordpress搬家到 linode 步骤简析

    1. 购买并安装系统 购买就不说了哈,英文不好的自己搜教程. 然后是安装系统 linode 系统安装: 购买完成后登录,进入找到购买的vps ,点击 Dashboard (控制面板) 进入后点击 面板 ...

  8. 我眼中的WebViewJavascriptBridge

    周六阳光明媚的早晨,非常适合整理和分享一些以前玩过的东西.曾经的工作中参与过一段时间iOS开发,在开发中有个小小的框架让我非常深刻,就是WebViewJavascriptBridge,用于原生控件与前 ...

  9. ldap数据库--ODSEE--复制协议

    简单介绍一下ODSEE的复制拓扑的建立,复制协议可以通过管理界面进行创建,也可以通过命令行创建.在此之前需要了解一些复制协议的相关概念,这里针对OESEE. 1,复制角色 master(提供者,也可以 ...

  10. freeMarker遍历map的正确方式

    假设selectDateModel 是我们后台返回的map<String, String>; <#list selectDateModel?keys as key> <o ...