Szukałem przez Internet, aby znaleźć najlepszy sposób sprawdzenia połączenia internetowego w iOS, które działa zarówno w środowisku sieciowym IPv4, jak i IPv6. Zauważyłem, że istnieje wiele możliwych odpowiedzi, ale bardzo zdezorientowanych, na które można się zwrócić. Co muszę zrobić, to:Najlepsze podejście do sprawdzania połączenia z Internetem w iOS
// Check for internet connection
if (internetConnectionIsAvailable) {
// make rest calls
}else
// show cached data
}
Znalazłem następujące opcje, które są sugerowane w Internecie.
OPCJA 1: Zastosowanie jabłko osiągalności klasa
Z osiągalności mogę sprawdzić łączność z Internetem w następujący sposób, który jest krótki i bezpośredni, i nie trzeba czekać na jakiekolwiek odpowiedzi.
- (BOOL)connected
{
Reachability *reachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [reachability currentReachabilityStatus];
return !(networkStatus == NotReachable);
}
- (void)viewDidLoad {
[super viewDidLoad];
if (![self connected]){
// Not connected
}else{
// Connected
}
}
Ale tutaj sprawdzanie www odbywa się przed lotem, który jest przeciwko sugestii przez Apple inżynier jak widać na WWDC video. Również jeśli zaznaczysz ReadMe.md, wspomniano, że zasięg w pełni obsługuje IPv6. Ale jeśli metoda osiągalna jest dla Reachability.m. jest zaznaczona w Reachability.m, to użyli sockaddr_in, sockaddr_in6 nie został użyty, co jest zalecane dla sieci IPv6. Nie wiem więc, czy zadziała w sieci IPv6.
Opcja 2: Wykorzystanie Alamofire połączyć
Wystarczy spróbować połączyć się jak w jednym z stackoverflow answer. Kod także przedstawiono poniżej: -
Alamofire.request(.GET,"http://superrandomdomainnamethatisnotused.com/superrandompath").responseString { (request, response, stringData, error) in if let networkError = error { if (networkError.code == -1009) { println("No Internet \(error)") } } }
Ale nie jest to czasochłonne, aby spróbować połączyć się z jakiegoś gospodarza, czekać na odpowiedź i wtedy wiem, czy online/offline.
OPCJA 3: Użyj wersji Tony Milliona Reachability. Autor ostrzega jednak przed odrzuceniem aplikacji podczas korzystania z niej. mogę użyć tego jako kod pokazany poniżej: -
// Checks if we have an internet connection or not
- (void)testInternetConnection
{
internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];
// Internet is reachable
internetReachableFoo.reachableBlock = ^(Reachability*reach)
{
// Update the UI on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"There in internet connection");
});
};
// Internet is not reachable
internetReachableFoo.unreachableBlock = ^(Reachability*reach)
{
// Update the UI on the main thread
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Someone broke the internet :(");
});
};
[internetReachableFoo startNotifier];
}
Ale w tej opcji, moje pytanie brzmi, czy to jest właściwe podejście do testowania Internetu poprzez podłączenie http://google.com. Czy to gwarantuje 100% wyników? Co jeśli Google nie działa? Jeśli aplikacja jest używana w kraju, w którym domena google.com jest niedozwolona, jaki jest wynik?
Tak więc byłem w wielkim dylemacie, którą opcję wybrać, czy te opcje są właściwe, czy istnieje lepszy sposób sprawdzenia internetu, który gwarantuje 100% wyników i działa zarówno w sieci IPv4, jak i IPv6. Czy ktoś może zasugerować mi, która opcja jest lepsza, czy powinienem wybrać inne podejście, jaki jest lepszy sposób na osiągnięcie tego.
Twoja odpowiedź będzie doceniona.
Chciałbym iść z natywnym zasięgu. Automatycznie wyłącz opcję 3 z powodu możliwego odrzucenia. Opcja 2 może być w porządku, jeśli już używasz Alamofire. – tktsubota
Właściwie to po prostu wykonam odpowiednie wywołania REST, a jeśli pojawi się błąd dla żadnego Internetu, _then_ wywołaj metodę zastępczą. Testowanie go za pomocą losowej domeny nie doprowadzi cię nigdzie. – tktsubota
Tak, to jest zalecana metoda. Zobacz "Łączenie bez inspekcji wstępnej" w https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/Understanding andPreparingfortheIPv6Transition.html. –