2011-08-31 42 views
5

Điều tôi đang làm ở đây là tìm nạp URL có xác thực. Do đó, tôi sử dụng hàmXóa thông tin xác thực từ UIWebView

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

Khi đối mặt với xác thực, tôi trình bày UIAlertView để nhập tên người dùng và mật khẩu và nếu người dùng đã nhập đúng tên, phương thức này được gọi.

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

trong phương pháp này, tôi làm cho cửa sổ đăng nhập biến mất và mang lại chế độ xem chi tiết.

Sự cố phát sinh, khi tôi muốn có chức năng đăng xuất đăng xuất. Tất cả những gì tôi muốn là xóa thông tin đăng nhập được người dùng nhập và tìm nạp lại URL đó, cho mục đích xác thực =. Vì vậy, tôi gọi số didReceiveAuthenticationChallenge.

Nhưng điều gì sẽ xảy ra trực tiếp với phương thức didReceiveResponse mà không yêu cầu bất cứ điều gì. Vấn đề ở đây là tôi là không thể xóa thông tin đăng nhập. Bạn có thể giúp tôi trong việc này không?

Cảm ơn rất nhiều trước!

+1

Tôi đã gặp sự cố tương tự này với chế độ xem web. Cảm ơn bạn đã đặt câu hỏi này !! –

Trả lời

7

Thử Mã cho rõ ràng cookie của Yêu cầu

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

Cảm ơn! Hoàn toàn làm việc. Trong trường hợp của tôi, tôi đã không tìm kiếm các URL liên kết với một chuỗi nhất định. Tôi muốn nuke tất cả các cookie vì vậy tôi đã làm dòng thứ hai theo sau là một đơn giản cho vòng lặp: câu trả lời với mã dưới đây. –

+0

Tôi ước tôi có thể tăng gấp đôi phiếu bầu :) Cảm ơn rất nhiều – Hamid

3

Tôi biết đây là một câu hỏi cũ, nhưng tôi có câu trả lời ở đây:

Nó chỉ ra rằng các tập tin cookie không phải là cách duy nhất mà UIWebView lưu trữ dữ liệu. Ngoài ra còn có điều dai dẳng này được gọi là NSURLCredentialStorage và cách duy nhất để xóa nó được như sau:

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 thấy tên người dùng hiển thị thời gian đầu tiên, nhưng không hiển thị khi kiểm tra lần thứ hai thông qua việc cùng vòng lặp. Chúng đã bị xóa khỏi NSURLProtectionSpaces.

-Sean

+0

Làm thế nào điều này sẽ được thực hiện trong Swift? 'for protectionSpace: NSURLProtectionSpace in credentialProtectionSpaces {' cung cấp lỗi "(NSURLProtectionSpace, [String: NSURLCredential]) '(aka' (NSURLProtectionSpace, Dictionary ) ') không chuyển đổi thành' NSURLProtectionSpace" – James

3

Câu hỏi hay và trong trường hợp của tôi, tôi không thể tìm ra lý do tại sao chúng tôi không thể đăng xuất khỏi chế độ xem web.

Tôi đã sử dụng một số mã từ câu trả lời đầu tiên, nhưng muốn xóa tất cả cookie trong toàn bộ nội dung thay vì chỉ các cookie được liên kết với một chuỗi hoặc URL nhất định. Dưới đây là những gì tôi đã làm:

NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 

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

Và điều này đã hiệu quả! Bây giờ khi bạn đăng xuất, nó sẽ trở lại màn hình đăng nhập ban đầu mỗi lần.

+0

Có cách nào không để làm điều này thông qua Javascript?Tôi có một ứng dụng web (Rails/devise/omniauth-facebook) và không thể xóa thông tin đăng nhập khỏi UIWebView. Tôi đã hỏi điều này với nhiều chi tiết hơn tại đây: http://stackoverflow.com/questions/37687130/clear-credentials-from-uiwebview-with-javascript – Horacio

Các vấn đề liên quan