Я искал интернет, чтобы найти лучший способ проверить подключение к Интернету в iOS, которое работает как в сетевой среде IPv4, так и в сети IPv6. Я обнаружил, что есть много возможных ответов, но очень запутано, на что можно подать заявку. Что мне нужно сделать, это следующее:Лучший подход для проверки подключения к Интернету в iOS
// Check for internet connection
if (internetConnectionIsAvailable) {
// make rest calls
}else
// show cached data
}
Я нашел следующие варианты, которые предлагаются в Интернете.
ВАРИАНТ 1: Использование яблочного достижимости Класс
С достижимости можно проверить подключение к Интернету, как после чего короткая и прямая, и не надо ждать какого-либо ответа.
- (BOOL)connected
{
Reachability *reachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [reachability currentReachabilityStatus];
return !(networkStatus == NotReachable);
}
- (void)viewDidLoad {
[super viewDidLoad];
if (![self connected]){
// Not connected
}else{
// Connected
}
}
Но здесь проверка Интернет осуществляются на предварительном полет, что противоречит предложению инженера яблочного, как видно на WWDC video. Также, если вы проверите ReadMe.md, было упомянуто, что Reachability полностью поддерживает IPv6. Но если метод достижимостьForInternetConnection проверен в Reachability.m, они использовали sockaddr_in, sockaddr_in6 не использовался, который рекомендуется для сети IPv6. Поэтому я не знаю, будет ли это работать в сети IPv6.
ВАРИАНТ 2: Использование Alamofire для подключения
Просто попробуйте подключиться, как в одном из stackoverflow answer. Код также показано ниже: -
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)") } } }
Но это не отнимает много времени, чтобы попытаться подключиться к некоторому хосту, ждать ответа, а затем знать, если онлайн/оффлайн.
ВАРИАНТ 3: Используйте версию Тони Миллиона Reachability. Но автор предупреждает о том, что приложение отклоняется при использовании этого. Я могу использовать это как код, показанный ниже: -
// 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];
}
Но в этом варианте, на мой вопрос, это правильный подход, чтобы проверить Интернет путем подключения http://google.com. Гарантирует ли это 100% результаты? Что делать, если Google не работает? Если приложение используется в стране, где google.com не разрешен, какой результат?
Итак, у меня была большая дилемма, которую можно выбрать, если эти варианты верны или есть лучший способ проверки интернета, который гарантирует 100% результаты и работает как в сети IPv4, так и в сети IPv6. Может ли кто-нибудь предложить мне, какой вариант лучше, или я должен пойти на другой подход, что лучше для этого.
Ваш ответ будет очень признателен.
Я бы пошел с родной Досягаемостью. Автоматически отключать опцию 3 из-за возможного отклонения. Вариант 2 может быть в порядке, если вы уже используете Alamofire. – tktsubota
На самом деле, я бы просто сделал правильные вызовы REST, и если вы получите сообщение об ошибке для Интернета, то попробуйте метод возврата. Тестирование его случайным доменом не приведет вас никуда. – tktsubota
Да, это рекомендуемый метод. См. «Подключение без предполета» в https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html. –