项目用到要获取iOS设备的IP地址,有2种方法:

1)第一种比较简单,但是只有当你的设备连接到WIFI时才能获取到IP地址,倘若你的设备用的是流量,那就不行。代码如下:

  1. #import <ifaddrs.h>
  2. #import <arpa/inet.h>
  3.  
  4. // Get IP Address
  5. - (NSString *)getIPAddress {
  6. NSString *address = @"error";
  7. struct ifaddrs *interfaces = NULL;
  8. struct ifaddrs *temp_addr = NULL;
  9. int success = ;
  10. // retrieve the current interfaces - returns 0 on success
  11. success = getifaddrs(&interfaces);
  12. if (success == ) {
  13. // Loop through linked list of interfaces
  14. temp_addr = interfaces;
  15. while(temp_addr != NULL) {
  16. if(temp_addr->ifa_addr->sa_family == AF_INET) {
  17. // Check if interface is en0 which is the wifi connection on the iPhone
  18. if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
  19. // Get NSString from C String
  20. address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
  21. }
  22. }
  23. temp_addr = temp_addr->ifa_next;
  24. }
  25. }
  26. // Free memory
  27. freeifaddrs(interfaces);
  28. return address;
  29.  
  30. }

2)第二种方法比较通用,无论是WIFI还是流量都能获取到IP地址,代码如下:

  1. #import <ifaddrs.h>
  2. #import <arpa/inet.h>
  3. #import <net/if.h>
  4.  
  5. #define IOS_CELLULAR @"pdp_ip0"
  6. #define IOS_WIFI @"en0"
  7. #define IOS_VPN @"utun0"
  8. #define IP_ADDR_IPv4 @"ipv4"
  9. #define IP_ADDR_IPv6 @"ipv6"
  10.  
  11. #pragma mark - 获取设备当前网络IP地址
  12. + (NSString *)getIPAddress:(BOOL)preferIPv4
  13. {
  14. NSArray *searchArray = preferIPv4 ?
  15. @[ 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 ] :
  16. @[ 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 ] ;
  17.  
  18. NSDictionary *addresses = [self getIPAddresses];
  19. NSLog(@"addresses: %@", addresses);
  20.  
  21. __block NSString *address;
  22. [searchArray enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOLBOOL *stop)
  23. {
  24. address = addresses[key];
  25. //筛选出IP地址格式
  26. if([self isValidatIP:address]) *stop = YES;
  27. } ];
  28. return address ? address : @"0.0.0.0";
  29. }
  30.  
  31. + (BOOL)isValidatIP:(NSString *)ipAddress {
  32. if (ipAddress.length == ) {
  33. return NO;
  34. }
  35. NSString *urlRegEx = @"^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
  36. "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
  37. "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
  38. "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";
  39.  
  40. NSError *error;
  41. NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlRegEx options: error:&error];
  42.  
  43. if (regex != nil) {
  44. NSTextCheckingResult *firstMatch=[regex firstMatchInString:ipAddress options: range:NSMakeRange(, [ipAddress length])];
  45.  
  46. if (firstMatch) {
  47. NSRange resultRange = [firstMatch rangeAtIndex:];
  48. NSString *result=[ipAddress substringWithRange:resultRange];
  49. //输出结果
  50. NSLog(@"%@",result);
  51. return YES;
  52. }
  53. }
  54. return NO;
  55. }
  56.  
  57. + (NSDictionary *)getIPAddresses
  58. {
  59. NSMutableDictionary *addresses = [NSMutableDictionary dictionaryWithCapacity:];
  60.  
  61. // retrieve the current interfaces - returns 0 on success
  62. struct ifaddrs *interfaces;
  63. if(!getifaddrs(&interfaces)) {
  64. // Loop through linked list of interfaces
  65. struct ifaddrs *interface;
  66. for(interface=interfaces; interface; interface=interface->ifa_next) {
  67. if(!(interface->ifa_flags & IFF_UP) /* || (interface->ifa_flags & IFF_LOOPBACK) */ ) {
  68. continue; // deeply nested code harder to read
  69. }
  70. const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr;
  71. char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ];
  72. if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) {
  73. NSString *name = [NSString stringWithUTF8String:interface->ifa_name];
  74. NSString *type;
  75. if(addr->sin_family == AF_INET) {
  76. if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) {
  77. type = IP_ADDR_IPv4;
  78. }
  79. } else {
  80. const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr;
  81. if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) {
  82. type = IP_ADDR_IPv6;
  83. }
  84. }
  85. if(type) {
  86. NSString *key = [NSString stringWithFormat:@"%@/%@", name, type];
  87. addresses[key] = [NSString stringWithUTF8String:addrBuf];
  88. }
  89. }
  90. }
  91. // Free memory
  92. freeifaddrs(interfaces);
  93. }
  94. return [addresses count] ? addresses : nil;
  95. }

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地址的更多相关文章

  1. iOS获取设备ip地址(OC版)

    #import <SystemConfiguration/CaptiveNetwork.h> #import <ifaddrs.h> #import <arpa/inet ...

  2. 获取设备IP地址

    腾讯的IP地址API接口地址:http://fw.qq.com/ipaddress返回的是数据格式为: 1 var IPData = new Array(“58.218.198.205″,”" ...

  3. iOS开发:获取设备IP地址

    一.导入头文件 //首先导入头文件信息 #include <ifaddrs.h> #include <arpa/inet.h> #include <net/if.h> ...

  4. c#程序如何从海康ipserver查询获取DVR设备ip地址

    海康威视提供的ipserver可以记录DVR设备的IP地址,并提供一个7071的端口给客户端查询用,我们在c#程序中可以用海康SDK包中的NET_DVR_GetDVRIPByResolveSvr函数来 ...

  5. iOS获取设备唯一标识的8种方法

    8种iOS获取设备唯一标识的方法,希望对大家有用. UDID UDID(Unique Device Identifier),iOS 设备的唯一识别码,是一个40位十六进制序列(越狱的设备通过某些工具可 ...

  6. iOS获取设备型号、装置类型等信息

    iOS获取设备型号.设备类型等信息 设备标识 关于设备标识,历史上盛行过很多英雄,比如UDID.Mac地址.OpenUDID等,然而他们都陆陆续续倒在了苹果的门下.苹果目前提供了2个方法供App获取设 ...

  7. iOS获取设备型号和App版本号等信息(OC+Swift)

    iOS获取设备型号和App版本号等信息(OC+Swift) 字数1687 阅读382 评论3 喜欢10 好久没有写过博客了,因为中间工作比较忙,然后有些个人事情所以耽误了.但是之前写的博客还一直有人来 ...

  8. PHP 如何获取客户端ip地址

    PHP 如何获取客户端ip地址 一.总结 一句话总结:主要是使用$_SERVER的 REMOTE_ADDR 和 HTTP_X_FORWARDED_FOR 两个属性,在用户使用不同代理的时候这两个属性可 ...

  9. Windows 局域网ping获取设备IP

    /********************************************************************** * Windows 局域网ping获取设备IP * 说明 ...

随机推荐

  1. 手游后台PVP系统网络同步方案总结

    游戏程序 平台类型:   程序设计:   编程语言:   引擎/SDK:   概述 PVP系统俨然成为现在新手游的上线标配,手游Pvp系统体验是否优秀,很大程度上决定了游戏的品质.从最近半年上线的新手 ...

  2. NERDTree 快捷件

    key description ctrl+e 打开/关闭文件浏览器 j 向下移动 k 向上移动 o 小写字母o,打开文件或者展开目录 shift+c 即大写字母C,当前选中目录作为根目录 u 上一层目 ...

  3. python 爬虫4 cookies

    Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的.那么 ...

  4. zmq重点

    The zmq_msg_send(3) method does not actually send the message to the socket connection(s). It queues ...

  5. 关于OCR,一些想法

    OCR一般分为两种: 1,根据给定的字符特征集合,提取未知字符的特征进行匹配识别:(典型例子:GOCR) 2,不知道字符特征,但给出提取特征的规则,通过机器学习training来获取某个字符集的特征集 ...

  6. 《TP5.0学习笔记---配置篇》

    参考博客:http://blog.csdn.net/self_realian/article/details/75045541

  7. 如何通过PHP判断年份是否是闰年----两种方法

    1.定义:闰年是对4取余为0,对100取余不等于0,对400取余等于0的年是闰年. 2.代码: 第一种方法:直接函数判断 $day = date('Y'); if ($day%4==0&&am ...

  8. spring无法启动常见原因及排查方法

    这里总结的问题,通常啥错误也不报,需要自个debug排查,当然每个人遇到的问题可能是不同的,这里仅仅是我个人帮同事解决问题后的一些总结,可能网上的小伙伴可能也遇到,姑且简单记录一下: 1. mybat ...

  9. UIApplicationDelegate协议

    本文转载至 http://www.cnblogs.com/viviyachu/archive/2013/03/26/2982463.html   //网络引用 @protocol UIApplicat ...

  10. 50、Toast自定义布局

    <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...