2011-01-23 7 views
34

Sto costruendo un'applicazione per iPhone che è solo un UIWebView di un sito mobile esistente con un accesso basato su modulo. Quando accedo al sito mobile su iPhone Safari, mi viene richiesto di salvare il mio nome utente/password, che viene poi riempito automaticamente quando torno sul sito in un secondo momento.E 'possibile che UIWebView salvi e compili automaticamente i valori dei moduli precedentemente immessi (ad esempio, nome utente e password)?

Vorrei attivare la stessa funzionalità nel UIWebView, ma per la vita di me, non riesco a capire come farlo. Qualche idea?


Soluzione

Seguendo modello base di Michael (vedi risposta accettata), sono stato in grado di ottenere questo fatto. Ecco quello che ho fatto:

IMPOSTAZIONE DATI

- (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]; 

    }  

} 

ottenere i dati

- (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]; 

     } 
    } 
} 

Si noti che sto usando impressionante pacchetto di Buzz Andersen SFHFKeychainUtils per memorizzare i dati sensibili al iOs portachiavi.

al fine di ottenere SFHFKeychainUtils di lavoro, è necessario fare un paio di cose:

  1. Aggiungi SFHFKeychainUtils.h e SFHFKeychainUtils.m al progetto
  2. Aggiungere il Security.framework al progetto
  3. #import <Security/Security.h> e #import "SFHFKeychainUtils.h"
+0

Questo codice funziona solo per il sito Web specifico che stai tentando di caricare? Ho cercato di capirlo anche per la mia app; ma il mio problema è un po 'più complicato perché ho circa 5 diversi link nella mia app in cui mi piacerebbe che salvasse le password. Ho tentato quello che stai facendo sopra, ma non riesco a ottenere alcun sito Web per stampare il nome utente che ricevi nel metodo delegato webView. Eventuali suggerimenti? – RyanG

+0

@ryan, hai verificato che stai effettivamente memorizzando i dati correttamente sul modulo iniziale di invio su ciascuno dei tuoi moduli? inoltre, controlla due volte i nomi dei moduli sul recupero ... ho avuto un errore ortografico difficile da vedere che mi ha causato mal di testa. – byron

+3

Grazie mille per aver postato la tua soluzione (+1)! Ho dovuto usare '@" document.getElementById ('username'). Value "' e '@" document.getElementById ('password'). Value "' per farlo funzionare. Spero che questo ti aiuti! – Stunner

risposta

4

Dal mio aspetto non credo ci sia un modo semplice per farlo. Ecco un'idea di quello che forza lavoro però:

  • creare l'UIWebView
  • creare un nsurlrequest
  • dopo i vostri WebView pagina delegato caricato incendi funzione guardare nel corpo http della richiesta
  • trovare la forma per il login (regex per i moduli di accesso comuni?)
  • recupera dare all'utente la possibilità di salvarlo e quindi recuperare più tardi
+1

Michael, grazie. Ho seguito questo modello di base e sono riuscito a farlo funzionare. Aggiornerò con maggiori dettagli non appena avrò provato un po 'di più. – byron

+0

Buona perseveranza! Non sono sicuro di come si salvano i dati dell'utente, ma si consiglia di verificare i documenti Apple per un suggerimento/requisito su come farlo. Non sono così familiare con quello. –

+0

cosa succede se ho bisogno di questo per ogni pagina web, quale utente visita? Posso ancora mostrare il suggerimento in base al valore inserito in precedenza. ad esempio se l'utente visita gmail e inserisce qualche ID e-mail, la prossima volta che visita nuovamente la pagina di Gmail, come posso mostrargli l'ID e-mail precedentemente inserito come suggerimento? @byron – Suryakant

Problemi correlati