今天,我公开发布了我的Beta版应用。我在酒店,还没有获得WiFi的访问代码。在测试可达性时,我注意到它没有失败,因为它应该有。它是连接到WiFi,但实际上没有任何内容可以访问,因为我没有登录。 reachabilityWithHostname 应该覆盖这个用例。这是我的代码:
在AppDelegate.h中:
@interface AppDelegate : UIResponder <UIApplicationDelegate> {
Reachability* hostReach;
Reachability* internetReach;
Reachability* wifiReach;
}
在AppDelegate.m中:
internetReach = [Reachability reachabilityForInternetConnection];
[internetReach startNotifier];
wifiReach = [Reachability reachabilityForLocalWiFi];
[wifiReach startNotifier];
hostReach = [Reachability reachabilityWithHostname: @"http://www.google.com"];
[hostReach connectionRequired];
[hostReach startNotifier];
在需要连接的模块中:
- (BOOL) isInternetReachable
{
Reachability *currentReach = [Reachability reachabilityForInternetConnection];
NetworkStatus netStatus = [currentReach currentReachabilityStatus];
return (netStatus == ReachableViaWiFi || netStatus == ReachableViaWWAN);
}
有谁知道如何应对这种情况?
答案 0 :(得分:3)
...
[Reachability reachabilityWithHostname: @"http://www.google.com"]
...
您应该按Apple's documentation使用主机名(不包含http://
)。
答案 1 :(得分:3)
您使用Reachability错误。 Apple的文档很糟糕,所以忽略它。
诀窍是尝试建立网络连接,而不是首先咨询可达性。 NSURLConnection将启动无线电并根据需要进行连接。当然,一定要处理错误。
当网络脱机后重新联机时,可达性仍可用于发出信号。如果您有事先无法发送/接收的信息,则可以在此时重新连接。
此外,您不应该在主线程上调用Reachability。在质量较差的网络上,特别是在丢包率高或DNS损坏的情况下,可达性会使您的应用程序挂起超过20秒,系统会杀死您。
答案 2 :(得分:3)
我使用可达性来证明网络层。什么时候应该没问题,我试着从我的服务器加载一个字节的文件来确定。表现还可以。
BOOL isOnline = [[[RKClient sharedClient] reachabilityObserver] isReachabilityDetermined] != YES || [[RKClient sharedClient] isNetworkReachable];
if(isOnline){
NSData *data = [NSData dataWithContentsOfURL:[[URLManager sharedInstance]availabilityCheckURL]];
NSString *strTemp = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
isOnline = [strTemp isEqualToString:@"1"];
}
答案 3 :(得分:0)
可达性示例使用SystemConfiguration's Reachability API:
当应用程序发送到网络堆栈的数据包可以离开本地设备时,可以认为远程主机是可达的。可达性并不能保证主机实际接收数据包。
它可能做两件事:
对于captive portal(a.k.a. Wi-Fi登录页面),http://www.example.com
必须在您的网络浏览器中显示为将您重定向到登录页面的网站;这意味着www.example.com
必须解析(无论是否为其实际IP),并且必须在该IP上有一个站点才能将您重定向到登录页面。
可达性主要用于检测飞机模式或与Wi-Fi断开连接等事项。