2010-03-02 14 views
8

Quiero encontrar la dirección IP en una aplicación. Puedo encontrarlo Pero, el problema es que funciona aletas en iphone os 2.0 más o menos. Pero, en el iPhone OS 3.0 es que me da una advertencia:Buscar dirección IP en iphone

warning: no '+currentHost' method found 

warning: (Messages without a matching method signature) 

estoy usando el código, y funciona bien con la versión 2.0 del sistema operativo.

-(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]; 

}

¿Cómo encontrar la dirección IP en el iPhone OS 3.0 o superior versión del sistema operativo?

Gracias de antemano.

+0

La forma más fácil (en mi humilde opinión) es para ir a buscar la IP externa desde un sitio Web, en lugar de consultar la interfaz. – Rev316

Respuesta

4

Por lo que sé, solo hay una forma hacky de hacer eso. Básicamente, abre un socket y obtiene su dirección usando las funciones POSIX. Aquí está el código que he usado para esto:

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

[NSHost currentHost] también funcionará, pero no se utiliza y considera un "API privada" por Apple, por lo que no será capaz de enviar su solicitud a App Almacenar.

+0

¿Qué hay de IPv6?¿Hay algún ejemplo de código sobre cómo recuperarlo? –

1

Obtener la dirección IP es un poco hacky. ¿Estás seguro de que no podrías vivir con la ID del dispositivo (UDID) que es única para cada iPhone y que se puede recuperar fácilmente a través de la API pública?

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

Uso esto para conseguir su IP

Si cualquier error Por favor, use

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

'en0' devolvió' 127.0.0.1' para mí en mi ipad3, tuve que usar 'en1' ... No estoy seguro de qué tan permanente es esa solución ... – Soup

1

No es una forma más de obtener la dirección IP y que también Global 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); 

El sitio anterior le dará la IP Global. Simplemente ponga esto en su código y use la dirección IP donde quiera y también obtenga la ubicación del usuario que usa su aplicación ya que esto le da IP global.

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

buena solución. parece el mejor –

1

Usted debe tener una mirada a este buen proyecto: uidevice-extension

Specialy this class

importación UIDevice-Reachability.h en su proyecto a continuación, tratar con uno de estos comandos:

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

@Nikita P que necesita importar la clase UIDevice-Reachability.m entonces podrá llamar a esas funciones. Y sí, son públicos –

+0

thnaks. Solo quería saber si puedo usarlos en las aplicaciones de la tienda de aplicaciones –

+0

Como esta clase usa solo la función pública, puede usarlas en la App Store –

4

Ponga esta secuencia de comandos en un servidor PHP correr web:

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

Llame a este en el dispositivo:

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

¡Muchas gracias! – Mutix

+0

agradable, pero no funciona sin una conexión a Internet. y es un poco contra el propósito, ya que normalmente quieres la dirección IP local –