Возможно ли для UIWebView сохранять и автоматически заполнять ранее введенные значения формы (например, имя пользователя и пароль)? - PullRequest
34 голосов
/ 23 января 2011

Я создаю приложение для iPhone, которое представляет собой просто UIWebView существующего мобильного сайта, который имеет форму входа в систему.Когда я захожу на мобильный сайт с iPhone Safari, мне предлагается сохранить имя пользователя и пароль, и он автоматически заполняется, когда я возвращаюсь на сайт позже.

Я бы хотел включить ту же функциональность в UIWebView, но я не могу понять, как это сделать.Есть идеи?


Решение

Следуя базовой модели Майкла (см. Принятый ответ), я смог это сделать.Вот что я сделал:

НАСТРОЙКА ДАННЫХ

- (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.h и SFHFKeychainUtils.m в ваш проект
  2. Добавьте Security.framework в свой проект
  3. #import <Security/Security.h> и #import "SFHFKeychainUtils.h"

1 Ответ

4 голосов
/ 23 января 2011

Судя по моему взгляду, я не думаю, что есть простой способ сделать это.Вот идея того, что может работать, хотя:

  • создайте свой uiwebview
  • создайте запрос nsurlrequest
  • после загрузки загруженной функции страницы делегата веб-просмотрапри поиске в http теле запроса
  • найти форму для входа в систему (регулярное выражение для обычных форм входа в систему?)
  • получить, дать пользователю возможность сохранить его, а затем получить позже
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...