Альтернативы NSHost в приложении для iPhone

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

    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? Я не совсем уверен, с чего начать.

РЕДАКТИРОВАТЬ:

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

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

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

3 ответа

Решение

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

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

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

Следующий код выполняет очень, очень простое синхронное разрешение (как у вас выше с 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
Другие вопросы по тегам