我正在尝试在 UIWebView 中加载安全网站,我的基本方法是创建一个 NSURL,然后创建一个 NSURLRequest,然后创建一个 NSURLConnection,然后在 UIWebView 中加载 NSURLRequest。当网站加载时,我会收到
- (void)connectionNSURLConnection *)connection didReceiveAuthenticationChallengeNSURLAuthenticationChallenge *)challenge
我用 回复挑战发送者
- (void)useCredentialNSURLCredential *)credential forAuthenticationChallengeNSURLAuthenticationChallenge *)challenge
但在那之后我什么也没有得到......它只是挂起。我设置了断点,所以我知道
- (void)connectionNSURLConnection *)connection didReceiveAuthenticationChallengeNSURLAuthenticationChallenge *)challenge
正在被调用。如果我等到我确定 NSURLConnection 不会完成,然后重新加载 View ,不会发送身份验证质询,但会加载 View 。我对服务器没有任何控制权。我愿意使用 AFNetworking,但仅限于必要时。
源代码的完整列表如下:
- (void)connectionNSURLConnection *)connection didReceiveAuthenticationChallenge:
(NSURLAuthenticationChallenge *)challenge
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
if ([challenge previousFailureCount] == 0)
{
NSString *username = @"username";
NSString *password = @"passsword";
NSURLCredential * cred = [NSURLCredential credentialWithUser:username
password:password
persistence:NSURLCredentialPersistenceForSession];
[[challenge sender] useCredential:cred forAuthenticationChallenge:challenge];
}
else
{
}
}
-(void)updateCard
{
NSURL * url = [NSURL URLWithString"https://ssl.letu.edu/applications/chapelattendance/attendance.html"];
NSURLRequest * request = [NSURLRequest requestWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:50.0];
self.webView =[[UIWebView alloc] initWithFrame:self.bounds];
self.webView.delegate = self;
[self.webView loadRequest:request];
self.connection = [[ NSURLConnection alloc]initWithRequest:request delegate:self];
[self.connection start];
}
我哪里做错了?
Best Answer-推荐答案 strong>
您需要先检索服务器请求的“身份验证方法”:
[[challenge protectionSpace] authenticationMethod]
这些是上面的表达式返回的身份验证方法(它们是字符串常量):
NSURLAuthenticationMethodDefault
NSURLAuthenticationMethodHTTPBasic
NSURLAuthenticationMethodHTTPDigest
NSURLAuthenticationMethodHTMLForm
NSURLAuthenticationMethodNegotiate
NSURLAuthenticationMethodNTLM
NSURLAuthenticationMethodClientCertificate
NSURLAuthenticationMethodServerTrust
然后,您有以下选择:
如果要为给定的身份验证方法提供凭据,请调用
useCredential:forAuthenticationChallenge:
如果您不想自己处理该身份验证方法并希望系统尝试
要进行身份验证,您可以调用 performDefaultHandlingForAuthenticationChallenge:
然后可能会失败,具体取决于系统是否能够处理该类型
身份验证以及它是否可以在众所周知的存储中找到凭据。
如果您无法处理该身份验证方法 - 说身份验证方法
NSURLAuthenticationMethodNTLM 例如——你可以跳过这个保护
空间并尝试另一个保护空间,如果另一个
存在于此身份验证质询中。那么你可能会得到一个
验证方法 NSURLAuthenticationMethodHTTPBasic 你
有能力处理。
为了拒绝当前保护空间你发送的方法
rejectProtectionSpaceAndContinueWithChallenge: 到
身份验证质询发送者。然后,NSURLConnection 将发送
再次 willSendRequestForAuthenticationChallenge: 到您的
如果还有其他保护空间,请委托(delegate)另一个保护空间。
您可以尝试在不提供凭据的情况下继续。
很可能,身份验证将失败。你可以通过试试
发送消息 continueWithoutCredentialForAuthenticationChallenge:
到身份验证质询发送者。
最后,您可以通过取消
身份验证质询:发送 cancelAuthenticationChallenge: 到
身份验证质询发送者。
注意:NSURLAuthenticationMethodHTTPBasic 和 NSURLAuthenticationMethodHTTPDigest 身份验证方法可以使用由 +credentialWithUser:password:persistence 创建的相同 NSURLCredential 对象处理:
关于ios - NSURLConnection 仅在第二次尝试时进行身份验证,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/17120392/
|