getaddrinfo w iPhone

Przygotowuję małą aplikację. Po ponownym uruchomieniu iPhone'a 3G (z połączeniem internetowym 3G) i zainstalowaniu tej aplikacji getaddrinfo zawsze zwraca EAI_NONAME (8). Zamykam aplikację i uruchamiam Safari, a następnie uruchamiam aplikację - wszystko działa. W czym problem?

- (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
    }
}

Odpowiedź od Apple:

Cześć Pavel,

Odpowiadam na twoje odkrycie, że próba użycia funkcji getaddrinfo BSD jest problematyczna przy próbie uzyskania połączenia, w którym możliwe jest tylko połączenie bezprzewodowej sieci rozległej (WWAN) (EDGE, 3G). Napotkany problem polega na tym, że ze względu na oszczędność baterii sieć WWAN zostanie wyłączona, gdy usługi sieciowe nie będą potrzebne. Pojawia się pytanie, jak aktywować sieć WWAN, gdy wymagane są usługi sieciowe.

Oficjalnie obsługiwany mechanizm ustanawiania połączenia WWAN polega na użyciu interfejsu API CFSocketStream (lub zależnego API - NSSocket, a także interfejsów API CFHTTPStream, CFFTPStream, NSURLRequest i NSURLConnection). Oznacza to, że oficjalnie obsługiwany jest tylko TCP. To ograniczenie wpływa na wszystkie aplikacje oparte na gniazdach UDP i BSD. Korzystanie z połączenia BSD Connect nie wyzwoli iPhone'a, aby włączyć WWAN. To ograniczenie dotyczy również wszystkich innych funkcji BSD, które w przypadku połączenia WiFi spowodowałyby transmisję pakietów.

Jednak w obecnym systemie operacyjnym iPhone OS, po ustanowieniu połączenia WWAN, użycie gniazd BSD i funkcji CFSocket utrzyma połączenie WWAN przy życiu. Umożliwia to aplikacji opartej na UDP lub BSD Socket ustanowienie połączenia WWAN przy użyciu interfejsu API CFSocketStream w celu ustanowienia połączenia z serwerem TCP (w tym serwerami HTTP). Gdy połączenie jest aktywne, program może działać tak jak w przeszłości. To właśnie Safari, Mail i inne aplikacje Apple, które uzyskują dostęp do usług sieciowych, używają do nawiązywania połączeń. Z tego powodu, po uruchomieniu Safari, uruchom prace dostępu do sieci aplikacji. Korzystanie z Safari powoduje, że iPhone ustanawia połączenie WWAN. Po zamknięciu przeglądarki Safari sieć WWAN nie wyłącza się automatycznie - pozostaje aktywna przez krótki okres czasu. Po uruchomieniu aplikacji usługi WWAN są aktywne, a aplikacja spowoduje, że sieć WWAN pozostanie aktywna, o ile będzie działać aktywność sieci.

Jeśli twoja aplikacja miałaby korzystać z TCP, do pracy w sieci, możesz zmodyfikować swój kod, aby użyć CFSocketStream lub zależnego API do pracy w sieci. Oczywiście, jeśli masz całą bibliotekę funkcji gniazd BSD, może to nie być rozsądne rozwiązanie dla kogoś, kto chce szybko dostać swoją aplikację do App Store.

....

questionAnswers(1)

yourAnswerToTheQuestion