我正在为一所可能会在校园内使用的大学编写应用程序。学院的 wifi 需要凭据才能通过网页(例如 AT&T 热点)访问互联网。我希望我的应用程序检测它是否“连接”到互联网。过去,我看到其他应用程序重定向到 Safari,以便用户可以进行身份验证,然后返回应用程序。有谁知道如何检测这种事情,而无需简单地尝试从连接(例如 google.com)中获取 NSData,然后假设是否没有获取数据,这就是问题所在?
3 回答
当您尝试连接到具有强制门户的网络时,iOS 会自动显示 Web 视图。为确保您在应用程序中已连接并经过身份验证,您应该UIRequiresPersistentWiFi
在Info.plist
.
编辑:我上面的答案仅适用于需要互联网连接的应用程序。如果您只是检查您是否已连接并经过身份验证,我相信您只需要使用Reachability
并检查您是否是ReachableViaWiFi
. (如果您未通过身份验证,我相信SystemConfiguration
不会说您可以通过 Wi-Fi 访问。)
如果您希望在您的应用程序中而不是在 iOS 默认 Web 视图中处理强制网络身份验证,您可以使用CaptiveNetwork API。
如果您不想使用可达性,您可以在校园 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% 确定此声明是否准确。
由于您不想使用 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
}
}