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:
- Thêm
SFHFKeychainUtils.h
vàSFHFKeychainUtils.m
để dự án của bạn - Thêm
Security.framework
để dự án của bạn #import <Security/Security.h>
và#import "SFHFKeychainUtils.h"
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
@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
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