гетаддринфо в айфоне

Я готовлю небольшое приложение. Когда я перезагружаю свой iPhone 3G (с подключением к интернету 3G) и устанавливаю это приложение, getaddrinfo всегда возвращает EAI_NONAME (8). Я закрываю приложение и запускаю Safari, затем запускаю мое приложение - все работает. В чем проблема?

- (void)viewDidLoad {
    [super viewDidLoad];

    const char* hostname = "google.com";

    struct addrinfo hints, *res;
    int retval;

    memset (&hints, 0, sizeof (struct addrinfo));
    hints.ai_family = PF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;

    retval = getaddrinfo (hostname, NULL, &hints, &res);
    if (retval == 0) {
        freeaddrinfo (res);
    }else if(retval == EAI_NONAME)
    {
        //noname
    }
}

Answer from Apple:

Привет Павел,

Я отвечаю на ваш вывод о том, что попытка использовать функцию BSD getaddrinfo проблематична при попытке установить соединение, где возможно только соединение с беспроводной глобальной сетью (WWAN) (EDGE, 3G). Проблема, с которой вы столкнулись, заключается в том, что из соображений экономии заряда аккумулятора WWAN будет отключаться, когда сетевые службы не нужны. Тогда возникает вопрос, как активировать WWAN, когда требуются сетевые сервисы.

Официально поддерживаемый механизм для установления соединения WWAN заключается в использовании API-интерфейса CFSocketStream (или зависимого API-интерфейса - NSSocket, а также API-интерфейсов CFHTTPStream, CFFTPStream, NSURLRequest и NSURLConnection). Это означает, что официально поддерживается только TCP. Это ограничение влияет на все приложения на основе сокетов UDP и BSD. Использование вызова BSD Connect не приведет к включению iPhone в WWAN. Это ограничение также применяется ко всем другим функциям BSD, которые при подключении WiFi могут привести к пакетной передаче.

Однако в текущей операционной системе iPhone после установления соединения WWAN использование разъемов BSD и функций CFSocket будет поддерживать соединение WWAN. Это позволяет приложению на основе сокетов UDP или BSD устанавливать соединение WWAN с помощью API CFSocketStream для установления соединения с сервером TCP (включая веб-серверы HTTP). Как только соединение станет активным, программа сможет функционировать, как в прошлом. Это то, что Safari, Mail и другие приложения Apple, которые используют сетевые службы, используют для установления своих соединений. По этой причине, когда вы запускаете Safari, то при запуске приложения работает сетевой доступ. При использовании Safari iPhone устанавливает соединение WWAN. Когда вы выходите из Safari, WWAN не отключается автоматически - он остается активным в течение короткого периода времени. Если вы запускаете свое приложение, службы WWAN активны, и ваше приложение будет активировать WWAN до тех пор, пока существует сетевая активность.

Если ваше приложение будет использовать TCP для работы в сети, то вы можете изменить свой код, чтобы использовать CFSocketStream или зависимый API для работы в сети. Конечно, если у вас есть целая библиотека функциональных возможностей сокетов BSD, это не может быть разумным решением для тех, кто хочет выложить свое приложение в App Store очень скоро.

....

Ответы на вопрос(1)

Ваш ответ на вопрос