0

我正在为一所可能会在校园内使用的大学编写应用程序。学院的 wifi 需要凭据才能通过网页(例如 AT&T 热点)访问互联网。我希望我的应用程序检测它是否“连接”到互联网。过去,我看到其他应用程序重定向到 Safari,以便用户可以进行身份​​验证,然后返回应用程序。有谁知道如何检测这种事情,而无需简单地尝试从连接(例如 google.com)中获取 NSData,然后假设是否没有获取数据,这就是问题所在?

4

3 回答 3

1

当您尝试连接到具有强制门户的网络时,iOS 会自动显示 Web 视图。为确保您在应用程序中已连接并经过身份验证,您应该UIRequiresPersistentWiFiInfo.plist.

编辑:我上面的答案仅适用于需要互联网连接的应用程序。如果您只是检查您是否已连接并经过身份验证,我相信您只需要使用Reachability并检查您是否是ReachableViaWiFi. (如果您未通过身份验证,我相信SystemConfiguration不会说您可以通过 Wi-Fi 访问。)

如果您希望在您的应用程序中而不是在 iOS 默认 Web 视图中处理强制网络身份验证,您可以使用CaptiveNetwork API。

于 2013-04-04T02:14:18.323 回答
0

如果您不想使用可达性,您可以在校园 wifi 上启动一个随机网站的 NSURLConnection 并检查身份验证挑战。

设置NSURLConnection

// Create the request.
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/"]
                        cachePolicy:NSURLRequestUseProtocolCachePolicy
                    timeoutInterval:60.0];
// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
    // Create the NSMutableData to hold the received data.
    // receivedData is an instance variable declared elsewhere.
    receivedData = [[NSMutableData data] retain];
} else {
    // Inform the user that the connection failed.
}

实现 auth challenge 委托方法:

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
     NSLog(@"I'm being challenged.");
}

然后在挑战之后做你想做的事。

如果您不去查看可达性,如果您尝试使用它来访问主机并且它遇到了身份验证挑战,它可能会返回没有连接,因为它无法到达指定的主机。同样,不能 100% 确定此声明是否准确。

于 2013-04-04T01:57:50.420 回答
0

由于您不想使用 NSData 方式(我也不喜欢抓取 NSData 以及使用可达性)这是我想出的更轻量级的方法,因为它只检查 HEAD 响应:):

- (BOOL)connectedToInternet
{
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:
    [NSURL URLWithString:@"http://www.google.com/"]];

    [request setHTTPMethod:@"HEAD"];

    NSHTTPURLResponse *response;

    [NSURLConnection sendSynchronousRequest:request
    returningResponse:&response error: NULL];

    return ([response statusCode] == 200) ? YES : NO;
}

- (void)yourMethod
{                  
    if([self connectedToInternet] == NO)                  
    {   
        // Not connected to the internet
    }
    else
    {
        // Connected to the internet
    }
}
于 2013-04-04T01:32:44.410 回答