2013-05-15 35 views
12

Bối cảnh
Tôi đang phát triển một ứng dụng iPad đơn giản cho phép người dùng duyệt cùng một trang web với các thông tin đăng nhập khác nhau cùng một lúc. Do đó tôi có hai số UIWebView và họ nên có bộ nhớ cookie khác nhau để người dùng có thể đăng nhập một tài khoản trên UIWebView và một tài khoản khác trên số UIWebView thứ hai.Có lưu trữ cookie riêng cho hai UIWebView không?

Tôi đã thử gì?
Tôi nghĩ giải pháp là triển khai kho lưu trữ cookie khác nhau trong hai số UIWebView tôi có.

Sasmito Adibowo đã viết một bài báo Implementing Your Own Cookie Storage cung cấp chi tiết về cách sử dụng bộ nhớ cookie tùy chỉnh cho WebView trên máy Mac.
Nó được thực hiện bằng cách sửa đổi NSURLRequest rằng WebView sẽ gửi, thêm tiêu đề cookie vào nó và cũng chặn phản hồi từ WebView và trích xuất cookie từ tiêu đề phản hồi và lưu vào bộ nhớ cookie của chính chúng ta.
Về mặt kỹ thuật, nó được thực hiện bằng cách thực hiện các phương pháp này hai đại biểu:

- (void)webView:(WebView *)sender resource:(id)identifier didReceiveResponse:(NSURLResponse *)response fromDataSource:(WebDataSource *)dataSource 
- (NSURLRequest *)webView:(WebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(WebDataSource *)dataSource 

Mặc dù nó được cung cấp tài liệu, UIWebView đã hỗ trợ một trong những phương pháp trên với một tên phương pháp hơi khác nhau:

- (NSURLRequest *)uiWebView:(UIWebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(id)dataSource 

Tuy nhiên, UIWebView không có phương thức ủy nhiệm tương đương cho webView:resource:didReceiveResponse:fromDataSource: và do đó tôi không thể trích xuất cookie từ tiêu đề phản hồi.

Các Câu hỏi
Có cách nào để có UIWebView sử dụng một lưu trữ cookie tùy chỉnh, vì vậy hai UIWebView có thể lưu trữ cookie của riêng họ?

Cảm ơn!

Trả lời

1

Các bạn đã thử nhận cookie được kết hợp với một webview cụ thể (và nắm giữ chúng) trong webViewDidStartLoad:

NSHTTPCookie *cookie; 
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
for (cookie in [cookieJar cookies]) { 
    [self.cookies addObject:cookie]; 
} 

Và lưu trữ các tập tin cookie ngay sau (lấy giá trị và các phím từ self.cookies):

NSMutableDictionary *cookieDict = [NSMutableDictionary dictionary]; 
[cookieDict setObject:@"value1" forKey:NSHTTPCookieName]; 
[cookieDict setObject:@"value2" forKey:NSHTTPCookieValue]; 
[cookieDict setObject:@"value3" forKey:NSHTTPCookieDomain]; 
...etc.. 

NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:cookieDict]; 
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie]; 

bạn cũng sẽ cần phải thấy điều này trong viewDidLoad của bạn:

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; 
+0

trong 'webViewDidStartLoad', yêu cầu đã được gửi, do đó, bản hack của bạn không hoạt động. Di chuyển nó sang 'shouldStartLoadWithRequest' có thể hoạt động. Tuy nhiên, hack của bạn sẽ không cho phép cả UIWebView tải yêu cầu cùng một lúc. – howanghk

+0

@bdev câu trả lời Tôi muốn trong nhanh 3,0 có thể giúp tôi. –

0

Nếu bạn sẵn sàng đào sâu hơn một chút, số ASIHttpRequest được sử dụng để biết cách sắp xếp lại ngày này. Đọc switching cookie storage for requests. Họ cũng có một trình bao bọc thú vị cho các yêu cầu UIWebView, AKA ASIWebPageRequest.

Đáng buồn thay, dự án đã bị ngừng hoạt động, nhưng nó sẽ cung cấp cho bạn một nền tảng hoạt động để đạt được mục tiêu của bạn.

Nếu không, như bdev đã trình bày, tôi sẽ xếp hàng yêu cầu và thay thế bộ nhớ cookie mỗi lần, trước khi kích hoạt yêu cầu. Bạn có thể sử dụng bộ điều phối độc đáo ở đây.

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