2010-03-02 45 views
8

Tôi muốn tìm địa chỉ IP trong một ứng dụng. Tôi có thể tìm thấy nó. Nhưng, vấn đề là, nó hoạt động vây trong os iphone 2.0 hay như vậy. Nhưng, trong iphone os 3.0, nó cho tôi một cảnh báo:Tìm địa chỉ IP trong iphone

warning: no '+currentHost' method found 

warning: (Messages without a matching method signature) 

Tôi đang sử dụng mã này và nó hoạt động tốt với phiên bản 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]; 

}

Làm thế nào để tìm địa chỉ IP trong iPhone OS 3.0 hoặc cao hơn phiên bản os?

Xin cảm ơn trước.

+0

Các đơn giản nhất (IMHO) là chỉ để lấy IP bên ngoài từ một trang web, sau đó thay vì truy vấn giao diện. – Rev316

Trả lời

4

Theo tôi biết, chỉ có một cách hacky để thực hiện điều đó. Bạn về cơ bản mở một ổ cắm và nhận địa chỉ của nó bằng cách sử dụng các chức năng POSIX. Đây là mã tôi đã sử dụng cho việc này:

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

[NSHost currentHost] cũng sẽ làm việc, nhưng nó bị phản đối và coi là một "API Riêng tư" của Apple, do đó bạn sẽ không có khả năng nộp đơn xin App Cửa hàng.

+0

Điều gì về IPv6?Có bất kỳ ví dụ mã nào về cách truy xuất nó không? –

1

Bắt địa chỉ IP hơi bị hack. Bạn có chắc chắn rằng bạn không thể sống với ID thiết bị (UDID) duy nhất cho mỗi iPhone và có thể được truy xuất dễ dàng thông qua API công cộng không?

[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; 
} 

Sử dụng này để có được IP của bạn

Nếu bất kỳ lỗi nào Vui lòng sử dụng

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

'en0' trả về' 127.0.0.1' cho tôi trên ipad3 của tôi, tôi đã phải sử dụng 'en1' ... Không chắc chắn cách khắc phục vĩnh viễn là ... – Soup

1

Có thêm một cách để có được địa chỉ IP và IP quá toàn cầu

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

Trang web trên sẽ cung cấp cho bạn IP toàn cầu. Chỉ cần đặt mã này vào mã của bạn và sử dụng địa chỉ IP ở nơi bạn muốn và cũng có được vị trí của người dùng bằng ứng dụng của bạn vì điều này cung cấp cho IP toàn cầu.

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

giải pháp tốt đẹp. có vẻ tốt nhất –

1

Bạn nên có một cái nhìn cho dự án tốt này: uidevice-extension

specialy this class

nhập UIDevice-Reachability.h trong dự án của bạn thì hãy thử với một trong những lệnh:

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

@Nikita P bạn cần phải nhập lớp UIDevice-Reachability.m thì bạn sẽ có thể gọi những chức năng đó. Và có họ là công khai –

+0

thnaks. Tôi chỉ muốn biết nếu tôi có thể sử dụng chúng trên các ứng dụng cửa hàng ứng dụng –

+0

Vì lớp này chỉ sử dụng chức năng công cộng, bạn có thể sử dụng chúng trên App Store –

4

Đặt tập lệnh này vào một PHP web server chạy:

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

Gọi này trên thiết bị:

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

Cảm ơn bạn rất nhiều! – Mutix

+0

đẹp, nhưng nó không hoạt động nếu không có kết nối internet. và đó là kinda chống lại mục đích, vì bạn thường muốn địa chỉ ip địa phương –

Các vấn đề liên quan