从UIWebView清除凭据

时间:2011-08-31 12:19:05

标签: iphone uiwebview nsurlconnection nsurlcredential

我在这里做的是,获取具有身份验证的URL。因此,我使用函数

  - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

当面对身份验证时,我会提供UIAlertView输入用户名和密码,如果用户输入正确,则会调用此方法。

  - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;

在这个方法中,我使登录窗口消失并引入详细视图。

当我想要退出功能时,

问题出现了。我想要的是删除用户输入的凭据并再次获取该URL,以进行身份​​验证=目的。所以,我称之为 didReceiveAuthenticationChallenge

但是,它会直接转到 didReceiveResponse 方法,而不会询问任何内容。这里的问题是我无法清除凭据。你可以帮我这么做吗?

提前多多感谢!

3 个答案:

答案 0 :(得分:7)

尝试使用代码清除Cookie的代码

NSHTTPCookie *cookie;
NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (cookie in [storage cookies])
{
    NSString* domainName = [cookie domain];
    NSRange domainRange = [domainName rangeOfString:@"twitter"];
    if(domainRange.length > 0)
    {
        [storage deleteCookie:cookie];
    }
}

答案 1 :(得分:3)

我知道这是一个老问题,但我在这里有答案:

事实证明,cookie不是UIWebView存储数据的唯一方式。还有一个名为NSURLCredentialStorage的持久性事物,因此清除它的唯一方法就是:

NSLog(@"Logging out...");

// Clear credential storage
NSURLCredentialStorage *credentialStorage = [NSURLCredentialStorage sharedCredentialStorage];
NSDictionary *credentialProtectionSpaces = [credentialStorage allCredentials];

for (NSURLProtectionSpace *protectionSpace in credentialProtectionSpaces)
{
    NSDictionary *credentials = [credentialStorage credentialsForProtectionSpace:protectionSpace];
    for (NSString * username in credentials)
    {
        [credentialStorage removeCredential:[credentials objectForKey:username] forProtectionSpace:protectionSpace];
        NSLog(@"clearing: %@", username);
    }
}

NSLog(@"checking...");

credentialStorage = [NSURLCredentialStorage sharedCredentialStorage];
credentialProtectionSpaces = [credentialStorage allCredentials];
for (NSURLProtectionSpace *protectionSpace in credentialProtectionSpaces)
{
    NSDictionary *credentials = [credentialStorage credentialsForProtectionSpace:protectionSpace];
    for (NSString * username in credentials)
    {
        [credentialStorage removeCredential:[credentials objectForKey:username] forProtectionSpace:protectionSpace];
        NSLog(@"checking: %@", username);
    }
}

您会发现用户名第一次显示,但在第二次通过同一循环检查时不显示。它们已从NSURLProtectionSpaces中删除。

-Sean

答案 2 :(得分:3)

很棒的问题,在我的情况下,我无法弄清楚为什么我们无法退出网络视图。

我使用了第一个答案中的一些代码,但是希望删除整个内容中的所有Cookie,而不是仅删除与某个字符串或URL相关联的Cookie。这是我做的:

NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];

for (NSHTTPCookie *cookie in [cookieJar cookies]) {
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
}

这很有效!现在当您注销时,它每次都会返回到原始登录屏幕。