在iOS上处理互联网访问网站身份验证

在iOS上处理互联网访问网站身份验证

问题描述:

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

+0

我也不能确定,如果将可达性处理这种情况,很谨慎的只包括苹果的例子项目”在这里,而使用一些更合适,如安全框架。我甚至不知道我会如何应用这一点,如果没有内置到NSConnection中的内容或沿着这些线路处理它的东西,会非常惊讶。我的问题也比指出的问题更具体。 – TheCodingArt 2013-04-03 23:59:19

+0

你说你想让你的应用程序检测它是否连接。这就是可达性的确切目的。该示例项目仅显示如何在Objective-C中封装C API。 – 2013-04-04 00:59:09

既然你不想使用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。