iOS可访问性无法捕获连接到WiFi但未登录的情况

时间:2013-03-09 03:02:44

标签: ios reachability

今天,我公开发布了我的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);
}

有谁知道如何应对这种情况?

4 个答案:

答案 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

  

当应用程序发送到网络堆栈的数据包可以离开本地设备时,可以认为远程主机是可达的。可达性并不能保证主机实际接收数据包。

它可能做两件事:

  • (反复?)将主机名解析为IP地址。
  • 观察路由表,并在该IP的“可达性”发生变化时发送回调。

对于captive portal(a.k.a. Wi-Fi登录页面),http://www.example.com必须在您的网络浏览器中显示为将您重定向到登录页面的网站;这意味着www.example.com 必须解析(无论是否为其实际IP),并且必须在该IP上有一个站点才能将您重定向到登录页面。

可达性主要用于检测飞机模式或与Wi-Fi断开连接等事项。