Ich habe über das Internet gesucht, um die beste Möglichkeit zur Überprüfung der Internetverbindung in iOS zu finden, die sowohl in IPv4 als auch in IPv6-Netzwerkumgebung funktioniert. Ich fand, dass es viele mögliche Antworten gibt, aber sehr verwirrt, auf welche man sich bezieht. Was ich tun muss, ist folgendes:Beste Methode zum Überprüfen der Internetverbindung in iOS
// Check for internet connection
if (internetConnectionIsAvailable) {
// make rest calls
}else
// show cached data
}
Ich fand die folgenden Optionen, die im Internet vorgeschlagen werden.
OPTION 1: Verwenden Apfel Erreichbarkeits Klasse
Mit Erreichbarkeits kann ich Internet-Konnektivität überprüfen, wie folgend, die kurz und direkt ist, und nicht für jede Antwort warten müssen.
- (BOOL)connected
{
Reachability *reachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [reachability currentReachabilityStatus];
return !(networkStatus == NotReachable);
}
- (void)viewDidLoad {
[super viewDidLoad];
if (![self connected]){
// Not connected
}else{
// Connected
}
}
Aber hier Internet Prüfung wird bei Pre-Flight getan, die sich gegen Vorschlag wie auf WWDC video gesehen von Apfel Ingenieur ist. Auch wenn Sie ReadMe.md überprüfen, wurde erwähnt, dass Erreichbarkeit IPv6 vollständig unterstützt. Aber wenn Methode ErreichbarkeitFürInternetConnection in Erreichbarkeit.m überprüft wird, haben sie sockaddr_in verwendet, sockaddr_in6 wurde nicht verwendet, was für IPv6-Netzwerk empfohlen wird. Also ich weiß nicht, ob es im IPv6-Netzwerk funktioniert.
OPTION 2: Verwenden Sie Alamofire
nur versuchen, eine Verbindung nach einem der stackoverflow answer zu verbinden. Der Code auch unten dargestellt: -
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)") } } }
Aber ist es nicht Zeit, um zu versuchen raubend zu einem gewissen Host zu verbinden, für die Antwort warten und dann, wenn online/offline wissen.
OPTION 3: Verwenden Sie die Version Reachability von Tony Million. Der Autor hat jedoch davor gewarnt, dass die App abgelehnt wird.
// 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];
}
Aber in dieser Option ist meine Frage, ist dies der richtige Ansatz Internet zu testen, indem http://google.com verbindet -: Ich kann dies als Code unten verwenden. Garantiert dies 100% ige Ergebnisse? Was ist, wenn Google nicht erreichbar ist? Wenn die App in einem Land verwendet wird, in dem google.com nicht erlaubt ist, was ist das Ergebnis?
So war ich in einem großen Dilemma, welche Option zu wählen, wenn diese Optionen der richtige Weg sind oder gibt es eine bessere Möglichkeit, Internet zu überprüfen, die 100% Ergebnisse garantiert und funktioniert sowohl in IPv4 und IPv6-Netzwerk. Kann mir jemand vorschlagen, welche Option besser ist oder sollte ich einen anderen Ansatz wählen, was ist der bessere Weg, dies zu erreichen?
Ihre Antwort wird sehr geschätzt.
würde ich mit nativer Erreichbarkeit gehen. Deaktivieren Sie Option 3 automatisch wegen möglicher Zurückweisung. Option 2 könnte in Ordnung sein, wenn Sie Alamofire bereits verwenden. – tktsubota
Eigentlich würde ich nur die richtigen REST-Aufrufe selbst machen, und wenn Sie einen Fehler für kein Internet erhalten, dann rufen Sie die Fallback-Methode. Es mit einer zufälligen Domain zu testen bringt dich nirgendwohin. – tktsubota
Ja, das ist die empfohlene Methode. Weitere Informationen finden Sie unter "Ohne Preflight verbinden" unter https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingundPreparingfürIPv6Transition/UnderstandingandPreparingfürdieIPv6Transition.html. –