[转]取iphone本机ip地址方法(非调用私有api方法)

转自:http://hi.baidu.com/%B0%D9ii%D6%AAi%B5%C0/blog/item/5d4c0a2b284e5fea98250a41.html

 

手头一个iphone项目需要取iphone本机ip地址,在iphone os 2.0上可以用下面的方法获得:

- ( NSString * ) getAddress {
char iphone_ip [ 255 ] ;
strcpy ( iphone_ip , " 127.0.0.1 " ) ; // if everything fails
NSHost * myhost = [ NSHost currentHost ] ;
if ( myhost )
{
    
NSString * ad = [ myhost address ] ;
    
if ( ad )
        
strcpy ( iphone_ip , [ ad cStringUsingEncoding : NSISOLatin1StringEncoding ]) ;
}
      
return [ NSString stringWithFormat :@ " %s " , iphone_ip ] ;
}

到3.0这个方法成了苹果私有api了,用了不对不说,error:

warning: no ‘+currentHost’ method found
warning: (Messages without a matching method signature)

,提交的app还被reject:

[NSHost currentHost] will also work, but it is deprecated and considered a “Private API” by Apple, so you won’t be able to submit your application to App Store.

google很久无果;

今天无意发现一个老外的blog贴了方法,试用了下完全OK,要翻墙看,转载记录一下.

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. Here is the code I used for this:

/*
 *  IPAdress.h
 *
 *
 */

 
#define MAXADDRS     32
 
extern char * if_names [ MAXADDRS ] ;
extern char * ip_names [ MAXADDRS ] ;
extern char * hw_addrs [ MAXADDRS ] ;
extern unsigned long ip_addrs [ MAXADDRS ] ;
 
// Function prototypes
 
void InitAddresses () ;
void FreeAddresses () ;
void GetIPAddresses () ;
void GetHWAddresses () ;
 
 
/*
 *  IPAddress.c
 *
 */

 
#include " IPAddress.h "
 
#include < stdio.h >
#include < stdlib.h >
#include < string.h >
#include < unistd.h >
#include < sys/ioctl.h >
#include < sys/types.h >
#include < sys/socket.h >
#include < netinet/in.h >
#include < netdb.h >
#include < arpa/inet.h >
#include < sys/sockio.h >
#include < net/if.h >
#include < errno.h >
#include < net/if_dl.h >
 
#define     min ( a , b )     (( a ) < ( b ) ? ( a ) : ( b ))
#define     max ( a , b )     (( a ) > ( b ) ? ( a ) : ( b ))
 
#define BUFFERSIZE     4000
 
char * if_names [ MAXADDRS ] ;
char * ip_names [ MAXADDRS ] ;
char * hw_addrs [ MAXADDRS ] ;
unsigned long ip_addrs [ MAXADDRS ] ;
 
static int     nextAddr = 0 ;
 
void InitAddresses ()
{
    
int i ;
    
for ( i = 0 ; i < MAXADDRS ; ++ i )
    
{
        
if_names [ i ] = ip_names [ i ] = hw_addrs [ i ] = NULL ;
        
ip_addrs [ i ] = 0 ;
    
}
}
 
