2016-02-01 23 views
5

Robię dla mnie bardzo łatwą aplikację. Kiedy uruchamiam tę aplikację, po prostu sprowadzam mnie na tę stronę internetową: https://social.tre.it/expert.Nazwa użytkownika i hasło do autouzupełniania w UIWebView

Chciałbym zautomatyzować logowanie, więc czy istnieje sposób automatycznego uzupełniania nazwy użytkownika i hasła, zaznacz pole "Akceptuję warunki" i naciskam przycisk "login"?

Próbowałem tego Autofill Username and Password UIWebView Swift, ale to nie działa, nie jestem twórcą strony, więc nie wiem dokładnie, jak to jest zorganizowane.

Byłoby fajnie, nawet gdyby breloki iCloud wypełniły formularze ... ale może o to za dużo!

+0

Zapisałbym nazwę użytkownika w 'NSUserDefaults'. W przypadku hasła możesz użyć TouchID po wprowadzeniu przez użytkownika hasła, jeśli tak zdecydują. Po prostu automatyczne wypełnienie hasła nie byłoby zbyt bezpieczne. –

+0

Nie, ale jest to aplikacja tylko dla mnie! Mój problem polega tylko na przechwytywaniu moich nazw użytkowników i haseł oraz wypełnianiu formularzy na stronie internetowej. –

Odpowiedz

10

Możesz użyć JavaScript, aby to zrobić.

Podczas sprawdzania strony można dość łatwo zidentyfikować identyfikatory pól wprowadzania tekstu (expert_email i expert_password) i wykonać kod JS, aby je wypełnić.

Wdrożenie sposobu pełnomocnika UIWebViewwebViewDidFinishLoad tak:

CEL-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();"]; 
    }); 
} 

SWIFT

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();") 
    } 
} 

To powinno wypełnić twoje dane. Jednak ten kod może łatwo ulec zerwaniu, jeśli ta strona internetowa zmieni swoją strukturę w przyszłości. Ta metoda wykonywania kodu JS jest bardziej uzasadniona, gdy zajmujesz się własnymi stronami.

Edit:

I uaktualniony kod do wykazania, w jaki sposób sprawdzić pola wyboru i jak wysłać formularz.

Kilka uwag:

  • podczas logowania nie powiedzie się, gdy strona jest przeładowana, więc masz zamiar skończyć z nieskończonej pętli wywołań webViewDidFinishLoad ponieważ starasz się przedstawić w kółko, więc możesz chcieć dodać trochę logiki, aby się w tym przypadku podzielić. Dlatego przed przesłaniem przesyłam opóźnienie, aby móc zobaczyć, co się dzieje.
  • Oprócz informacji z poprzedniego punktu - w każdym razie po udanym logowaniu (po przekierowaniu na następną stronę) można uzyskać połączenia z numerem webViewDidFinishLoad, więc warto podnieść flagę po załadowaniu innej strony (wykonać próba zalogowania się tylko na stronie logowania).
+0

Dobrze, to działa! Pechowy Nigdy nie pracowałem z Javą, więc nie mam żadnych pomysłów na interakcję z nią. Czy masz pomysł, aby oznaczyć dwa pola i formularze oraz jak nacisnąć przycisk logowania? –

+0

@ Matte.Car spójrz na zaktualizowany kod i uwagi do edycji. – Artal

+0

Dziękuję bardzo, dodałem kod Swift. –

0

mam błąd na tej linii:

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();") 
    } 

Komunikat o błędzie:

Nie można przekonwertować wartości typu 'INT' do oczekiwanego typu argumentu 'dispatch_time_t' (aka 'UInt64')