最近在项目中要获取iphone手机本机的ip地址。在我一博客中也写到方法了。但是那种方法只适合于非3G网络。今天网上找了下一个不同以前的获取方式。特记录下。先感谢作者。 转至 http://mobile.51cto.com/iphone-282795.htm

获取iPhone本机IP地址并且不需调用私有API方法是本文要介绍的内容,主要是手头一个iphone项目需要取iphone本机ip地址,在iphone os 2.0上可以用下面的方法获得。内容不多,主要是代码实现IP地址的获取。

 
  1. -(NSString*)getAddress {
  2. char iphone_ip[255];
  3. strcpy(iphone_ip,"127.0.0.1"); // if everything fails
  4. NSHost* myhost = [NSHost currentHost];
  5. if (myhost)
  6. {
  7. NSString *ad = [myhost address];
  8. if (ad)
  9. strcpy(iphone_ip,[ad cStringUsingEncoding:NSISOLatin1StringEncoding]);
  10. }
  11. return [NSString stringWithFormat:@"%s",iphone_ip];
  12. }
  13. 到3.0这个方法成了苹果私有api了,用了不对不说,error:
  14. warning: no ‘+currentHost’ method found
  15. warning: (Messages without a matching method signature)
  16. ,提交的app还被reject:
  17. [NSHost currentHost] will also work, but it is deprecated and considered a “Private API” by Apple,
  18. so you won’t be able to submit your application to App Store.
  19. google很久无果;今天无意发现一个老外的blog贴了方法,试用了下完全OK,要翻墙看,转载记录一下.
  20. As far as I know there is only one hacky way to do that. You basically open a socket and get its address using POSIX functions.
  21. Here is the code I used for this:
  22. /*
  23. *  IPAdress.h
  24. *
  25. *
  26. */
  27. #define MAXADDRS    32
  28. extern char *if_names[MAXADDRS];
  29. extern char *ip_names[MAXADDRS];
  30. extern char *hw_addrs[MAXADDRS];
  31. extern unsigned long ip_addrs[MAXADDRS];
  32. // Function prototypes
  33. void InitAddresses();
  34. void FreeAddresses();
  35. void GetIPAddresses();
  36. void GetHWAddresses();
  37. /*
  38. *  IPAddress.c
  39. *
  40. */
  41. #include "IPAddress.h"
  42. #include <stdio.h>
  43. #include <stdlib.h>
  44. #include <string.h>
  45. #include <unistd.h>
  46. #include <sys/ioctl.h>
  47. #include <sys/types.h>
  48. #include <sys/socket.h>
  49. #include <netinet/in.h>
  50. #include <netdb.h>
  51. #include <arpa/inet.h>
  52. #include <sys/sockio.h>
  53. #include <net/if.h>
  54. #include <errno.h>
  55. #include <net/if_dl.h>
  56. #define    min(a,b)    ((a) < (b) ? (a) : (b))
  57. #define    max(a,b)    ((a) > (b) ? (a) : (b))
  58. #define BUFFERSIZE    4000
  59. char *if_names[MAXADDRS];
  60. char *ip_names[MAXADDRS];
  61. char *hw_addrs[MAXADDRS];
  62. unsigned long ip_addrs[MAXADDRS];
  63. static int   nextAddr = 0;
  64. void InitAddresses()
  65. {
  66. int i;
  67. for (i=0; i<MAXADDRS; ++i)
  68. {
  69. if_names[i] = ip_names[i] = hw_addrs[i] = NULL;
  70. ip_addrs[i] = 0;
  71. }
  72. }
  73. void FreeAddresses()
  74. {
  75. int i;
  76. for (i=0; i<MAXADDRS; ++i)
  77. {
  78. if (if_names[i] != 0) free(if_names[i]);
  79. if (ip_names[i] != 0) free(ip_names[i]);
  80. if (hw_addrs[i] != 0) free(hw_addrs[i]);
  81. ip_addrs[i] = 0;
  82. }
  83. InitAddresses();
  84. }
  85. void GetIPAddresses()
  86. {
  87. int                 i, len, flags;
  88. char                buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;
  89. struct ifconf       ifc;
  90. struct ifreq        *ifr, ifrcopy;
  91. struct sockaddr_in    *sin;
  92. char temp[80];
  93. int sockfd;
  94. for (i=0; i<MAXADDRS; ++i)
  95. {
  96. if_names[i] = ip_names[i] = NULL;
  97. ip_addrs[i] = 0;
  98. }
  99. sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  100. if (sockfd < 0)
  101. {
  102. perror("socket failed");
  103. return;
  104. }
  105. ifc.ifc_len = BUFFERSIZE;
  106. ifc.ifc_buf = buffer;
  107. if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0)
  108. {
  109. perror("ioctl error");
  110. return;
  111. }
  112. lastname[0] = 0;
  113. for (ptr = buffer; ptr < buffer + ifc.ifc_len; )
  114. {
  115. ifr = (struct ifreq *)ptr;
  116. len = max(sizeof(struct sockaddr), ifr->ifr_addr.sa_len);
  117. ptr += sizeof(ifr->ifr_name) + len;    // for next one in buffer
  118. if (ifr->ifr_addr.sa_family != AF_INET)
  119. {
  120. continue;    // ignore if not desired address family
  121. }
  122. if ((cptr = (char *)strchr(ifr->ifr_name, ':')) != NULL)
  123. {
  124. *cptr = 0;        // replace colon will null
  125. }
  126. if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0)
  127. {
  128. continue;    /* already processed this interface */
  129. }
  130. memcpy(lastname, ifr->ifr_name, IFNAMSIZ);
  131. ifrcopy = *ifr;
  132. ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);
  133. flags = ifrcopy.ifr_flags;
  134. if ((flags & IFF_UP) == 0)
  135. {
  136. continue;    // ignore if interface not up
  137. }
  138. if_names[nextAddr] = (char *)malloc(strlen(ifr->ifr_name)+1);
  139. if (if_names[nextAddr] == NULL)
  140. {
  141. return;
  142. }
  143. strcpy(if_names[nextAddr], ifr->ifr_name);
  144. sin = (struct sockaddr_in *)&ifr->ifr_addr;
  145. strcpy(temp, inet_ntoa(sin->sin_addr));
  146. ip_names[nextAddr] = (char *)malloc(strlen(temp)+1);
  147. if (ip_names[nextAddr] == NULL)
  148. {
  149. return;
  150. }
  151. strcpy(ip_names[nextAddr], temp);
  152. ip_addrs[nextAddr] = sin->sin_addr.s_addr;
  153. ++nextAddr;
  154. }
  155. close(sockfd);
  156. }
  157. void GetHWAddresses()
  158. {
  159. struct ifconf ifc;
  160. struct ifreq *ifr;
  161. int i, sockfd;
  162. char buffer[BUFFERSIZE], *cp, *cplim;
  163. char temp[80];
  164. for (i=0; i<MAXADDRS; ++i)
  165. {
  166. hw_addrs[i] = NULL;
  167. }
  168. sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  169. if (sockfd < 0)
  170. {
  171. perror("socket failed");
  172. return;
  173. }
  174. ifc.ifc_len = BUFFERSIZE;
  175. ifc.ifc_buf = buffer;
  176. if (ioctl(sockfd, SIOCGIFCONF, (char *)&ifc) < 0)
  177. {
  178. perror("ioctl error");
  179. close(sockfd);
  180. return;
  181. }
  182. ifr = ifc.ifc_req;
  183. cplim = buffer + ifc.ifc_len;
  184. for (cp=buffer; cp < cplim; )
  185. {
  186. ifr = (struct ifreq *)cp;
  187. if (ifr->ifr_addr.sa_family == AF_LINK)
  188. {
  189. struct sockaddr_dl *sdl = (struct sockaddr_dl *)&ifr->ifr_addr;
  190. int a,b,c,d,e,f;
  191. int i;
  192. strcpy(temp, (char *)ether_ntoa(LLADDR(sdl)));
  193. sscanf(temp, "%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);
  194. sprintf(temp, "%02X:%02X:%02X:%02X:%02X:%02X",a,b,c,d,e,f);
  195. for (i=0; i<MAXADDRS; ++i)
  196. {
  197. if ((if_names[i] != NULL) && (strcmp(ifr->ifr_name,if_names[i]) == 0))
  198. {
  199. if (hw_addrs[i] == NULL)
  200. {
  201. hw_addrs[i] = (char *)malloc(strlen(temp)+1);
  202. strcpy(hw_addrs[i], temp);
  203. break;
  204. }
  205. }
  206. }
  207. }
  208. cp += sizeof(ifr->ifr_name) + max(sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len);
  209. }
  210. close(sockfd);
  211. }
  212. test:
  213. #import "IPAdress.h"
  214. - (NSString *)deviceIPAdress {
  215. InitAddresses();
  216. GetIPAddresses();
  217. GetHWAddresses();
  218. return [NSString stringWithFormat:@"%s", ip_names[1]];
  219. }
  220. - (void)viewDidLoad {
  221. [super viewDidLoad];
  222. NSString* ip_iphone = [self deviceIPAdress];
  223. NSLog(@"ip:%@",ip_iphone);
  224. }

获取iPhone本机IP地址新方法相关推荐

  1. 获取本机IP地址的方法

    文章目录 获取本机IP地址的方法总结 一.Windows电脑 获取本机 IP 地址 1.命令行获取 2.使用网络状态查看IP地址 二.Mac 电脑获取本机 IP 地址 1. mac电脑要输入**ifc ...

  2. vc获取计算机用户名,vc获取计算机名和ip地址的方法

    vc获取计算机名和ip地址的方法 本文实例讲述了vc获取计算机名和ip地址的方法.分享给大家供大家参考.具体实现方法如下: #include #include #pragma comment(lib, ...

  3. Win11IP地址在哪里看?Win11查看本机IP地址的方法

    Win11IP地址在哪里看?每一台可以联网的电脑都拥有一个IP地址,如果说电脑就是一部电话,那么IP地址,我们可以把它当作为我们的电话号码.今天将为大家分享Win11查看本机IP地址的方法. 方法一: ...

  4. Unity中获取本机IP地址的方法

    做OptiTrack局域网数据通信时,需要设置本地IP和动捕数据服务器IP,来实现获取动捕数据.由于局域网搭建时需要手动设置电脑IP,因此想到如果可以获取本机IP,服务器IP通常设置固定后不会更改,如 ...

  5. java获取请求本机ip地址

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...

  6. java获取服务器ip地址_java中获取当前服务器的Ip地址的方法

    1.tomcat是一款免费的开源Web服务器,如果部署在本地,那么对应的那么为localhost,对应地址为127.0.0.1. 例子:可以通过http://localhost:8080/项目root ...

  7. 获取本机所有IP地址的方法

    获取本机所有IP地址的方法    java.net包中的IP地址类InetAddress提供了可以获取本机IP地址的方法getLocalHost(),但是通过该方法只能获得第一个网络设备的IP地址.但 ...

  8. 快速获取本机IP地址AWK功能

    有些时候,我们在应用中可能要用到通过linux命令来获取本机IP地址,方法有很多种,例如最常见的就是ifconfig 如果我想尽尽只获取IP地址,方法也有很多种 例如:获取eth0的IP信息,利用cu ...

  9. 用java获取本机IP地址

    在网上找了几个用java获取本机IP地址的代码,发现都少都有些不完美,自己整理了一下.突然之间很想把自己的IP地址给获取了,虽然用系统自带命令可以得到,但自己想写一个程序获取一下,到网上搜索了一下ja ...

最新文章

  1. RUP within the context of the Six Best Practices
  2. ubuntu18.04搭建SLAM环境 转 高翔 十四讲匹配环境
  3. python类继承实例
  4. 【温故知新】CSS学习笔记(外边距合并)
  5. python函数中把列表(list)当参数时的入坑与出坑
  6. 视频检索扫盲 (一)
  7. why jQuery.clone does not work as expected
  8. 带你自学Python系列(九):一文读懂Python中字典应用原理!
  9. LeetCode-94. 二叉树的中序遍历
  10. Ubuntu 14.04开启ssh服务
  11. 韩顺平 php大牛班课程,2016 泰牛程序员 韩顺平 PHP 大牛班 javascript课程 完整笔记.doc...
  12. 白化滤波器 matlab,白化滤波器-matlab-程序.doc
  13. 2016小米-风口的猪-中国牛市-Java
  14. 日志报错:WARNING: An illegal reflective access operation has occurred
  15. 投影仿真1.0-二维图像矩阵投影
  16. Android(permission)常用权限
  17. Windows驱动开发WDM (13)- 过滤驱动
  18. Finereport 9.0升级到10.0工具下载[9-10升级工具]
  19. Android WIFI调试助手2.0使用指南
  20. 硬石YS-F1Pro开发板HAL库例程持续更新\2. 软件设计之高级裸机例程(HAL库版本)\YSF1_HAL-121. MH-Z14A二氧化碳传感器模块

热门文章

  1. 如何给没网的台机(pve)装rtl8821cu无线网卡驱动
  2. 原谅帽大作战网页版服务器连接失败,原谅帽大作战网页PC版
  3. 2021-10-17 FLASK下的公共网盘以及私有网盘的写法
  4. 从「水饺大王」到「烫手山芋」 大娘水饺前路难卜
  5. 计算机会计和传统手工会计的区别,会计手工做账和会计电算化的区别
  6. 软件开发公司如何带新人?
  7. 一种全面屏手势适配方案
  8. expect 编译安装
  9. 华秋HDI板脱颖而出的密码
  10. mysql(三)路由器读写分离、MHA高可用