2016-02-01 6 views
5

Я делаю для меня очень легкое приложение. Когда я запускаю это приложение, он просто приводит меня на эту веб-страницу https://social.tre.it/expert.Автозаполнение Имя пользователя и пароль в UIWebView

Я хотел бы автоматизировать вход в систему, так что есть способ автозаполнения имени пользователя и пароля, проверить отметку «Я принимаю условие» и нажать кнопку «Войти»?

Я пробовал это Autofill Username and Password UIWebView Swift, но он не работает, я не создатель страницы, поэтому я не знаю точно, как он структурирован.

Было бы здорово, даже если брелоки iCloud заполнили бы формы ... но, возможно, я слишком много спрашиваю!

+0

Я бы сохранил имя пользователя в 'NSUserDefaults'. Для пароля вы можете использовать TouchID после того, как пользователь вводит свой пароль, если они этого захотят. Простое автозаполнение пароля не было бы очень безопасным. –

+0

Нет, но это приложение только для меня! Моя проблема заключается только в том, чтобы вводить строки имени пользователя и пароля и заполнять формы на веб-странице. –

ответ

10

Для этого вы можете использовать JavaScript.

Если вы просматриваете страницу, вы можете легко определить идентификаторы полей ввода текста (expert_email и expert_password) и выполнить код JS, чтобы заполнить их.

Реализация webViewDidFinishLoad метод UIWebView делегата следующим образом:

Objective-C:

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    //fill data 
    NSString *email = @"[email protected]"; 
    NSString *password = @"mypassword"; 
    NSString *fillDataJsCall = [NSString stringWithFormat:@"document.getElementById('expert_email').value = '%@';document.getElementById('expert_password').value = '%@';", email, password]; 
    [webView stringByEvaluatingJavaScriptFromString:fillDataJsCall]; 

    //check checkboxes 
    [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('expert_remember_me').checked = true; document.getElementById('expert_terms_of_service').checked = true;"]; 

    //submit form 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^(void) 
    { 
     [webView stringByEvaluatingJavaScriptFromString:@"document.forms[\"new_expert\"].submit();"]; 
    }); 
} 

СВИФТ:

func webViewDidFinishLoad(webView: UIWebView) { 

    // fill data 
    let savedUsername = "USERNAME" 
    let savedPassword = "PASSWORD" 

    let fillForm = String(format: "document.getElementById('expert_email').value = '\(savedUsername)';document.getElementById('expert_password').value = '\(savedPassword)';") 
    webView.stringByEvaluatingJavaScriptFromString(fillForm) 

    //check checkboxes 
    webView.stringByEvaluatingJavaScriptFromString("document.getElementById('expert_remember_me').checked = true; document.getElementById('expert_terms_of_service').checked = true;") 

    //submit form 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(1 * NSEC_PER_SEC)), dispatch_get_main_queue()){ 
     webView.stringByEvaluatingJavaScriptFromString("document.forms[\"new_expert\"].submit();") 
    } 
} 

Это должно заполнить вашу информацию. Однако этот код может легко сломаться, если этот веб-сайт изменит свою структуру в будущем. Этот метод выполнения JS-кода более разумен, когда вы обрабатываете свои собственные страницы.

Edit:

Я обновил код, чтобы показать, как проверить флажки и как отправить форму.

Некоторые примечания:

  • когда Логин не удается страница перезагружается, так что вы будете в конечном итоге с бесконечной петле звонков webViewDidFinishLoad поскольку вы пытаетесь снова и снова подать, поэтому вам может понадобиться добавить некоторую логику для разрыва в этом случае. Вот почему я поставил перед отправкой задержку, чтобы увидеть, что происходит.
  • В дополнение к информации в предыдущем пункте - вы будете получать звонки до webViewDidFinishLoad в любом случае после успешного входа в систему (при переадресации на следующую страницу), чтобы вы могли поднять флаг после загрузки другой страницы (выполнить попытка входа в систему выполняется только на странице входа в систему).
+0

Ницца, он работает! Unlucky Я никогда не работал с Java, поэтому у меня нет никаких идей о том, как с ним взаимодействовать. У вас есть идея даже отметить две коробки и формы и как нажать кнопку входа? –

+0

@ Matte.Car взгляните на обновленный код и примечания по редактированию. – Artal

+0

Большое спасибо, я добавил код Swift. –

0

У меня есть ошибка в этой строке:

dispatch_after(dispatch_time(dispatch_time_t(DispatchTime.now()), Int64(UInt64(1 * NSEC_PER_SEC))), dispatch_get_main_queue()){ 
     webView.stringByEvaluatingJavaScript(from: "document.forms[\"new_expert\"].submit();") 
    } 

Сообщение об ошибке:

Невозможно преобразовать значение типа 'Int' к ожидаемому 'dispatch_time_t' типа аргумента (так называемый 'UInt64')

Смежные вопросы