Wiem, że to pytanie będzie się wydawało naiwne dla wielu innych, jednak nie sądzę, aby prosty przypadek został tutaj dobrze wyjaśniony. Pochodzące z tła systemu Android i BlackBerry, wysyłanie żądań za pośrednictwem sieci HTTPUrlConnection
natychmiast kończy się niepowodzeniem, jeśli nie ma dostępnego połączenia. Wydaje się, że jest to całkowicie rozsądne zachowanie i byłem zaskoczony, że NSURLConnection
system iOS go nie naśladował.
Rozumiem, że firma Apple (i inne osoby, które ją rozszerzyły) udostępnia Reachability
klasę pomocną w określaniu stanu sieci. Byłem szczęśliwy, widząc to jako pierwszy, iw pełni oczekiwałem, że zobaczę coś takiego bool isNetworkAvailable()
, ale zamiast tego, ku mojemu zdziwieniu, znalazłem złożony system wymagający rejestracji powiadomień i oddzwonień, a także kilka pozornie niepotrzebnych szczegółów. Musi być lepszy sposób.
Moja aplikacja już z wdziękiem obsługuje awarie połączenia, w tym brak łączności. Użytkownik jest powiadamiany o awarii, a aplikacja przechodzi dalej.
Dlatego moje wymagania są proste: pojedyncza, synchroniczna funkcja, którą mogę wywołać przed wszystkimi żądaniami HTTP, aby określić, czy powinienem zawracać sobie głowę wysłaniem żądania, czy nie. W idealnym przypadku nie wymaga konfiguracji i po prostu zwraca wartość logiczną.
Czy to naprawdę nie jest możliwe na iOS?
źródło
Odpowiedzi:
Zrobiłem trochę więcej badań i aktualizuję moją odpowiedź za pomocą bardziej aktualnego rozwiązania. Nie jestem pewien, czy już się temu przyjrzałeś, ale jest ładny przykładowy kod dostarczony przez Apple.
Pobierz przykładowy kod tutaj
Dołącz do projektu pliki Reachability.h i Reachability.m. Spójrz na ReachabilityAppDelegate.m, aby zobaczyć przykład, jak określić osiągalność hosta, osiągalność przez Wi-Fi, WWAN itp. Aby bardzo prosto sprawdzić osiągalność sieci, możesz zrobić coś takiego
@ BenjaminPiette's: Nie zapomnij dodać SystemConfiguration.framework do swojego projektu.
źródło
Biorąc pod uwagę, że ten wątek jest najlepszym wynikiem w Google dla tego typu pytań, pomyślałem, że dostarczę rozwiązanie, które zadziałało dla mnie. Używałem już AFNetworking , ale wyszukiwanie nie ujawniło, jak wykonać to zadanie za pomocą AFNetworking, aż do połowy mojego projektu.
To, czego chcesz, to AFNetworkingReachabilityManager .
Możesz również użyć następujących elementów, aby przetestować osiągalność synchronicznie (po rozpoczęciu monitorowania):
źródło
AFNetworkReachabilityManager
na światło dzienne!AFNetworkReachabilityManager.reachable
NIE wykonuje żadnej synchronicznej kontroli. Zwraca wartość logiczną lubreachableViaWWAN
ireachableViaWifi
.Przepraszam, że odpowiadam za późno, ale mam nadzieję, że ta odpowiedź może komuś pomóc w przyszłości.
Poniżej znajduje się mały natywny fragment kodu C, który może sprawdzać łączność z Internetem bez dodatkowej klasy.
Dodaj następujące nagłówki:
Kod:
Szybki 3
źródło
Obecnie używam tej prostej metody synchronicznej, która nie wymaga żadnych dodatkowych plików w twoich projektach lub delegatach.
Import:
Utwórz tę metodę:
Następnie, jeśli umieściłeś to w
MyNetworkClass
:Jeśli testujesz w symulatorze, włączaj i wyłączaj Wi-Fi komputera Mac, ponieważ wygląda na to, że symulator zignoruje ustawienie telefonu.
Aktualizacja:
W końcu użyłem wątku / asynchronicznego wywołania zwrotnego, aby uniknąć blokowania głównego wątku; i regularnie ponownie testuję, aby móc użyć wyników z pamięci podręcznej - chociaż należy unikać niepotrzebnego utrzymywania otwartych połączeń danych.
Jak opisał @thunk, istnieją lepsze adresy URL do użycia, których używa Apple. http://cadinc.com/blog/why-your-apple-ios-7-device-wont-connect-to-the-wifi-network
źródło
www.apple.com
to duża strona internetowa ... lepszym rozwiązaniem będziewww.google.com
www.appleiphonecell.com
jest podobno dostępny wyłącznie w tym celu i najwyraźniej nie jest blokowany w Chinach.Jest to możliwe i jest naprawdę proste, jeśli spojrzysz na to po zakończeniu implementacji, co jest znowu - bardzo proste, ponieważ jedyne elementy, których potrzebujesz, to dwie zmienne logiczne: osiągalność Internetu i osiągalność hosta (często potrzebujesz więcej niż jednej z nich ). Po złożeniu klasy pomocniczej, która może określić stan połączeń, naprawdę nie przejmujesz się implementacją potrzebną do poznania tych procedur.
Przykład:
Oraz plik .m:
źródło
Ktoś już wcześniej rozwiązał ten problem w prosty, wielokrotny sposób.
DDGReachability
.EDYCJA: Lub
tonymillion/Reachability
.źródło
Wyodrębniłem kod i umieściłem go w jednej metodzie, mam nadzieję, że pomoże to innym.
...
źródło
Piszę tutaj szybką wersję zaakceptowanej odpowiedzi, o ile ktoś uzna ją za przydatną, kod jest napisany szybko 2,
Możesz pobrać wymagane pliki z SampleCode
Dodaj
Reachability.h
iReachability.m
plik do swojego projektu,Teraz trzeba będzie utworzyć
Bridging-Header.h
plik, jeśli żaden nie istnieje dla twojego projektu,W
Bridging-Header.h
pliku dodaj tę linię:Teraz, aby sprawdzić połączenie internetowe
źródło
Myślę, że to mogłoby pomóc ...
źródło
Możesz również spróbować tego, jeśli skonfigurowałeś już AFNetworking w swoim projekcie.
źródło
Oto dobre rozwiązanie do sprawdzania łączności za pomocą Swift, bez korzystania z funkcji Reachability. Znalazłem to na tym blogu .
Utwórz nowy plik Swift w swoim projekcie o nazwie
Network.swift
(na przykład). Wklej ten kod do tego pliku:Następnie możesz sprawdzić łączność w dowolnym miejscu projektu, używając:
źródło
EDYTUJ: To nie zadziała dla sieciowych adresów URL (patrz komentarze)
Od wersji iOS 5 istnieje nowa metoda wystąpienia NSURL:
Wskaż witrynę, na której Ci zależy, lub wskaż apple.com; Myślę, że jest to nowe połączenie jednowierszowe, aby sprawdzić, czy na Twoim urządzeniu działa internet.
źródło
Nie byłem również zadowolony z dostępnych opcji sprawdzania w Internecie (Dlaczego to nie jest natywny interfejs API?!?!)
Mój własny problem dotyczył 100% utraty pakietów - gdy urządzenie jest podłączone do routera, ale router nie jest połączony z Internetem. Dostępność i inni będą wisieć na wieki. Utworzyłem użytkową klasę pojedynczą, aby sobie z tym poradzić, dodając limit czasu asynch. Działa dobrze w mojej aplikacji. Mam nadzieję, że to pomoże. Oto link na github:
https://github.com/fareast555/TFInternetChecker
źródło
Sprawdzanie dostępności połączenia internetowego w (iOS) Xcode 8.2, Swift 3.0
źródło
Zamiennik Apple Reachability napisany ponownie w Swift z zamknięciami , zainspirowany tonymillion: https://github.com/ashleymills/Reachability.swift
Upuść plik
Reachability.swift
do swojego projektu. Ewentualnie użyj CocoaPods lub Carthage - zobacz sekcję Instalacja w pliku README projektu.Otrzymuj powiadomienia o łączności sieciowej:
i do zatrzymywania powiadomień
źródło
Alamofire
Jeśli używasz już Alamofire dla wszystkich RESTful Api, oto co możesz z tego skorzystać.
Możesz dodać następującą klasę do swojej aplikacji i zadzwonić,
MNNetworkUtils.main.isConnected()
aby uzyskać wartość logiczną, czy jest połączona, czy nie.To jest klasa pojedyncza. Za każdym razem, gdy użytkownik łączy lub rozłącza sieć, nadpisuje
self.reachable
poprawnie wartość true / false, ponieważ zaczynamy nasłuchiwaćNetworkReachabilityManager
inicjalizacji on singleton.Aby monitorować osiągalność, musisz podać hosta, obecnie używam, w razie potrzeby mogę
google.com
zmienić na inny lub jeden z twoich.źródło