【发布时间】:2016-08-02 16:39:29
【问题描述】:
我一直在互联网上搜索,以找到在 iOS 中检查互联网连接的最佳方法,该方法适用于 IPv4 和 IPv6 网络环境。我发现有很多可能的答案,但对应用哪一个非常困惑。我需要做的是:
// Check for internet connection
if (internetConnectionIsAvailable) {
// make rest calls
}else
// show cached data
}
我在互联网上找到了以下建议的选项。
选项 1: 使用苹果可达性类
借助 Reachability,我可以按以下方式检查 Internet 连接,这很短且直接,无需等待任何响应。
- (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。但是如果在 Reachability.m 中检查了方法 reachabilityForInternetConnection,他们使用了 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: 使用 Tony Million 的 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.com 的国家/地区使用,结果如何?
所以我一直在选择哪个选项,如果这些选项是正确的方法,或者是否有更好的方法来检查互联网,它可以保证 100% 的结果并在 IPv4 和 IPv6 网络中工作,我一直处于两难的境地。谁能建议我哪个选项更好,或者我应该采用其他方法,实现此目的的更好方法是什么。
您的回复将不胜感激。
【问题讨论】:
-
我会选择原生可达性。由于可能被拒绝,自动关闭选项 3。如果您已经在使用 Alamofire,选项 2 可能没问题。
-
实际上,我会自己进行适当的 REST 调用,如果您确实收到没有 Internet 的错误,然后调用回退方法。使用随机域对其进行测试不会让您有任何收获。
-
是的,这是推荐的方法。请参阅developer.apple.com/library/ios/documentation/… 中的“无需预检即可连接”。
-
感谢您的回复。但是尝试连接 myDomain 并等待响应最终发现互联网不可用会不会很耗时。
-
如果没有 Internet 连接,那么“连接”应该很快就会失败。你试过了吗?
标签: ios swift xcode reachability internet-connection