2011-01-23 17 views
34

Form tabanlı bir girişe sahip mevcut bir mobil sitenin yalnızca UIWebView olan bir iPhone uygulaması yapıyorum. IPhone Safari'de mobil siteye giriş yaptığımda, kullanıcı adımı/şifremi kaydetmem istenir ve daha sonra siteye geri döndüğümde otomatik olarak doldurulur.Bir UIWebView'ın önceden girilmiş form değerlerini (ör. Kullanıcı adı ve şifre) kaydedip otomatik olarak doldurması mümkün mü?

Aynı işlevi UIWebView'da etkinleştirmek istiyorum, ancak benim için, nasıl yapacağımı anlayamıyorum. Herhangi bir fikir? Michael'ın temel modeli (Kabul cevabı bakınız) takiben


Çözüm

, ben bu işi başardı. İşte ne yaptım: Ben iOs Keychain'e hassas veri depolamak için Buzz Andersen'in müthiş SFHFKeychainUtils paketini kullanıyorum VERİLERİ

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

     } 
    } 
} 

Not BAŞLARKEN VERİ

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

    }  

} 

AYARI

. SFHFKeychainUtils amacıyla

çalışma almak için, bir kaç şey yapmak gerekir:

  1. projenize SFHFKeychainUtils.h ve SFHFKeychainUtils.m ekle
  2. projenize Security.framework ekle
  3. #import <Security/Security.h> ve #import "SFHFKeychainUtils.h"
+0

Bu kod yalnızca yüklemeye çalıştığınız belirli bir web sitesi için mi çalışıyor? Uygulamam için bunu anlamaya çalışıyorum; ama benim sorunum biraz daha karmaşık çünkü uygulamasında şifreleri saklamak istediğim yaklaşık 5 farklı bağlantı var. Yukarıda yaptığınız şeyi denedim, ancak webView delegesi yönteminde aldığınız kullanıcı adını yazdırmak için hiçbir web sitesine sahip olamıyorum. Baska öneri? – RyanG

+0

@ryan, formlarınızın her birinde ilk form gönderiminde verileri doğru bir şekilde sakladığınızı doğruladı mı? Ayrıca, geri alma sırasında form isimlerini iki kez kontrol edin ... bana bazı baş ağrıları neden oldu görmek zor bir misspelling vardı. – byron

+3

Çözümünüzü gönderdiğiniz için çok teşekkürler (+1)! Document.getElementById ('kullanıcı adı'). '' Ve '@ 'document.getElementById (' password ') değerini kullanmam gerekiyordu. Bu yardımcı olur umarım! – Stunner

cevap

4

Baktığımdan, bunu yapmanın kolay bir yolu olduğunu sanmıyorum.

  • oluşturmak için webview temsilci sayfa yüklendiğinde fonksiyon yangınlardan sonra
  • isteğin http gövdesinin
  • formunu bulmak bakmak bir nsurlrequest sizin UIWebView
  • oluşturun: Burada neyi eser olsa kudretinin bir fikirdir giriş için (genel giriş formları için regex?)
  • kullanıcılara kaydetme seçeneği sunar ve sonra da bu dosyayı alırsınız.
+1

Michael, teşekkürler. Bu temel modeli takip ettim ve çalışmasını sağladı. Biraz daha test edersem daha fazla ayrıntı ile güncelleyeceğim. – byron

+0

Güzel azim! Kullanıcı verilerini nasıl kaydettiğinizden emin değilim, ancak Apple Doc'ları nasıl yapacağınıza dair bir öneri/gereksinim olup olmadığını mutlaka kontrol edin. Ben buna aşina değilim. –

+0

Her web sayfası için buna hangi kullanıcı ziyaretine ihtiyacım olursa? Önceden girilen değere göre öneriyi hala gösterebilir miyim? Örneğin, kullanıcı gmail'i ziyaret edip bir e-posta kimliği girerse, bir dahaki sefere gmail sayfasını tekrar ziyaret ederse, daha önce girilen e-posta kimliğini öneri olarak nasıl gösterebilirim? @byron – Suryakant

İlgili konular