2011-01-23 17 views
34

Tôi đang xây dựng một ứng dụng iPhone chỉ là một UIWebView của trang web trên thiết bị di động hiện có có thông tin đăng nhập dựa trên biểu mẫu. Khi tôi đăng nhập vào trang web di động trên iPhone Safari, tôi được nhắc lưu tên người dùng/mật khẩu của mình và sau đó nó được tự động điền khi tôi quay lại trang web sau.Có thể cho một UIWebView lưu và tự động điền các giá trị biểu mẫu đã nhập trước đó (ví dụ: tên người dùng và mật khẩu) không?

Tôi muốn bật chức năng tương tự trong UIWebView, nhưng đối với cuộc sống của tôi, tôi không thể tìm ra cách thực hiện. Bất kỳ ý tưởng?


Giải pháp

Tiếp theo mô hình cơ bản của Michael (xem câu trả lời được chấp nhận), tôi đã có thể có được điều này được thực hiện. Dưới đây là những gì tôi đã làm:

LẬP DỮ LIỆU

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; { 

    //save form data 
    if(navigationType == UIWebViewNavigationTypeFormSubmitted) { 

     //grab the data from the page 
     NSString *username = [self.webView stringByEvaluatingJavaScriptFromString: @"document.myForm.username.value"]; 
     NSString *password = [self.webView stringByEvaluatingJavaScriptFromString: @"document.myForm.password.value"]; 

     //store values locally 
     [[NSUserDefaults standardUserDefaults] setObject:username forKey:@"username"]; 
     [SFHFKeychainUtils storeUsername:username andPassword:password forServiceName:@"MyService" updateExisting:YES error:nil]; 

    }  

} 

NHẬN DỮ LIỆU

- (void)webViewDidFinishLoad:(UIWebView *)webView{ 

    //verify view is on the login page of the site (simplified) 
    NSURL *requestURL = [self.webView.request URL]; 
    if ([requestURL.host isEqualToString:@"www.mydomain.com"]) { 

     //check for stored login credentials 
     NSString *username = [[NSUserDefaults standardUserDefaults] objectForKey:@"username"]; 

     if (username.length != 0) { 

      //create js strings 
      NSString *loadUsernameJS = [NSString stringWithFormat:@"document.myForm.username.value ='%@'", username]; 
      NSString *password = [SFHFKeychainUtils getPasswordForUsername: username andServiceName:@"MyService" error:nil]; 
      if (password.length == 0) password = @""; 
      NSString *loadPasswordJS = [NSString stringWithFormat:@"document.myForm.password.value ='%@'", password]; 

      //autofill the form 
      [self.webView stringByEvaluatingJavaScriptFromString: loadUsernameJS]; 
      [self.webView stringByEvaluatingJavaScriptFromString: loadPasswordJS]; 

     } 
    } 
} 

Lưu ý rằng tôi đang sử dụng tuyệt vời SFHFKeychainUtils gói Buzz Andersen để lưu trữ dữ liệu nhạy cảm với iOs Keychain.

Để nhận SFHFKeychainUtils làm việc, bạn cần phải làm một vài điều:

  1. Thêm SFHFKeychainUtils.hSFHFKeychainUtils.m để dự án của bạn
  2. Thêm Security.framework để dự án của bạn
  3. #import <Security/Security.h>#import "SFHFKeychainUtils.h"
+0

Mã này chỉ hoạt động cho trang web cụ thể mà bạn đang cố gắng tải không? Tôi cũng đã cố gắng tìm ra điều này cho ứng dụng của mình; nhưng vấn đề của tôi phức tạp hơn một chút vì tôi có khoảng 5 liên kết khác nhau trong ứng dụng của tôi, nơi tôi muốn nó lưu mật khẩu. Tôi đã thử những gì bạn đang làm ở trên, nhưng tôi không thể lấy bất kỳ trang web nào để in ra tên người dùng mà bạn nhận được trong phương thức ủy quyền webView. Bất kỳ đề xuất? – RyanG

+0

@ryan, bạn đã xác minh rằng bạn thực sự lưu trữ dữ liệu chính xác trên biểu mẫu gửi ban đầu trên mỗi biểu mẫu của bạn chưa? Ngoài ra, hãy kiểm tra kỹ tên của các mẫu trên truy xuất ... tôi đã có lỗi chính tả khó hiểu khiến tôi bị đau đầu. – byron

+3

Cảm ơn bạn rất nhiều vì đã đăng giải pháp của bạn (+1)! Tôi đã phải sử dụng '@" document.getElementById ('username'). Giá trị "' và '@" document.getElementById ('password'). Value "' để làm cho nó hoạt động. Hi vọng điêu nay co ich! – Stunner

Trả lời

4

Từ cái nhìn của tôi Tôi không nghĩ rằng có một cách dễ dàng để làm điều đó. Dưới đây là một ý tưởng về những gì sức công việc mặc dù:

  • tạo UIWebView bạn
  • tạo nsurlrequest
  • sau webview trang đại biểu nạp cháy chức năng của bạn tìm trong cơ thể http của yêu cầu
  • tìm ra hình thức để đăng nhập (regex cho các hình thức đăng nhập phổ biến?)
  • truy xuất cung cấp cho người dùng tùy chọn lưu và sau đó truy xuất sau
+1

Michael, cảm ơn. Tôi đã theo mô hình cơ bản này và có thể làm cho nó hoạt động. Tôi sẽ cập nhật với nhiều chi tiết hơn ngay khi tôi thử nghiệm thêm một chút. – byron

+0

Sự kiên trì tốt đẹp! Tôi không chắc chắn làm thế nào bạn đang lưu dữ liệu của người dùng, nhưng chắc chắn kiểm tra các tài liệu táo cho một gợi ý/yêu cầu về cách làm điều đó. Tôi không quen với điều đó. –

+0

nếu tôi cần điều này cho mọi trang web, người dùng nào truy cập? Tôi vẫn có thể hiển thị đề xuất theo giá trị đã nhập trước đó hay không. ví dụ: nếu người dùng truy cập gmail và nhập một số id email, lần sau anh ấy truy cập trang gmail lần nữa, làm cách nào tôi có thể hiển thị id email đã nhập trước đó làm đề xuất? @byron – Suryakant

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