`

iOS 获取手机的ip 和mac

    博客分类:
  • ios
 
阅读更多

ios获取设备其它信息这里就不说了,网上一大堆,也都很简单,一般信息获取都有提供方法,今天主要介绍下ipAddress 和 macAddress的获取方法(WIFI和蜂窝网络状态下).

二话不说直接代码:

首先,咱们要在libraries里加入libresolv.9.tbd
然后,然后就往下看...

 

系统头文件的引入和宏定义

#import <ifaddrs.h>
#import <resolv.h>
#import <arpa/inet.h>
#import <net/if.h>
#import <netdb.h>
#import <netinet/ip.h>
#import <net/ethernet.h>
#import <net/if_dl.h>
 
#define MDNS_PORT       5353
#define QUERY_NAME      "_apple-mobdev2._tcp.local"
#define DUMMY_MAC_ADDR  @"02:00:00:00:00:00"
#define IOS_CELLULAR    @"pdp_ip0"
#define IOS_WIFI        @"en0"
#define IOS_VPN         @"utun0"
#define IP_ADDR_IPv4    @"ipv4"
#define IP_ADDR_IPv6    @"ipv6"

 

/*
 * 获取设备当前网络IP地址
 */
- (NSString *)getIPAddress
{
    NSArray *searchArray = [self isIpv6] ?    
@[ IOS_VPN @"/" IP_ADDR_IPv4, IOS_VPN @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6 ] :
    @[ IOS_VPN @"/" IP_ADDR_IPv6, IOS_VPN @"/" IP_ADDR_IPv4, IOS_WIFI @"/" IP_ADDR_IPv6, IOS_WIFI @"/" IP_ADDR_IPv4, IOS_CELLULAR @"/" IP_ADDR_IPv6, IOS_CELLULAR @"/" IP_ADDR_IPv4 ] ;
    
    NSDictionary *addresses = [self getIPAddr];
    
    __block NSString *address;
    [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL * _Nonnull stop) {
        address = addresses[key];
        //筛选出IP地址格式
        if([self isValidatIP:address]) *stop = YES;
    }];
    return address ? address : @"0.0.0.0";
}

- (BOOL)isValidatIP:(NSString *)ipAddress {
    if (ipAddress.length == 0) {
        return NO;
    }
    NSString *urlRegEx = @"^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
    
    NSError *error;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlRegEx options:0 error:&error];
    
    if (regex != nil) {
        NSTextCheckingResult *firstMatch=[regex firstMatchInString:ipAddress options:0 range:NSMakeRange(0, [ipAddress length])];
        return firstMatch;
    }
    return NO;
}

- (NSDictionary *)getIPAddr
{
    NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:8];
    
    // retrieve the current interfaces - returns 0 on success
    struct ifaddrs *interfaces;
    if(!getifaddrs(&interfaces)) {
        // Loop through linked list of interfaces
        struct ifaddrs *interface;
        for(interface=interfaces; interface; interface=interface->ifa_next) {
            if(!(interface->ifa_flags & IFF_UP) /* || (interface->ifa_flags & IFF_LOOPBACK) */ ) {
                continue; // deeply nested code harder to read
            }
            const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr;
            char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ];
            if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) {
                NSString *name = [NSString stringWithUTF8String:interface->ifa_name];
                NSString *type;
                if(addr->sin_family == AF_INET) {
                    if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) {
                        type = IP_ADDR_IPv4;
                    }
                } else {
                    const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr;
                    if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) {
                        type = IP_ADDR_IPv6;
                    }
                }
                if(type) {
                    NSString *key = [NSString stringWithFormat:@"%@/%@", name, type];
                    addresses[key] = [NSString stringWithUTF8String:addrBuf];
                }
            }
        }
        // Free memory
        freeifaddrs(interfaces);
    }
    return [addresses count] ? addresses : nil;
}

/*
 * 获取设备物理地址
*/
- (nullable NSString *)getMacAddress {
    res_9_init();
    int len;
    //get currnet ip address
    NSString *ip = [self currentIPAddressOf:IOS_WIFI];
    if(ip == nil) {
        fprintf(stderr, "could not get current IP address of en0\n");
        return DUMMY_MAC_ADDR;
    }//end if
    
    //set port and destination
    _res.nsaddr_list[0].sin_family = AF_INET;
    _res.nsaddr_list[0].sin_port = htons(MDNS_PORT);
    _res.nsaddr_list[0].sin_addr.s_addr = [self IPv4Pton:ip];
    _res.nscount = 1;
    
    unsigned char response[NS_PACKETSZ];
    
    
    //send mdns query
    if((len = res_9_query(QUERY_NAME, ns_c_in, ns_t_ptr, response, sizeof(response))) < 0) {
        
        fprintf(stderr, "res_search(): %s\n", hstrerror(h_errno));
        return DUMMY_MAC_ADDR;
    }//end if
    
    //parse mdns message
    ns_msg handle;
    if(ns_initparse(response, len, &handle) < 0) {
        fprintf(stderr, "ns_initparse(): %s\n", hstrerror(h_errno));
        return DUMMY_MAC_ADDR;
    }//end if
    
    //get answer length
    len = ns_msg_count(handle, ns_s_an);
    if(len < 0) {
        fprintf(stderr, "ns_msg_count return zero\n");
        return DUMMY_MAC_ADDR;
    }//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
    macAddress = macAddress ? macAddress : DUMMY_MAC_ADDR;
    return macAddress;
}//end getMacAddressFromMDNS
 
- (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 = [self IPv4Ntop:in_addr->sin_addr.s_addr];
                    break;
                }//end if
            }//end if
        }//end if
    }//end for
    
    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:
 
- (in_addr_t)IPv4Pton: (nonnull NSString *)IPAddr {
    in_addr_t network = INADDR_NONE;
    return inet_pton(AF_INET, [IPAddr UTF8String], &network) == 1 ?
    network : INADDR_NONE;
}//end IPv4Pton:

 

// 判断当前网络是否是ipv6

- (BOOL)isIpv6{
    NSArray *searchArray =

    @[ IOS_VPN @"/" IP_ADDR_IPv6,

       IOS_VPN @"/" IP_ADDR_IPv4,

       IOS_WIFI @"/" IP_ADDR_IPv6,

       IOS_WIFI @"/" IP_ADDR_IPv4,

       IOS_CELLULAR @"/" IP_ADDR_IPv6,

       IOS_CELLULAR @"/" IP_ADDR_IPv4 ] ;

    NSDictionary *addresses = [self getIPAddr];
    NSLog(@"addresses: %@", addresses);

    __block BOOL isIpv6 = NO;

    [searchArray enumerateObjectsUsingBlock:^(NSString *key, 
      NSUInteger idx, BOOL *stop)

     {
         NSLog(@"---%@---%@---",key, addresses[key] );

         if ([key rangeOfString:@"ipv6"].length > 0  && ![[NSString stringWithFormat:@"%@",addresses[key]] hasPrefix:@"(null)"] ) {
             if ( ![addresses[key] hasPrefix:@"fe80"]) {
                 isIpv6 = YES;

             }

            }

         } ];

        return isIpv6;

    }

 

分享到:
评论

相关推荐

    ios 获取IP Mac地址

    获取IP地址: 在iOS中,获取设备的IP地址通常通过网络接口(如Wi-Fi或蜂窝数据)来实现。可以使用`CFNetwork`框架中的`CFHost`来获取本地主机的IP信息。以下是一个简单的示例代码: ```swift import Foundation ...

    获取本地ip,mac地址

    在IT行业中,网络通信是不可或缺的一部分,而获取设备的IP和MAC地址是网络通信的基础。本文将详细讲解如何使用C#编程语言来实现获取本地IP和MAC地址的功能。 首先,让我们了解一下IP和MAC地址的基本概念。IP地址...

    iOS获取用户设备当前的IP地址

    在iOS开发中,获取用户...需要注意的是,获取IP地址时应考虑到用户的隐私问题,确保在必要且合法的情况下进行,并提供足够的透明度。同时,由于网络环境的动态变化,建议在需要时实时获取IP地址,而不是一次性存储。

    获取自己ip地址和MAC

    在MFC中,获取IP地址和MAC地址的方法如下: 1. 获取本地IP地址: 可以使用Winsock库,包含`winsock2.h`头文件,初始化Winsock后,可以调用`gethostbyname`或`gethostbyaddr`函数获取主机信息,再通过`socket`、`...

    ios-GetIphoneMac获取iphone设备mac地址.zip

    发现是基于arp来和路由器交互然后获取当前路由器下的缓存设备表,然后我们就可以根据ip来判断本机mac地址了。但是我发现这个缓存表数据时多时少,很难找全,但fing却可以。所以希望靠大家的力量一起来研究分享!

    获取ip和mac

    总之,无论是普通用户还是IT专业人士,理解并能获取IP和MAC地址都是网络通信的基本技能。在移动设备上,通过Wi-Fi获取这些信息通常是通过设备设置或编程接口实现的,它们在网络通信中扮演着不可或缺的角色。

    Delphi 12 控件之 ios,android,mswindows获取设备唯一标识符和mac地址.rar

    Delphi 12 ios,android,mswindows获取设备唯一标识符和mac地址.rar Delphi 12 fmx 跨平台(Win,Android,IOS)获取设备唯一标识符 在IT行业中,跨平台开发是一项重要的技术,它允许开发者用一套代码库在多个操作系统...

    iOS获取手机ip地址代码

    除了获取IP地址,iOS开发者还需要了解其他网络相关的知识,如网络状态检测、URLSession的使用、错误处理等。例如,可以使用 `Reachability` 库来检测网络连通性,使用 `NSURLSession` 进行网络请求,以及通过 `...

    获取本地MAC地址小程序

    总的来说,这个"获取本地MAC地址小程序"是一个结合了Windows API和VC++编程技术的小型实用工具,对于理解网络编程和设备识别有很好的学习价值。通过深入研究源代码,我们可以了解到如何利用C++和Windows API进行本地...

    通过手机获取连接的路由器的Mac地址以及ip,另有转换为星号的小代码

    例如,使用Python可以调用`scapy`库获取Mac地址,用`socket`库获取IP地址。以下是一个简单的Python示例,演示如何获取本机的Mac地址和IP地址: ```python import socket import uuid def get_mac_address(): mac ...

    获取IP地址及主机名

    总之,获取IP地址和主机名是网络通信的基础操作,无论是开发、运维还是日常使用,都经常需要用到。通过了解并熟练掌握这些方法,可以更好地理解和管理网络连接。同时,公网IP和内网IP的区分对于理解网络架构和安全也...

    iPhone获取手机型号Python代码

    在Python编程语言中,获取iPhone或其他移动设备的型号信息是一项常见的任务,特别是在自动化测试、数据分析或者设备特定功能开发时。...同时,遵守相关的数据保护法规,确保在获取和处理用户数据时尊重用户隐私。

    JS获取计算机mac地址以及IP的实现方法

    在上述代码中,两个ActiveX插件被用于获取IP和MAC地址: - `locator` 对象:具有CLSID `76A64158-CB41-11D1-8B02-00600806D9B6`,用于获取网络适配器的信息。 - `foo` 对象:具有CLSID `75718C9A-F029-11d1-A1AC-...

    宁盾物联网终端准入之哑终端IP及MAC地址防伪造解决方案.pdf

    - 主动扫描:使用Nmap工具,能主动发现并扫描终端,获取详细的指纹信息,如IP地址、产品信息、MAC地址、操作系统和服务信息等。 3. 哑终端合规化准入条件: - 定义特定的准入条件,例如终端类型(Network ...

    获取网卡MAC地址 获取网卡MAC地址

    - PowerShell:同样可以通过`Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object {$_.IPEnabled -eq $true} | Select-Object -Property MACAddress`命令获取MAC地址。 2. **Linux系统**: - 使用`...

    局域网地址扫描工具,IP,MAC,SHARE,NETBIOS,COMPUTERNAME

    4. **扫描工具**:这类工具能自动发现局域网内的设备,通过发送数据包并监听响应来获取IP地址、MAC地址等信息。这有助于网络管理员了解网络拓扑、设备状态和安全状况。 5. **共享资源**:在局域网中,用户可以共享...

    iNode智能客户端iOS版 iNode MC 7.3.15 for iOS支持802.1x认证方式

    这种方式增强了网络的安全性,因为每个尝试连接的设备都需要经过验证,而不仅仅是固定的IP地址或MAC地址。 iNode MC 7.3.15的更新可能包含了性能优化和bug修复,以提升用户体验和网络连接的稳定性。安装文件"iNode....

    获取iphone设备信息

    // 获取IP地址示例,需额外引入第三方库Reachability ``` 以上就是关于获取iPhone设备信息的详细解释,包括openUDID、MAC地址、IP地址、设备型号和系统版本的相关知识。请注意,随着iOS系统的更新和隐私政策的变化...

    webrtc源码的下载-对应ios-android-linux-mac-window等平台的编译文档

    //直接连外网代理,如何有连外面vpn就不需要,下面的连接是例子不能直接连改自己IP和端口 export http_proxy=http://192.168.0.122:1111 https_proxy=http://192.168.0.122:111 cd /Users/Documents/mac/...

    redis_ios_安装客户端

    6. **连接Redis**: 在iOS应用中,配置Redis连接,通常包括设置主机名(通常是localhost或服务器IP)、端口(6379)、密码(如果设置了)和超时时间。使用LXReactiveRedis或其他库提供的方法,你可以执行Redis命令并...

Global site tag (gtag.js) - Google Analytics