我有一个在Panther,Tiger和Leopard系统上运行的程序,并使用以下方法进行NSURLConnection身份验证(“encodedUserPass”是带有单词Basic的auth字符串,后跟base64编码的用户:pass)
[theRequest addValue:encodedUserPass forHTTPHeaderField:@"Authorization"];
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
......稍后......在didReceiveAuthenticationChallenge中
if ([challenge previousFailureCount] == 0) {
NSURLCredential *newCredential;
newCredential=[NSURLCredential credentialWithUser:login_name password:password persistence:NSURLCredentialPersistenceNone];
[[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
}
这对Panther和Leopard系统完全正常,但对Tiger完全失败。但奇怪的是,即使在Panther和Leopard上“didReceiveAuthenticationChallenge”也经常被调用(即手动设置标题似乎不起作用)。
在Tiger上,didReceiveAuthenticationChallenge总是被调用,尝试如上所示响应,然后再次调用失败。
两个问题:(i)为什么不手动设置标题? (2)为什么Tiger(10.4)上面显示的方法失败了?
稍后更新 :
经过一番思考后,我意识到我的base64编码方法不得不出现问题,并且有:我没有附加等号以使base64字符串达到4个字符的倍数。我用
解决了这个问题while ([bareString length] % 4) [bareString appendString:@"="];
现在该程序适用于所有三个平台。所以回答问题(i):手动设置标题不起作用,因为我没有使用等号填充。
问题(ii)仍然存在:为什么我不能在Tiger中成功使用didReceiveAuthenticationChallenge?
答案 0 :(得分:0)
我刚刚遇到了您描述的同一问题,并发现 NSURLCredentialPersistenceNone 根本不适用于Tiger,而指定 NSURLCredentialPersistenceForSession 会这样做。
取决于您的应用程序,可能是也可能不是可接受的解决方法。
Apple的文档有点不尽如人意,因为它没有指定“会话”的范围实际上是什么 - 直到应用程序退出,可能?