iOS获取设备IP地址
项目用到要获取iOS设备的IP地址,有2种方法:
1)第一种比较简单,但是只有当你的设备连接到WIFI时才能获取到IP地址,倘若你的设备用的是流量,那就不行。代码如下:
- #import <ifaddrs.h>
- #import <arpa/inet.h>
- // Get IP Address
- - (NSString *)getIPAddress {
- NSString *address = @"error";
- struct ifaddrs *interfaces = NULL;
- struct ifaddrs *temp_addr = NULL;
- int success = ;
- // retrieve the current interfaces - returns 0 on success
- success = getifaddrs(&interfaces);
- if (success == ) {
- // Loop through linked list of interfaces
- temp_addr = interfaces;
- while(temp_addr != NULL) {
- if(temp_addr->ifa_addr->sa_family == AF_INET) {
- // Check if interface is en0 which is the wifi connection on the iPhone
- if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
- // Get NSString from C String
- address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
- }
- }
- temp_addr = temp_addr->ifa_next;
- }
- }
- // Free memory
- freeifaddrs(interfaces);
- return address;
- }
2)第二种方法比较通用,无论是WIFI还是流量都能获取到IP地址,代码如下:
- #import <ifaddrs.h>
- #import <arpa/inet.h>
- #import <net/if.h>
- #define IOS_CELLULAR @"pdp_ip0"
- #define IOS_WIFI @"en0"
- #define IOS_VPN @"utun0"
- #define IP_ADDR_IPv4 @"ipv4"
- #define IP_ADDR_IPv6 @"ipv6"
- #pragma mark - 获取设备当前网络IP地址
- + (NSString *)getIPAddress:(BOOL)preferIPv4
- {
- NSArray *searchArray = preferIPv4 ?
- @[ 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 getIPAddresses];
- NSLog(@"addresses: %@", addresses);
- __block NSString *address;
- [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOLBOOL *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 == ) {
- 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: error:&error];
- if (regex != nil) {
- NSTextCheckingResult *firstMatch=[regex firstMatchInString:ipAddress options: range:NSMakeRange(, [ipAddress length])];
- if (firstMatch) {
- NSRange resultRange = [firstMatch rangeAtIndex:];
- NSString *result=[ipAddress substringWithRange:resultRange];
- //输出结果
- NSLog(@"%@",result);
- return YES;
- }
- }
- return NO;
- }
- + (NSDictionary *)getIPAddresses
- {
- NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:];
- // 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;
- }
Reference
[1] http://superdanny.link/2016/01/27/iOS-get-device-ip-address/index.html
[2] http://stackoverflow.com/questions/7072989/iphone-ipad-osx-how-to-get-my-ip-address-programmatically
原文地址:http://blog.csdn.net/luoshengkim/article/details/51135063
iOS获取设备IP地址的更多相关文章
- iOS获取设备ip地址(OC版)
#import <SystemConfiguration/CaptiveNetwork.h> #import <ifaddrs.h> #import <arpa/inet ...
- 获取设备IP地址
腾讯的IP地址API接口地址:http://fw.qq.com/ipaddress返回的是数据格式为: 1 var IPData = new Array(“58.218.198.205″,”" ...
- iOS开发:获取设备IP地址
一.导入头文件 //首先导入头文件信息 #include <ifaddrs.h> #include <arpa/inet.h> #include <net/if.h> ...
- c#程序如何从海康ipserver查询获取DVR设备ip地址
海康威视提供的ipserver可以记录DVR设备的IP地址,并提供一个7071的端口给客户端查询用,我们在c#程序中可以用海康SDK包中的NET_DVR_GetDVRIPByResolveSvr函数来 ...
- iOS获取设备唯一标识的8种方法
8种iOS获取设备唯一标识的方法,希望对大家有用. UDID UDID(Unique Device Identifier),iOS 设备的唯一识别码,是一个40位十六进制序列(越狱的设备通过某些工具可 ...
- iOS获取设备型号、装置类型等信息
iOS获取设备型号.设备类型等信息 设备标识 关于设备标识,历史上盛行过很多英雄,比如UDID.Mac地址.OpenUDID等,然而他们都陆陆续续倒在了苹果的门下.苹果目前提供了2个方法供App获取设 ...
- iOS获取设备型号和App版本号等信息(OC+Swift)
iOS获取设备型号和App版本号等信息(OC+Swift) 字数1687 阅读382 评论3 喜欢10 好久没有写过博客了,因为中间工作比较忙,然后有些个人事情所以耽误了.但是之前写的博客还一直有人来 ...
- PHP 如何获取客户端ip地址
PHP 如何获取客户端ip地址 一.总结 一句话总结:主要是使用$_SERVER的 REMOTE_ADDR 和 HTTP_X_FORWARDED_FOR 两个属性,在用户使用不同代理的时候这两个属性可 ...
- Windows 局域网ping获取设备IP
/********************************************************************** * Windows 局域网ping获取设备IP * 说明 ...
随机推荐
- 手游后台PVP系统网络同步方案总结
游戏程序 平台类型: 程序设计: 编程语言: 引擎/SDK: 概述 PVP系统俨然成为现在新手游的上线标配,手游Pvp系统体验是否优秀,很大程度上决定了游戏的品质.从最近半年上线的新手 ...
- NERDTree 快捷件
key description ctrl+e 打开/关闭文件浏览器 j 向下移动 k 向上移动 o 小写字母o,打开文件或者展开目录 shift+c 即大写字母C,当前选中目录作为根目录 u 上一层目 ...
- python 爬虫4 cookies
Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的.那么 ...
- zmq重点
The zmq_msg_send(3) method does not actually send the message to the socket connection(s). It queues ...
- 关于OCR,一些想法
OCR一般分为两种: 1,根据给定的字符特征集合,提取未知字符的特征进行匹配识别:(典型例子:GOCR) 2,不知道字符特征,但给出提取特征的规则,通过机器学习training来获取某个字符集的特征集 ...
- 《TP5.0学习笔记---配置篇》
参考博客:http://blog.csdn.net/self_realian/article/details/75045541
- 如何通过PHP判断年份是否是闰年----两种方法
1.定义:闰年是对4取余为0,对100取余不等于0,对400取余等于0的年是闰年. 2.代码: 第一种方法:直接函数判断 $day = date('Y'); if ($day%4==0&&am ...
- spring无法启动常见原因及排查方法
这里总结的问题,通常啥错误也不报,需要自个debug排查,当然每个人遇到的问题可能是不同的,这里仅仅是我个人帮同事解决问题后的一些总结,可能网上的小伙伴可能也遇到,姑且简单记录一下: 1. mybat ...
- UIApplicationDelegate协议
本文转载至 http://www.cnblogs.com/viviyachu/archive/2013/03/26/2982463.html //网络引用 @protocol UIApplicat ...
- 50、Toast自定义布局
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...