2011-05-19 9 views
10

Edytuj 23.5.11Aktualizacja iPhone osiągalności o zmianach Network

Jestem teraz zastanawiasz się, czy jestem na inżynierii tym. Kiedy korzystać z połączenia internetowego, ja obsługiwać go właściwie - albo:

  • w tle ze wskaźnikiem postępu lub aktywność pokazując a jeśli to się nie powiedzie, to wyświetli odpowiedni komunikat lub

  • nazywam innym aplikacja, Safari lub Mapy, które następnie wykonają własne sprawdzenie i zakończą niepowodzeniem, jeśli nie ma połączenia. To pozostawia użytkownika w tej innej aplikacji, która się nie powiodła, co nie jest idealne.

Więc jeśli robię to, co ja sugeruję poniżej i standard osiągalności nie zwraca osiągalny i wtedy trzeba zrobić NSURLConnection w przypadku radia poszły spać, to nie jestem pewien, że to lepsze niż jakikolwiek po prostu staram się zdobyć zasoby online.

Jeśli ktoś może pomóc - byłbym bardzo wdzięczny. Jestem prawie gotowy do przesłania, po prostu trzeba to naprawić.

Korzystam z przykładowej aplikacji Apple do osiągnięcia dobrego efektu, z wyjątkiem sytuacji, gdy połączenie komórkowe lub komórkowe przechodzi w tryb uśpienia, a następnie wraca lub połączenie Wi-Fi jest aktywne, a połączenie komórkowe jest wtedy zależne.

Jest w porządku, gdy połączenie mobilne (komórkowe) się nie zmienia. Jest to zgodne z komentarzami, które przeczytałem, że gdy radio komórkowe się wyłączy, trzeba je ręcznie obudzić. Jednak nie widzę, jak to zrobić.

Czy muszę skonfigurować NSURLConnection? Jakiś przykładowy kod byłby świetny. Kiedy otrzymam powiadomienie, że nie ma połączenia, czy wyślę NSURLConnection i polecę użytkownikowi, aby spróbował ponownie za chwilę, a następnie, jeśli otrzymam wywołanie zwrotne, aby powiedzieć, że się powiodło, przesłonię ustawienie wyłączenia z Dostępności?

Ponadto, musiałbym to zrobić, gdy wydaje się, że nie ma połączenia, na wypadek gdyby to było - wydaje się, że to marnotrawstwo zasobów, kiedy może nie być tak. np. iPod Touch, który nie ma zasięgu Wi-Fi.

Przyjrzałem się także opcji DDG, ale wygląda na to, że będzie to ten sam problem.

Wszelkie pomocne sugestie będą mile widziane.

Dzięki,

Chris.

Odpowiedz

13

Nie możesz i nie powinieneś używać kodu próby Reachability firmy Apple (lub SCNetworkReachabilityFlags), aby określić, czy zasób sieci jest lub będzie dostępny. Udostępniają przydatne narzędzia do przekazywania opinii użytkowników o przyczynach niepowodzenia połączenia i określaniu, czy i kiedy należy spróbować ponownie nawiązać połączenie. Jednak jeśli chcesz uzyskać dostęp do zasobu sieciowego, powinieneś po prostu o to poprosić.

Nie udostępniaj użytkownikom powiadomień "brak połączenia sieciowego" na podstawie flag osiągalności. Wykonaj żądanie sieciowe, a jeśli się nie uda, sprawdź flagi osiągalności i swoją historię żądań, aby sprawdzić, czy powinieneś poinformować użytkownika, że ​​żądanie nie powiodło się lub po cichu ponów próbę. Nie powinieneś chcieć spamować użytkownika przy każdej awarii sieci.Jeśli żądanie nie powiedzie się, rozważ jego ponowną próbę, jeśli host wydaje się być osiągalny i zgłasza niepowodzenie użytkownikowi po kilku próbach lub gdy flagi osiągalności zasugerują, że rzeczywiście utraciłeś połączenie sieciowe, a nie tylko pojedyncze żądanie zakończyło się niepowodzeniem.

Jeśli chodzi o reaktywację radia urządzenia, musisz zrównoważyć chęć pobrania zasobów sieciowych, umożliwiając urządzeniu wyłączenie interfejsów sieciowych w celu oszczędzania energii. Nie wiem, co próbuje zrobić Twoja aplikacja, ale zalecam, aby urządzenie wyłączyło się, a następnie spróbowało nawiązać połączenie w odpowiedzi na prośbę aplikacji o pobranie nowych danych. Nie widzę przypadku, w którym chciałbyś reaktywować radio tylko po to, aby dać użytkownikowi wskazówkę, że niektóre zasoby sieciowe mogą być lub mogą nie być osiągalne.

Zobacz https://devforums.apple.com/message/409618

Jedynym sposobem, aby wiedzieć, czy host jest dostępny jest, aby spróbować połączyć się z nim. Jeśli to połączenie nie powiedzie się, możesz użyć funkcji osiągalności, aby przekazać użytkownikowi informacje zwrotne i sterować mechanizmem ponawiania prób, ale użycie funkcji osiągalności do preflightowania połączenia nie jest dobrym pomysłem.

Kluczową kwestią jest to, że osiągalność wykorzystuje lokalne informacje do określenia wyników. To nic nie mówi o stanie szerszego Internetu. Serwer źródłowy może być wyłączony lub jakaś liczba łączy między tobą a serwerem źródłowym może być niedostępna, a osiągalność z radością powie, że jest osiągalny. W tym momencie spróbujesz się połączyć, a połączenie się nie powiedzie. Tak więc i tak będziesz musiał poradzić sobie z błędem, co oznacza, że ​​równie dobrze możesz nie wykonywać inspekcji wstępnej i pozwolić, aby standardowa obsługa błędów obejmowała również tę sprawę.

wziąć również spojrzeć na to pytanie dotyczące sprawdzania zasobu przed załadowaniem go, używając zewnętrznej aplikacji: https://devforums.apple.com/message/411329

Making żądanie HEAD dla zasobu powinno dać rozsądny pomysł, jeśli aplikacja zewnętrzna będzie w stanie załadować go bez konieczności pobierania znacznej ilości danych (opóźnienie nadal będzie problemem).

+1

Wow Jonah - miła, jasna i szczegółowa odpowiedź. Czy gdzieś uczysz? –

+0

Możesz jednak użyć kodu zasięgu, aby otrzymać powiadomienie, gdy zmieni się "status osiągalności". –

+0

Dzięki @Jonah - to wspaniała, ostateczna odpowiedź. Myślę, że twoja klarowność pomoże wielu ludziom, co widać na podstawie głosów, które otrzymaliśmy jeszcze przed odpowiedzią. Teraz zamierzam znacznie uprościć mój proces. Dzięki jeszcze raz. – Chris

Powiązane problemy