Альтернативы NSHost в приложении для iPhone - PullRequest
5 голосов
/ 08 августа 2010

Я сейчас использую этот код

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

чтобы получить свой IP-адрес для сетевого приложения, над которым я работаю, однако я знаю, что NSHost - это закрытый API, который будет отклонен. Может кто-нибудь помочь мне с работой этого кода, чтобы получить те же результаты без использования NSHost? Я не совсем уверен, с чего начать.

EDIT:

Следуя советам, которые кажутся чертовски почти идеальными ниже, я добавил этот код в свое приложение вместо кода выше

    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");
}

Я удалил 4-ю строку (поскольку у меня уже есть эта информация из других источников), но я получаю ошибки, связанные с необъявлением CFHostRef. Как бы я решить это? Кажется, это мое единственное большое препятствие, поскольку другие ошибки основаны только на отсутствии возможности видеть hostRef после этого. РЕДАКТИРОВАТЬ: поцарапать, что я также получить kCFHostAddresses необъявленные.

Ответы [ 3 ]

6 голосов
/ 08 августа 2010

Вы можете использовать CFHost для достижения того же. В верхней части CFHost Reference находится рецепт кулинарной книги для поиска.

Следующий код имеет очень очень базовое синхронное разрешение (как у вас выше с NSHost). Обратите внимание, что вы не хотите этого делать, поскольку оно может сделать ваше приложение не отвечающим , потому что оно не возвращается, пока не будет решено или истечет время ожидания.

Вместо этого используйте асинхронный поиск (CFHostSetClient и CFHostScheduleWithRunLoop, как описано в документации CFHost выше). Кроме того, в зависимости от того, что вы планируете делать, вы можете захотеть использовать API достижимости. Ознакомьтесь с сеансами WWDC по работе в сети, доступными на веб-сайте разработчиков 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 голосов
/ 13 августа 2010

http://developer.apple.com/iphone/library/qa/qa2009/qa1652.html

Получил отличный ответ через систему поддержки разработчиков, это сработало отлично.

0 голосов
/ 08 августа 2010
...