2010-08-08 4 views
5

Actualmente estoy usando el códigoAlternativas a NSHost de aplicación para el iPhone

NSHost *host = [NSHost hostWithAddress:hostname]; 
if (host == nil) { 
    host = [NSHost hostWithName:hostname]; 
    if (host == nil) { 
     [self setMessage:@"Invalid IP address or hostname:"]; 
     return; 
    } 
} 

retrive mi dirección IP para una aplicación de red que estoy trabajando, sin embargo, soy consciente de que NSHost es una API privada que será rechazado ¿Alguien puede ayudarme a trabajar este código para producir los mismos resultados sin usar NSHost? No estoy seguro de por dónde empezar.

EDIT:

Siguiendo las sugerencias que parecen maldito casi perfecto a continuación He añadido este código en mi aplicación en el lugar del código anterior

Boolean result; 
CFHostRef hostRef; 
CFArrayRef addresses; 
NSString *hostname = @"www.apple.com"; 
hostRef = CFHostCreateWithName(kCFAllocatorDefault, (CFStringRef)hostname); 
if (hostRef) { 
    result = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL); // pass an error instead of NULL here to find out why it failed 
    if (result == TRUE) { 
     addresses = CFHostGetAddressing(hostRef, &result); 
    } 
} 
if (result == TRUE) { 
    NSLog(@"Resolved"); 
} else { 
    NSLog(@"Not resolved"); 
} 

He quitado la cuarta línea (como Ya tengo esta información de otro lado) pero obtengo errores que se basan en que CFHostRef no se declara. ¿Cómo lo resolvería? Parece ser mi único gran obstáculo, ya que otros errores solo se basan en la falta de poder ver hostRef después de eso. EDITAR: rayar que también recibo kCFHostAddresses no declarado.

Respuesta

6

Puede usar CFHost para lograr lo mismo. En la parte superior de CFHost Reference hay una receta de libro de cocina para hacer la búsqueda.

El código siguiente hace muy, resolución síncrona muy básica (como la de arriba sería con NSHost). Tenga en cuenta que no desea hacer esto ya que puede hacer que su aplicación no responda porque no se devuelve hasta que se resuelva o llegue el tiempo de espera.

Uso de búsqueda asíncrona en lugar (CFHostSetClient y CFHostScheduleWithRunLoop como se describe en la documentación CFHost arriba). Además, dependiendo de lo que planeas hacer, es posible que desees estudiar el uso de las API de accesibilidad. Consulte las sesiones de WWDC sobre redes disponibles en el sitio web para desarrolladores de iPhone.

Boolean result; 
CFHostRef hostRef; 
CFArrayRef addresses; 
NSString *hostname = @"www.apple.com"; 
hostRef = CFHostCreateWithName(kCFAllocatorDefault, (CFStringRef)hostname); 
if (hostRef) { 
    result = CFHostStartInfoResolution(hostRef, kCFHostAddresses, NULL); // pass an error instead of NULL here to find out why it failed 
    if (result == TRUE) { 
     addresses = CFHostGetAddressing(hostRef, &result); 
    } 
} 
if (result == TRUE) { 
    NSLog(@"Resolved"); 
} else { 
    NSLog(@"Not resolved"); 
} 

// Don't forget to release hostRef when you're done with it 
+0

¿Puedes ofrecer un poco más de orientación para la receta específica? No puedo entender qué bit estoy viendo (no sentado en frente de mi máquina en el minuto, luchando por ver cómo se relaciona con el resto de mi código) – David26th

+0

Editado arriba para un ejemplo sincrónico muy simple (que definitivamente no debes usar a menos que quieras que tu UI se congele). – puzzle

+0

Esto resultó útil para los servicios anunciados de Bonjour. No se puede lograr que funcione para las IP ingresadas manualmente, lo que hizo NSHost. – David26th

0
+0

Wollongong mira cómo implementar esto mañana cuando tengo mi computadora portátil conmigo. Trabajando en mi anillo ipad ahora. – David26th

+0

Tenga en cuenta que esto es para obtener la dirección IP propia del iPhone mientras parece que está buscando resolver un nombre de host, al menos por la forma en que leí su pregunta. – puzzle

+0

En realidad, puede que estés en algo aquí xtina. Solo volví a mirar mi código después de recibir el rechazo de la manzana, así que es posible que tenga que verificarlo. ¿Cómo haría esto si quisiera resolver un nombre de host? – David26th

Cuestiones relacionadas