2011-08-31 19 views
5

ここで私がやっていることは、認証を持つURLを取得していることです。したがって、それは認証に直面したとき、私は関数にUIWebViewから資格情報をクリアします

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

を使用し、私は、ユーザー名とパスワードを入力するUIAlertViewを提示し、ユーザーはそれを正しく入力した場合、このメソッドが呼び出されます。

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

この方法では、ログインウィンドウが表示されなくなり、詳細ビューが表示されます。

問題が発生しました。ログアウト機能が必要でした。私が望むのは、ユーザーが入力した認証情報を削除し、そのURLを認証=目的のためにもう一度フェッチすることだけです。だから、didReceiveAuthenticationChallengeと呼んでいます。

しかし、何もせずに直接didReceiveResponseメソッドに移動します。ここでの問題は、が資格情報をクリアできないことです。あなたはこれをするのを手伝ってくれますか?

ありがとうございます!

+1

ウェブビューで同じ問題が発生しました。この質問をお寄せいただきありがとうございます! –

答えて

7

私はこれが古い質問ですけど、私はここに答えを持って要求

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]; 
    } 
} 
+0

ありがとう!完全に働いた。私の場合、特定の文字列に関連付けられたURLは探していませんでした。私はすべてのクッキーを核にしたいので、2番目の行に続いて単純なforループを実行しました:以下のコードで答えてください。 –

+0

私は二重投票をしたいと思っています:)ありがとうございました – Hamid

3

のクリアクッキーのためのコードを試してみてください:

それは、クッキーはの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); 
    } 
} 

You''llは、ユーザ名が最初の時間を示すが、同介して第2の時間を確認する際に表示されていないことを見つけますループ。それらはNSURLProtectionSpacesから削除されています。

-Sean

+0

これはSwiftでどのように行われるのですか? (NSURLProtectionSpace、Dictionary ))は、 'NSURLProtectionSpace'に変換できません。 – James

3

グレート質問、および私の場合、私たちはウェブビューからログアウトしなかった理由を見つけ出すことができませんでした。

最初の回答からいくつかのコードを使用しましたが、特定の文字列またはURLに関連付けられているものだけでなく、すべてのCookieをすべて削除したかったのです。ここで私は何をしたのですか:

NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 

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

これはうまくいきました!ログアウトすると、毎回元のログイン画面に戻ります。

+0

方法がありますか?(NSURLProtectionSpace、[String:NSURLCredential] Javascriptでこれを行うには?私はWebアプリケーション(Rails/devise/omniauth-facebook)を持っており、UIWebViewからクレデンシャルを削除することはできません。私はここで詳細を尋ねました:http://stackoverflow.com/questions/37687130/clear-credentials-from-uiwebview-with-javascript – Horacio

関連する問題