void FreeAddresses ()
{
    
int i ;
    
for ( i = 0 ; i < MAXADDRS ; ++ i )
    
{
        
if ( if_names [ i ] != 0 ) free ( if_names [ i ]) ;
        
if ( ip_names [ i ] != 0 ) free ( ip_names [ i ]) ;
        
if ( hw_addrs [ i ] != 0 ) free ( hw_addrs [ i ]) ;
        
ip_addrs [ i ] = 0 ;
    
}
    
InitAddresses () ;
}
voidGetIPAddresses()
{
    
int                 i, len, flags;
    
char                buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;
    
structifconf       ifc;
    
structifreq        *ifr, ifrcopy;
    
structsockaddr_in    *sin;
    
    
chartemp[80];
    
    
intsockfd;
    
    
for(i=0; i<MAXADDRS; ++i)
    
{
        
if_names[i] = ip_names[i] = NULL;
        
ip_addrs[i] = 0;
    
}
    
    
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    
if(sockfd < 0)
    
{
        
perror("socket failed");
        
return;
    
}
    
    
ifc.ifc_len = BUFFERSIZE;
    
ifc.ifc_buf = buffer;
    
    
if(ioctl(sockfd, SIOCGIFCONF, &ifc) < 0)
    
{
        
perror("ioctl error");
        
return;
    
}
    
    
lastname[0] = 0;
    
    
for(ptr = buffer; ptr < buffer + ifc.ifc_len; )
    
{
        
ifr = (structifreq *)ptr;
        
len = max(sizeof(structsockaddr), ifr->ifr_addr.sa_len);
        
ptr += sizeof(ifr->ifr_name) + len;    // for next one in buffer
        
        
if(ifr->ifr_addr.sa_family != AF_INET)
        
{
            
continue;    // ignore if not desired address family
        
}
        
        
if((cptr = (char *)strchr(ifr->ifr_name, ':')) != NULL)
        
{
            *
cptr = 0;        // replace colon will null
        
}
        
        
if(strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0)
        
{
            
continue;    /* already processed this interface */
        
}
        
        
memcpy(lastname, ifr->ifr_name, IFNAMSIZ);
        
        
ifrcopy = *ifr;
        
ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);
        
flags = ifrcopy.ifr_flags;
        
if((flags & IFF_UP) == 0)
        
{
            
continue;    // ignore if interface not up
        
}
        
        
if_names[nextAddr] = (char *)malloc(strlen(ifr->ifr_name)+1);
        
if(if_names[nextAddr] == NULL)
        
{
            
return;
        
}
        
strcpy(if_names[nextAddr], ifr->ifr_name);
        
        
sin = (structsockaddr_in *)&ifr->ifr_addr;
        
strcpy(temp, inet_ntoa(sin->sin_addr));
        
        
ip_names[nextAddr] = (char *)malloc(strlen(temp)+1);
        
if(ip_names[nextAddr] == NULL)
        
{
            
return;
        
}
        
strcpy(ip_names[nextAddr], temp);
        
        
ip_addrs[nextAddr] = sin->sin_addr.s_addr;
        
        ++
nextAddr;
    
}
    
    
close(sockfd);
}
voidGetHWAddresses()
{
    
structifconfifc;
    
structifreq *ifr;
    
inti, sockfd;
    
charbuffer[BUFFERSIZE], *cp, *cplim;
    
chartemp[80];
    
    
for(i=0; i<MAXADDRS; ++i)
    
{
        
hw_addrs[i] = NULL;
    
}
    
    
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    
if(sockfd < 0)
    
{
        
perror("socket failed");
        
return;
    
}
    
    
ifc.ifc_len = BUFFERSIZE;
    
ifc.ifc_buf = buffer;
    
    
if(ioctl(sockfd, SIOCGIFCONF, (char *)&ifc) < 0)
    
{
        
perror("ioctl error");
        
close(sockfd);
        
return;
    
}
    
    
ifr = ifc.ifc_req;
    
    
cplim = buffer + ifc.ifc_len;
    
    
for(cp=buffer; cp < cplim; )
    
{
        
ifr = (structifreq *)cp;
        
if(ifr->ifr_addr.sa_family == AF_LINK)
        
{
            
structsockaddr_dl *sdl = (structsockaddr_dl *)&ifr->ifr_addr;
            
inta,b,c,d,e,f;
            
inti;
            
            
strcpy(temp, (char *)ether_ntoa(LLADDR(sdl)));
            
sscanf(temp, "%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f);
            
sprintf(temp, "%02X:%02X:%02X:%02X:%02X:%02X",a,b,c,d,e,f);
            
            
for(i=0; i<MAXADDRS; ++i)
            
{
                
if((if_names[i] != NULL) && (strcmp(ifr->ifr_name, if_names[i]) == 0))
                
{
                    
if(hw_addrs[i] == NULL)
                    
{
                        
hw_addrs[i] = (char *)malloc(strlen(temp)+1);
                        
strcpy(hw_addrs[i], temp);
                        
break;
                    
}
                
}
            
}
        
}
        
cp += sizeof(ifr->ifr_name) + max(sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len);
    
}
    
    
close(sockfd);
}

test:

#import " IPAdress.h "
..........
-
( NSString * ) deviceIPAdress {
    
InitAddresses () ;
    
GetIPAddresses () ;
    
GetHWAddresses () ;
    
return [ NSString stringWithFormat :@ " %s " , ip_names [ 1 ]] ;
}
 
-
( void ) viewDidLoad {
    
[ super viewDidLoad ] ;
 
    
NSString * ip_iphone = [ self deviceIPAdress ] ;
  
NSLog ( @ " ip:%@ " , ip_iphone ) ;
}

原代码地址(需翻墙):http://iphonesdksnippets.com/post/2009/09/07/Get-IP-address-of-iPhone.aspx

转载于:https://www.cnblogs.com/cklxmu/archive/2012/03/16/2400239.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值