2011-01-23 65 views
34

我正在構建一個iPhone應用程序,該應用程序僅具有基於表單登錄的現有移動網站的UIWebView。當我在iPhone Safari上登錄移動網站時,系統會提示我保存用戶名/密碼,然後在稍後返回網站時自動填充。UIWebView可以保存和自動填寫以前輸入的表單值(例如,用戶名和密碼)嗎?

我想在UIWebView中啓用相同的功能,但對於我的生活,我無法弄清楚如何去做。有任何想法嗎?


解決方案

繼邁克爾的基本模型(見接受的答案),我能得到這個工作。下面是我所做的:

SETTING DATA

- (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]; 

    }  

} 

獲取數據

- (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]; 

     } 
    } 
} 

請注意,我用巴斯安徒生真棒SFHFKeychainUtils包來存儲敏感數據的IOS鑰匙扣。

爲了得到SFHFKeychainUtils工作,你需要做的幾件事情:

  1. 添加SFHFKeychainUtils.hSFHFKeychainUtils.m到項目
  2. 添加Security.framework到項目
  3. #import <Security/Security.h>#import "SFHFKeychainUtils.h"
+0

此代碼僅適用於您嘗試加載的特定網站嗎?我一直在試圖弄清楚我的應用,以及;但我的問題有點複雜,因爲我的應用程序中有大約5個不同的鏈接,我希望它們可以保存密碼。我嘗試了上面的操作,但是我無法通過任何網站打印出您在webView委託方法中收到的用戶名。有什麼建議麼? – RyanG 2011-05-18 13:12:40

+0

@ryan,你是否證實你實際上正確地將數據存儲在每個表單上的初始表單上?此外,仔細檢查檢索表單名稱...我有一個難以察覺的拼寫錯誤,導致我一些頭痛。 – byron 2011-05-23 00:17:01

回答

4

從我看,我不認爲有一個簡單的方法來做到這一點。這裏是什麼威力雖然工作的想法:

  • 創建一個UIWebView
  • 創建的NSURLRequest
  • 您的WebView委託頁面加載功能大火之後看在請求的HTTP體
  • 發現窗體用於登錄(常見登錄表單的正則表達式?)
  • 檢索讓用戶選擇保存並稍後檢索
相關問題