我有一个与运行Rails的服务器交互的iOS应用程序,并且已经稳定可靠3年了。该服务器需要基本和SSL认证,这一直非常适用于iOS 7。
但是,我现在看到运行iOS 8的设备的身份验证问题。运行的设备/模拟器< iOS 8继续正常运行。
在应用初始化时,有一系列数据请求要与需要通过基本身份验证的服务器同步。
这会导致调用以下委托方法,
willSendRequestForAuthenticationChallenge
...问题出现是因为这些问题无休止地受到挑战 - 当[挑战previousFailureCount]>时,代码故意在第二次尝试时失败。 0(代码路径遵循标准做法,如果previousFutureCount> 0则调用cancelAuthenticationChallenge) - 见下文。
我已经记录了挑战ID,并且这些挑战在每个挑战中都是不同的,即使在previousFailureCount> 0
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPBasic])
{
if ([challenge previousFailureCount] == 0)
{
NSURLCredential *newCredential;
newCredential = [NSURLCredential credentialWithUser:MY_USERNAME
password:MY_PASSWORD
persistence:NSURLCredentialPersistenceForSession]; // Retain for rest of session
[[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
}
else
{
[[challenge sender] cancelAuthenticationChallenge:challenge];
// ...error will be handled by connection didFailWithError
}
}
}
如果我敲除了检查previousFailureCount的调用,则会有无休止的调用方法调用。
然而,一旦这一系列失败失败,后续和后来的“个人”NSUrlRequests都会被成功验证。
同样,这个问题特定于iOS 8.任何想法为什么“快速”连续的身份验证请求会在iOS 8中失败,但在iOS 7中工作?
感谢。
答案 0 :(得分:1)
如果您没有处理身份验证方法(NSURLAuthenticationMethodHTTPBasic),必须调用其中一种方法:
useCredential:forAuthenticationChallenge:
continueWithoutCredentialForAuthenticationChallenge:
cancelAuthenticationChallenge:
performDefaultHandlingForAuthenticationChallenge:
rejectProtectionSpaceAndContinueWithChallenge:
如果您想忽略某种身份验证方法,您可能希望调用performDefaultHandlingForAuthenticationChallenge:
。
答案 1 :(得分:0)
我有同样的问题,我删除了if([challenge previousFailureCount] == 0),并且它有效。
但我不知道为什么它在IOS 8中失败了。
答案 2 :(得分:0)
答案 3 :(得分:0)
仅供参考,我在我的应用中发现了类似的行为。我只是看到那些无法立即运行的请求,而是必须等待其他网络请求,但基本身份验证失败。
使用操作队列确保我没有超过4个并发请求解决了这个问题(显然,将NSURLConnection
包装在异步NSOperation
子类中)。同样使用NSURLSession
也解决了问题。
这看起来像是一个带有NSURLConnection
基本身份验证的iOS 8错误。