Я готовлю небольшую заявку. Когда я перезагружаю свой 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
}
}
Ответ от Apple:
Привет Павел,
Я отвечаю на ваш вывод о том, что попытка использовать функцию BSD getaddrinfo проблематична при попытке установить соединение, где возможно только соединение с беспроводной глобальной сетью (WWAN) (EDGE, 3G). Проблема, с которой вы столкнулись, заключается в том, что из соображений экономии заряда аккумулятора WWAN будет отключаться, когда сетевые службы не нужны. Тогда возникает вопрос, как активировать WWAN, когда требуются сетевые сервисы.
Официально поддерживаемый механизм установления соединения с WWAN заключается в использовании API-интерфейса CFSocketStream (или зависимого API-интерфейса - NSSocket, а также CFHTTPStream, CFFTPStream, NSURLRequest и NSURLConnection API-интерфейсов). Это означает, что официально поддерживается только 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 очень скоро.
....