2010-03-02 4 views
8

Я хочу найти IP-адрес в приложении. Я могу это найти. Но проблема в том, что она работает плавниками в iphone os 2.0 или около того. Но, в iPhone OS 3.0 это дает мне предупреждение:Найти IP-адрес в iphone

warning: no '+currentHost' method found 

warning: (Messages without a matching method signature) 

Я использую этот код, и он прекрасно работает с операционной системой версии 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]; 

}

Как найти IP-адрес в iPhone OS 3.0 или выше версии ОС?

Заранее спасибо.

+0

Самый простой (ИМХО) просто извлечь внешний IP с веб-сайта, а затем запросить интерфейс. – Rev316

ответ

4

Насколько я знаю, есть только один хакерский способ сделать это. Вы в основном открываете сокет и получаете его адрес, используя функции POSIX. Вот код, который я использовал для этого:

http://iphonesdksnippets.com/post/2009/09/07/Get-IP-address-of-iPhone.aspx

[NSHost currentHost] также будет работать, но она устарела и считается «Private API» на Apple, так что вы не сможете подать заявление на App Хранить.

+0

Как насчет IPv6?Есть ли пример кода, как его получить? –

1

Получение IP-адреса немного взломано. Вы уверены, что не можете жить с идентификатором устройства (UDID), который уникален для каждого iPhone, и его можно легко получить через открытый API?

[UIDevice currentDevice].uniqueIdentifier

3
- (NSString *)getIPAddress { 

NSString *address = @"error"; 
struct ifaddrs *interfaces = NULL; 
struct ifaddrs *temp_addr = NULL; 
int success = 0; 
// retrieve the current interfaces - returns 0 on success 
success = getifaddrs(&interfaces); 

if (success == 0) { 
// 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 
     // it may also be en1 on your ipad3. 
      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; 
} 

Используйте это, чтобы получить IP

Если какие-либо ошибки Пожалуйста, используйте

#include <ifaddrs.h> 
#include <arpa/inet.h> 
+1

'en0' возвратил' 127.0.0.1' для меня на моем ipad3, мне пришлось использовать 'en1' ... Не уверен, как постоянное это исправление ... – Soup

1

Существует еще один способ получить IP-адрес и что слишком глобальный IP-адрес

NSString* [email protected]"http://www.whatismyip.org/"; 
NSURL *url = [[NSURL alloc] initWithString:ip]; 
NSString *ans = [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:&error]; 
NSLog(@"%@",ans); 

Вышеупомянутый сайт предоставит вам глобальный IP-адрес. Просто поместите это в свой код и используйте IP-адрес, где захотите, а также получите местоположение пользователя, используя ваше приложение, поскольку это дает глобальный IP-адрес.

0
bool success; 
struct ifaddrs *addrs; 
const struct ifaddrs *cursor; 
const struct sockaddr_dl *dlAddr; 
const uint8_t *base; 
int i; 

success = getifaddrs(&addrs) == 0; 
if (success) { 
    cursor = addrs; 
    while (cursor != NULL) { 
     if ((cursor->ifa_addr->sa_family == AF_LINK) 
      && (((const struct sockaddr_dl *) cursor->ifa_addr)->sdl_type ==IFT_ETHER) 
      ) { 
      dlAddr = (const struct sockaddr_dl *) cursor->ifa_addr; 
      //  fprintf(stderr, " sdl_nlen = %d\n", dlAddr->sdl_nlen); 
      //  fprintf(stderr, " sdl_alen = %d\n", dlAddr->sdl_alen); 
      base = (const uint8_t *) &dlAddr->sdl_data[dlAddr->sdl_nlen]; 
      printf(" MAC address "); 
      for (i = 0; i < dlAddr->sdl_alen; i++) { 
       if (i != 0) { 
        printf(":"); 
       } 
       printf("%02x", base[i]); 
      } 
      printf("\n"); 
     } 
     cursor = cursor->ifa_next; 
    } 
} 
6
#include <arpa/inet.h> 
#include <netdb.h> 
#include <net/if.h> 
#include <ifaddrs.h> 

// retun the host name 
+ (NSString *)hostname 
{ 
    char baseHostName[256]; 
    int success = gethostname(baseHostName, 255); 
    if (success != 0) return nil; 
    baseHostName[255] = '\0'; 

#if !TARGET_IPHONE_SIMULATOR 
    return [NSString stringWithFormat:@"%s.local", baseHostName]; 
#else 
    return [NSString stringWithFormat:@"%s", baseHostName]; 
#endif 
} 

// return IP Address 
+ (NSString *)localIPAddress 
{ 
    struct hostent *host = gethostbyname([[self hostname] UTF8String]); 
    if (!host) {herror("resolv"); return nil;} 
    struct in_addr **list = (struct in_addr **)host->h_addr_list; 
    return [NSString stringWithCString:inet_ntoa(*list[0]) encoding:NSUTF8StringEncoding]; 
} 
+0

приятное решение. кажется лучшим –

1

Вы должны взглянуть на этот хороший проект: uidevice-extension

специальным образом this class

Импорт UIDevice-Reachability.h в проекте, то попробуйте одну из этих команд:

NSString *myIp = [UIDevice localIPAddress]; 
NSString *myIp = [UIDevice localWiFiIPAddress]; 
NSString *myIp = [UIDevice whatismyipdotcom]; // is using @aamritrao solution 
+0

@Nikita P вам нужно импортировать класс UIDevice-Reachability.m , тогда вы сможете вызвать эту функцию. И да, они публичные –

+0

thnaks. Я просто хотел знать, могу ли я использовать их в приложениях для приложений. –

+0

Поскольку этот класс использует публичную функцию, вы можете использовать их в App Store –

4

Включите этот скрипт в сервер работает веб-PHP:

<?php 
$ip = getenv("REMOTE_ADDR"); 
echo $ip; 
?> 

Вызов этого на устройстве:

NSURL *scriptURL = [[NSURL alloc] initWithString:@"http://yourserver.com/script.php"]; 
NSString *ip = [NSString stringWithContentsOfURL: scriptURL encoding:NSASCIIStringEncoding error:nil]; 
+0

Большое спасибо! – Mutix

+0

приятный, но он не работает без подключения к Интернету. и это не соответствует цели, поскольку вы обычно хотите локальный IP-адрес –