Ist es möglich, dass eine UIWebView zuvor eingegebene Formularwerte (z. B. Benutzername und Passwort) speichern und automatisiert hat?
Frage
Ich baue eine iPhone -App, die nur ein ist UIWebView
einer vorhandenen mobilen Site mit einer formbasierten Anmeldung. Wenn ich mich auf der mobilen Site auf iPhone Safari anmelde, bin ich aufgefordert, meinen Benutzernamen/mein Passwort zu speichern. Es ist dann automatisch, wenn ich später zur Website zurückkehre.
Ich möchte die gleiche Funktionalität in der ermöglichen UIWebView
, Aber für mein Leben kann ich nicht herausfinden, wie es geht. Irgendwelche Ideen?
Lösung
Nach Michaels Basismodell (siehe akzeptierte Antwort) konnte ich dies erledigen. Hier ist, was ich getan habe:
Daten einstellen
- (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];
}
}
Daten erhalten
- (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];
}
}
}
Beachten Sie, dass ich Buzz Andersens großartig verwende SfhfkeyChainutils Paket zum Speichern sensibler Daten in den iOS -Schlüsselbund.
Um SFHFKeyChainutils zum Laufen zu bringen, müssen Sie ein paar Dinge tun:
- Hinzufügen
SFHFKeychainUtils.h
undSFHFKeychainUtils.m
zu Ihrem Projekt - Ergänzen Sie die
Security.framework
zu Ihrem Projekt #import <Security/Security.h>
und#import "SFHFKeychainUtils.h"
Lösung
Ich glaube nicht, dass es eine einfache Möglichkeit gibt, es zu tun. Hier ist eine Vorstellung davon was könnte Arbeit aber:
- Erstellen Sie Ihre UIWebview
- Erstellen Sie einen Nsurlrequest
- Nachdem Ihre Webview -Delegate -Seite geladene Funktionsfeuer in der HTTP -Karosserie der Anforderung suchen
- Finden Sie das Formular für die Anmeldung (Regex für gemeinsame Anmeldeformulare?)
- Abrufen Sie dem Benutzer die Option zum Speichern und rufen Sie später ab