2016-02-01 15 views
5

Ich mache eine sehr einfache App für mich. Wenn ich diese App starte, bringe ich sie einfach auf diese Webseite https://social.tre.it/expert.AutoFill Benutzername und Passwort in UIWebView

Ich möchte Login automatisieren, also gibt es eine Möglichkeit, Benutzernamen und Passwort automatisch zu füllen, aktivieren Sie die "Ich akzeptiere Bedingung" -Markierung und drücken Sie "Login" -Taste?

Ich versuchte dies Autofill Username and Password UIWebView Swift, aber es funktioniert nicht, ich bin nicht der Schöpfer der Seite, so dass ich nicht genau weiß, wie es strukturiert ist.

Wäre cool, auch wenn iCloud keychains die Formulare füllen würde ... aber vielleicht frage ich zu viel!

+0

Ich würde den Benutzernamen in 'NSUserDefaults' speichern. Für das Passwort können Sie die TouchID verwenden, nachdem der Benutzer sein Passwort eingegeben hat. Einfaches automatisches Ausfüllen des Passworts wäre nicht sehr sicher. –

+0

Nein, aber ist eine App nur für mich! Mein Problem besteht nur darin, meine Benutzernamen und Passwort-Strings zu nehmen und die Formulare auf der Webseite zu füllen. –

Antwort

10

Sie können Javascript verwenden, um dies zu tun.

Wenn Sie die Seite überprüfen, können Sie die IDs der Texteingabefelder (expert_email und expert_password) ziemlich leicht erkennen und einen JS-Code ausführen, um sie zu füllen.

Implementieren die webViewDidFinishLoad Methode der UIWebView Delegierten etwa so:

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

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

Dies sollte Ihre Informationen füllen. Dieser Code kann jedoch leicht brechen, wenn diese Website in Zukunft ihre Struktur ändert. Diese Methode zum Ausführen von JS-Code ist sinnvoller, wenn Sie Ihre eigenen Seiten bearbeiten.

Edit:

ich den Code aktualisiert zu demonstrieren, wie die Kontrollkästchen zu überprüfen und wie das Formular abzuschicken.

Einige Anmerkungen:

  • wenn die Anmelde die Seite nicht neu geladen wird, so dass Sie gehen mit einer Endlosschleife von Anrufen zu webViewDidFinishLoad am Ende, da Sie versuchen zu übermitteln und immer wieder, Vielleicht möchten Sie in diesem Fall etwas Logik hinzufügen, um zu brechen. Deshalb setze ich eine Verzögerung ein, bevor ich mich einschicke, um sehen zu können, was vor sich geht.
  • Zusätzlich zu den Informationen im vorherigen Punkt - Sie werden Anrufe nach webViewDidFinishLoad trotzdem erhalten, nachdem die Anmeldung erfolgreich war (wenn Sie auf die nächste Seite umgeleitet werden), also möchten Sie vielleicht ein Flag erhöhen, sobald eine andere Seite geladen wird der Login-Versuch nur auf der Login-Seite).
+0

Schön, es funktioniert! Unglücklicherweise habe ich noch nie mit Java gearbeitet, daher habe ich keine Ideen, wie ich damit umgehen soll. Haben Sie eine Idee, die beiden Felder und die Formulare zu markieren und den Login-Button zu drücken? –

+0

@ Matte.Car werfen Sie einen Blick auf den aktualisierten Code und die Notizen bearbeiten .. – Artal

+0

Vielen Dank, ich habe Swift-Code hinzugefügt. –

0

Ich habe Fehler auf dieser Linie:

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

Die Fehlermeldung:

Wert kann nicht vom Typ konvertieren 'Int' zu erwarteten Argumenttyp 'dispatch_time_t' (auch bekannt als 'UInt64')

Verwandte Themen