在iOS上处理互联网访问网站身份验证
我正在为可能在校园中使用的大学编写应用程序。学院的wifi需要凭证才能通过网页访问互联网(如AT & T热点)。我希望我的应用能够检测它是否与互联网“连接”。在过去,我看到其他应用程序重定向到Safari,以便用户可以进行身份验证,然后返回到应用程序。有谁知道如何检测这种事情,而不仅仅是试图从连接(如google.com)获取NSData,然后假设没有数据抓取这是问题?在iOS上处理互联网访问网站身份验证
既然你不想使用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
}
}
如果你不想使用可达性,同时对校园无线网络,你可以发起一个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.
}
落实权威性challange委托方法:
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
NSLog(@"I'm being challenged.");
}
那么你的攻击后想要什么。
如果您尝试使用它来访问主机并且出现身份验证质询,则可能会返回没有连接,因为它无法访问指定的主机。再次,不是100%确定这个陈述是否准确。
当您尝试连接到具有强制门户的网络时,iOS会自动打开Web视图。为确保您的应用已连接并通过身份验证,您应在Info.plist
中设置UIRequiresPersistentWiFi
。
编辑:我上面的答案只适用于需要互联网连接的应用程序。如果你只是检查你是否连接和认证,我相信你只需要使用Reachability
并检查你是ReachableViaWiFi
。 (如果您未通过身份验证,我相信SystemConfiguration
不会说您可以通过Wi-Fi联系。)
如果您正在寻找在您的应用程序中处理强制性网络身份验证,而不是在iOS默认Web视图中,则可以使用CaptiveNetwork API。
我也不能确定,如果将可达性处理这种情况,很谨慎的只包括苹果的例子项目”在这里,而使用一些更合适,如安全框架。我甚至不知道我会如何应用这一点,如果没有内置到NSConnection中的内容或沿着这些线路处理它的东西,会非常惊讶。我的问题也比指出的问题更具体。 – TheCodingArt 2013-04-03 23:59:19
你说你想让你的应用程序检测它是否连接。这就是可达性的确切目的。该示例项目仅显示如何在Objective-C中封装C API。 – 2013-04-04 00:59:09