Chciałbym sprawdzić, czy mam połączenie internetowe w systemie iOS za pomocą bibliotek Cocoa Touch lub w systemie macOS za pomocą bibliotek Cocoa .
Wymyśliłem sposób na zrobienie tego za pomocą NSURL
. Sposób, w jaki to zrobiłem, wydaje się nieco niewiarygodny (ponieważ nawet Google może pewnego dnia przestać działać, a poleganie na stronie trzeciej wydaje się złe) i chociaż mogłem sprawdzić, czy nie ma odpowiedzi z innych witryn, jeśli Google nie zareaguje, wydaje się marnotrawstwem i niepotrzebnym kosztem mojej aplikacji.
- (BOOL) connectedToInternet
{
NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
return ( URLString != NULL ) ? YES : NO;
}
Czy to, co zrobiłem źle, (nie wspominając o tym stringWithContentsOfURL
jest przestarzałe w iOS 3.0 i macOS 10.4), a jeśli tak, to jaki jest lepszy sposób na osiągnięcie tego?
ios
macos
cocoa
cocoa-touch
reachability
Brock Woolf
źródło
źródło
return (BOOL)URLString;
, a nawet lepiej,return !!URLString
lubreturn URLString != nil
NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"https://twitter.com/getibox"] encoding:NSUTF8StringEncoding error:nil];
Aby pozbyć się irytującego ostrzeżenia.Odpowiedzi:
Ważne : to sprawdzenie należy zawsze wykonywać asynchronicznie. Większość poniższych odpowiedzi jest zsynchronizowana, więc bądź ostrożny, w przeciwnym razie zawiesisz aplikację.
Szybki
1) Zainstaluj za pośrednictwem CocoaPods lub Carthage: https://github.com/ashleymills/Reachability.swift
2) Test osiągalności poprzez zamknięcia
Cel C
1) Dodaj
SystemConfiguration
platformę do projektu, ale nie martw się o włączenie go w dowolnym miejscu2) Dodaj wersję Tony Milliona
Reachability.h
iReachability.m
do projektu (znalezione tutaj: https://github.com/tonymillion/Reachability )3) Zaktualizuj sekcję interfejsu
4) Następnie zaimplementuj tę metodę w pliku m kontrolera widoku, który możesz wywołać
Ważna uwaga:
Reachability
klasa jest jednym z najczęściej używanych klas w projektach więc może napotkasz nazywania konfliktów z innymi projektami. Jeśli tak się stanie, będziesz musiał zmienić nazwę jednej pary plikówReachability.h
iReachability.m
na inną, aby rozwiązać problem.Uwaga: używana domena nie ma znaczenia. To tylko testowanie bramy do dowolnej domeny.
źródło
SystemConfiguration.framework
do projektu (dla metody 1).Lubię upraszczać sprawy. Tak to robię:
Następnie używam tego, gdy chcę sprawdzić, czy mam połączenie:
Ta metoda nie czeka na zmianę statusu sieci w celu wykonania różnych czynności. Po prostu testuje status, kiedy o to poprosisz.
źródło
Korzystając z kodu osiągalności Apple, stworzyłem funkcję, która sprawdzi to poprawnie bez konieczności dołączania żadnych klas.
Uwzględnij SystemConfiguration.framework w swoim projekcie.
Dokonaj importu:
Teraz wystarczy wywołać tę funkcję:
I to iOS 5 przetestowany dla Ciebie.
źródło
Kiedyś była to poprawna odpowiedź, ale teraz jest nieaktualna, ponieważ zamiast tego należy subskrybować powiadomienia o osiągalności. Ta metoda sprawdza synchronicznie:
Możesz użyć klasy osiągalności Apple. Umożliwi to również sprawdzenie, czy Wi-Fi jest włączone:
Klasa osiągalności nie jest dostarczana z zestawem SDK, ale jest częścią tej przykładowej aplikacji Apple . Wystarczy go pobrać i skopiować Reachability.h / m do swojego projektu. Musisz także dodać platformę SystemConfiguration do swojego projektu.
źródło
Oto bardzo prosta odpowiedź:
Adres URL powinien wskazywać na bardzo małą stronę internetową. Korzystam z mobilnej witryny Google, ale gdybym miał niezawodny serwer internetowy, przesłałbym mały plik z tylko jednym znakiem dla maksymalnej prędkości.
Jeśli sprawdzanie, czy urządzenie jest w jakiś sposób podłączone do Internetu, jest wszystkim, co chcesz zrobić, zdecydowanie polecam skorzystanie z tego prostego rozwiązania. Jeśli chcesz wiedzieć, w jaki sposób użytkownik jest połączony, skorzystaj z Reachability.
Ostrożnie: spowoduje to krótkie zablokowanie twojego wątku podczas ładowania strony. W moim przypadku nie był to problem, ale powinieneś to rozważyć (podziękowania dla Brada za zwrócenie na to uwagi).
źródło
Oto jak to robię w moich aplikacjach: kod 200 statusu nie gwarantuje niczego, jest dla mnie wystarczająco stabilny. Nie wymaga to tak dużego ładowania, jak zamieszczone tutaj odpowiedzi NSData, ponieważ moje tylko sprawdzają odpowiedź HEAD.
Kod SWIFT
Kod celu C
źródło
Apple dostarcza przykładowy kod, aby sprawdzić dostępność różnych typów sieci. Alternatywnie istnieje przykład w książce kucharskiej dla programistów iPhone'a.
Uwaga: zapoznaj się z komentarzem @ KHG do tej odpowiedzi na temat wykorzystania kodu osiągalności Apple.
źródło
Możesz użyć
Reachability
do ( dostępny tutaj ).źródło
Apple udostępnia przykładową aplikację, która robi dokładnie to:
Osiągalność
źródło
Zaktualizowano tylko klasę osiągalności. Możesz teraz użyć:
źródło
Wersja na Reachability na iOS 5 to Darkseed / Reachability.h . To nie moje! =)
źródło
Jest tutaj ładnie wyglądająca, wykorzystująca ARC i GCD modernizacja osiągalności:
Osiągalność
źródło
Jeśli używasz
AFNetworking
, możesz użyć własnej implementacji dla statusu dostępności do Internetu.Najlepszym sposobem na użycie
AFNetworking
jest podklasęAFHTTPClient
klasy i wykorzystanie tej klasy do wykonywania połączeń sieciowych.Jedną z zalet korzystania z tego podejścia jest to, że można użyć
blocks
do ustawienia pożądanego zachowania, gdy zmienia się status osiągalności. Przypuśćmy, że stworzyłem singletonową podklasę o nazwieAFHTTPClient
(jak napisano w „notatkach dotyczących podklasy” w dokumentach AFNetworking )BKHTTPClient
, zrobiłbym coś takiego:Można również sprawdzić, Wi-Fi lub połączenia WLAN za pomocą specjalnie
AFNetworkReachabilityStatusReachableViaWWAN
iAFNetworkReachabilityStatusReachableViaWiFi
stałe teksty ( więcej tutaj ).źródło
Użyłem kodu w tej dyskusji i wydaje się, że działa dobrze (przeczytaj całość wątek!).
Nie przetestowałem go wyczerpująco z każdym możliwym rodzajem połączenia (np. Ad hoc Wi-Fi).
źródło
Bardzo proste .... Wypróbuj następujące kroki:
Krok 1: Dodaj
SystemConfiguration
ramę do swojego projektu.Krok 2: Zaimportuj następujący kod do swojego
header
pliku.Krok 3: Użyj następującej metody
Typ 1:
Typ 2:
Importuj nagłówek :
#import "Reachability.h"
Krok 4: Jak używać:
źródło
źródło
Lub użyj klasy Reachability .
Istnieją dwa sposoby sprawdzenia dostępności Internetu za pomocą iPhone SDK:
1. Sprawdź, czy strona Google jest otwarta, czy nie.
2. Klasa osiągalności
Aby uzyskać więcej informacji, zobacz Reachability (Apple Developer).
źródło
Użyj http://huytd.github.io/datatify/ . To łatwiejsze niż samodzielne dodawanie bibliotek i pisanie kodu.
źródło
Po pierwsze : dodaj
CFNetwork.framework
w ramachKod :
ViewController.m
źródło
Najpierw pobierz klasę osiągalności i umieść plik reachability.h i reachabilty.m w swoim Xcode .
Najlepszym sposobem jest utworzenie wspólnej klasy Functions (NSObject), aby można było z niej korzystać w dowolnej klasie. Są dwie metody sprawdzania osiągalności połączenia sieciowego:
Teraz możesz sprawdzić połączenie sieciowe w dowolnej klasie, wywołując tę metodę klasy.
źródło
Istnieje również inna metoda sprawdzania połączenia internetowego za pomocą iPhone SDK.
Spróbuj zaimplementować następujący kod dla połączenia sieciowego.
źródło
Uznałem, że jest to prosta i łatwa w użyciu biblioteka SimplePingHelper .
Przykładowy kod: chrishulbert / SimplePingHelper ( GitHub )
źródło
Pobierz plik osiągalności, https://gist.github.com/darkseed/1182373
I dodaj
CFNetwork.framework
i „SystemConfiguration.framework” w ramachWykonaj #import „Reachability.h”
Po pierwsze : dodaj
CFNetwork.framework
w ramachKod :
ViewController.m
źródło
Swift 3 / Swift 4
Musisz najpierw zaimportować
Możesz sprawdzić połączenie internetowe następującą metodą
źródło
Klasa osiągalności jest OK, aby dowiedzieć się, czy połączenie internetowe jest dostępne na urządzeniu, czy nie ...
Ale w przypadku dostępu do zasobu intranetowego :
Pingowanie serwera intranetowego za pomocą klasy osiągalności zawsze zwraca wartość true.
Tak więc szybkim rozwiązaniem w tym scenariuszu byłoby utworzenie metody internetowej wywoływanej
pingme
wraz z innymi metodami sieciowymi w usłudze.pingme
Powinien powrócić coś.Napisałem więc następującą metodę dotyczącą popularnych funkcji
Powyższa metoda była dla mnie bardzo przydatna, dlatego za każdym razem, gdy próbuję wysłać dane do serwera, zawsze sprawdzam dostępność mojego zasobu intranetowego przy użyciu tego żądania URLR o niskim limicie czasu.
źródło
Wykonanie tego samemu jest niezwykle proste. Działa następująca metoda. Pamiętaj tylko, aby nie dopuścić do przekazania protokołu nazwy hosta, takiego jak HTTP, HTTPS itp., Wraz z nazwą.
Jest szybki, prosty i bezbolesny.
źródło
Oprócz osiągalności możesz także skorzystać z biblioteki pomocnika Simple Ping . Działa naprawdę ładnie i jest łatwy do zintegrowania.
źródło
Myślę, że to najlepsza odpowiedź.
„Tak” oznacza podłączony. „Nie” oznacza rozłączony.
źródło
Zaimportuj
Reachable.h
klasę do swojegoViewController
i użyj następującego kodu, aby sprawdzić łączność :źródło
Krok 3: Utwórz poniższą funkcję
Krok 4: Wywołaj funkcję jak poniżej:
źródło