2011-01-23 9 views
34

フォームベースのログインを持つ既存のモバイルサイトのちょうどUIWebViewであるiPhoneアプリを構築しています。 iPhone Safariでモバイルサイトにログインすると、ユーザー名とパスワードを保存するように求められ、後でサイトに戻ったときに自動的に入力されます。UIWebViewは以前に入力したフォームの値(例:ユーザー名とパスワード)を保存して自動入力することはできますか?

私はUIWebViewでも同じ機能を有効にしたいと思いますが、私の人生では、どうやってそれを行うのか分かりません。何か案は?マイケルの基本モデル(受け入れ答えを参照)に続き


ソリューション

は、私がこれを成し遂げることができました。ここに私がやったことだ:私はiOSのキーチェーンに機密データを保存するためにバズアンデルセンの素晴らしい SFHFKeychainUtilsパッケージを使用しているデータ

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

     } 
    } 
} 

注意を取得し、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]; 

    }  

} 

SETTING

作業SFHFKeychainUtilsを得るために、あなたはいくつかのことを行う必要があります。

  1. プロジェクトにSFHFKeychainUtils.hSFHFKeychainUtils.mを追加し、プロジェクトに
  2. #import <Security/Security.h>#import "SFHFKeychainUtils.h"
Security.frameworkを追加
+0

このコードは、ロードしようとしている特定のWebサイトでのみ機能しますか?私は私のアプリのためにこれを理解しようとしています。私の問題はもう少し複雑です。なぜなら、パスワードを保存したいアプリケーションのリンクが5つほどあるからです。上記の作業を試みましたが、WebViewデリゲートメソッドで受け取ったユーザー名を表示するWebサイトを取得できません。助言がありますか? – RyanG

+0

@ryan、それぞれのフォームの最初のフォームに実際にデータを正しく格納していることを確認しましたか?また、検索時にフォーム名をダブルチェックしてみてください...私には頭がおかしくなってスペルミスがありました。 – byron

+3

あなたのソリューション(+1)を投稿してくれてありがとう! document.getElementById( 'username')。value "と' @ "document.getElementById( 'password')。value" 'を使用して動作させる必要がありました。お役に立てれば! – Stunner

答えて

4

私の見てからは、簡単な方法はないと思います。ここではどのようなかもしれない作品のアイデアは、しかしです:

  • は、あなたのWebViewデリゲートページロード機能の火災はフォームを見つける
  • リクエストのHTTPボディに見た後nsurlrequest
  • を作成し、あなたのUIWebView
  • を作成しますログイン(正規ログインフォームの正規表現ですか?)
  • 検索するユーザーに保存して後で検索するオプションを与えます。
+1

マイケル、ありがとう。私はこの基本モデルに従って、それを機能させることができました。私はもう少し詳しくテストするとすぐに詳細を更新します。 – byron

+0

素敵な忍耐力!私はあなたがどのようにユーザーのデータを保存しているのか分かりませんが、確かにリンゴのドキュメントをチェックしてください。私はそれに精通していない。 –

+0

すべてのウェブページでこれを必要とする場合は、どのユーザーが訪問しますか?以前に入力した値に従って提案を表示することはできますか? たとえば、ユーザーがgmailにアクセスしていくつかの電子メールIDを入力すると、次にgmailページに再度アクセスしたときに、以前に入力した電子メールIDを提案としてどのように表示できますか? @byron – Suryakant

関連する問題