2016-07-29 64 views
1

我正在爲我的學校開發iOS應用程序,該程序允許用戶訪問學校文檔,如日程安排,日曆和成績/學費網站。我一直在研究如何爲需要登錄的一些網站保存憑證,我的最終目標不僅是保存憑證,還會在加載webview時自動登錄用戶到網站。到目前爲止,我的代碼如下所示:如何從iOS Webview登錄網站?

#import "PJP Webview.h" 

@implementation PJP_Webview 

@synthesize webView, loginView, username, password, body, urlToLink,usernameField,passwordField, firstTime, loginNeeded, callerCell; 

-(void) viewDidLoad { 
    [super viewDidLoad]; 

    loginView.hidden = true; 

    if (firstTime && loginNeeded) { 
     loginView.hidden = false; 

     [self.view bringSubviewToFront:loginView]; 
    } 
    else { 
     loginView.hidden = true; 
     [self.view addSubview:self.webView]; 
     [self.view bringSubviewToFront:webView]; 

     if (loginNeeded) { 
      NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
      NSString *usernameSave = [NSString stringWithFormat:@"%@username", self.callerCell]; 
      self.username = [userDefaults objectForKey:usernameSave]; 
      NSString *passwordSave = [NSString stringWithFormat:@"%@password", self.callerCell]; 
      self.password = [userDefaults objectForKey:passwordSave]; 

      NSURL *url = [NSURL URLWithString: urlToLink]; 
      NSString *bodyForUse = [NSString stringWithFormat: body, username, password]; 
      NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL: url]; 
      [request setHTTPMethod: @"POST"]; 
      [request setHTTPBody: [bodyForUse dataUsingEncoding: NSUTF8StringEncoding]]; 
      [webView loadRequest: request]; 
     } 
     else { 
      NSURL *url = [NSURL URLWithString: urlToLink]; 
      NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
      [webView loadRequest:request]; 
     } 
    } 

} 

- (IBAction)acceptInput:(id)sender { 
    self.username = usernameField.text; 
    self.password = passwordField.text; 

    loginView.hidden = true; 
    [self.view addSubview:self.webView]; 
    [self.view bringSubviewToFront:webView]; 

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    NSString *usernameSave = [NSString stringWithFormat:@"%@username", self.callerCell]; 
    [userDefaults setObject:username forKey:usernameSave]; 

    NSString *passwordSave = [NSString stringWithFormat:@"%@password", self.callerCell]; 
    [userDefaults setObject:password forKey:passwordSave]; 

    [userDefaults synchronize]; 

    NSURL *url = [NSURL URLWithString: urlToLink]; 
    NSString *bodyForUse = [NSString stringWithFormat: body, username, password]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL: url]; 
    [request setHTTPMethod: @"POST"]; 
    [request setHTTPBody: [bodyForUse dataUsingEncoding: NSUTF8StringEncoding]]; 
    [webView loadRequest: request]; 
} 
@end 

我模仿我的一些代碼後,發現這裏Loading a webpage through UIWebView with POST parameters

我試圖整合網站之一的例子的又一個堆棧溢出文章是https://adphila.gradeconnect.com/front/slogin.php

到目前爲止,我的代碼並未成功登錄到網站並帶我進入下一頁,所以我不確定如果我使用的參數是錯誤的,如果我的代碼有問題,或者某些存在其他問題。另外,如果您對如何使我以前的代碼更高效有任何建議,我也歡迎!

編輯:學校也使用gmail作爲學生電子郵件,那麼是否可以嵌入uiwebview的電子郵件內容呢?我知道Google有自己的API,但我以前從未使用過非Apple庫。

編輯2:

#import "PJP Webview.h" 

@implementation PJP_Webview 

@synthesize webViewCurrent, loginView, username, password, bodyUsername, bodyPassword, urlToLink,usernameField,passwordField, firstTime, loginNeeded, callerCell, bodyButton; 

-(void) viewDidLoad { 
    [super viewDidLoad]; 
    [webViewCurrent setDelegate:self]; 

    loginView.hidden = true; 

    if (firstTime && loginNeeded) { 
     loginView.hidden = false; 

     [self.view bringSubviewToFront:loginView]; 
    } 
    else { 
     loginView.hidden = true; 

     if (loginNeeded) { 
      NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
      NSString *usernameSave = [NSString stringWithFormat:@"%@username", self.callerCell]; 
      self.username = [userDefaults objectForKey:usernameSave]; 
      NSString *passwordSave = [NSString stringWithFormat:@"%@password", self.callerCell]; 
      self.password = [userDefaults objectForKey:passwordSave]; 

      NSURL *url = [NSURL URLWithString: urlToLink]; 
      NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
      [webViewCurrent loadRequest:request]; 
     } 
     else { 
      NSURL *url = [NSURL URLWithString: urlToLink]; 
      NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
      [webViewCurrent loadRequest:request]; 
     } 
     [self.view addSubview:self.webViewCurrent]; 
     [self.view bringSubviewToFront:webViewCurrent]; 
    } 
} 

- (IBAction)acceptInput:(id)sender { 
    self.username = usernameField.text; 
    self.password = passwordField.text; 

    loginView.hidden = true; 

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    NSString *usernameSave = [NSString stringWithFormat:@"%@username", self.callerCell]; 
    [userDefaults setObject:username forKey:usernameSave]; 

    NSString *passwordSave = [NSString stringWithFormat:@"%@password", self.callerCell]; 
    [userDefaults setObject:password forKey:passwordSave]; 

    [userDefaults synchronize]; 

    NSURL *url = [NSURL URLWithString: urlToLink]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    [webViewCurrent loadRequest:request]; 

    [self.view addSubview:self.webViewCurrent]; 
    [self.view bringSubviewToFront:webViewCurrent]; 
} 

-(void) webViewDidFinishLoad:(UIWebView *)webView { 
    NSString *fillData = [NSString stringWithFormat:@"document.getElementById('%@').value = '%@';document.getElementById('%@').value = '%@';", bodyUsername, username, bodyPassword, password]; 
    [webView stringByEvaluatingJavaScriptFromString:fillData]; 

    NSString *buttonData = [NSString stringWithFormat:@"document.getElementById('%@').click()", bodyButton]; 
    [webView stringByEvaluatingJavaScriptFromString:buttonData]; 
} 

@end 

有一個新的錯誤,雖然,無效SendDelegateMessage(NSInvocation的*):代表(web視圖:didFinishLoadForFrame :)失敗在等待10秒後返回。主循環模式:kCFRunLoopDefaultMode

對於我使用的網站,bodyUsername是lusername,bodyPassword lpassword和bodyButton登錄名。頁面加載但不執行JavaScript。

回答

1

您可以通過自動填充該網頁的用戶名和密碼字段來完成此操作。首先從網頁獲取用戶名和密碼字段的名稱。右鍵點擊網頁。 點擊檢查元素,然後你很容易找到它。 然後編寫WebView委託方法。

// ViewController.m 
// WebDemo 
// 
// Created by Nilesh on 7/31/16. 
// Copyright © 2016 Nilesh. All rights reserved. 
// 

#import "ViewController.h" 

@interface ViewController()<UIWebViewDelegate> 
@property (weak, nonatomic) IBOutlet UIWebView *webView; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSString *urlToLink = @"https://adphila.gradeconnect.com/front/slogin.php"; 
    NSURL *url = [NSURL URLWithString: urlToLink]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    [_webView loadRequest:request]; 

    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

-(void) webViewDidFinishLoad:(UIWebView *)webView { 

    NSString* userId = @"userName" ;//Your userName 
    NSString* password = @"password";// Your Password 


    NSString* jScriptString1 = [NSString stringWithFormat:@"document.forms[0]['lusername'].value='%@'", userId]; 

    NSString* jScriptString2 = [NSString stringWithFormat:@"document.forms[0]['lpassword'].value='%@'", password]; 

    [webView stringByEvaluatingJavaScriptFromString:jScriptString1]; 

    [webView stringByEvaluatingJavaScriptFromString:jScriptString2]; 

    NSString *jsStat = @"document.forms[0]['login'].click()"; 

    [webView stringByEvaluatingJavaScriptFromString:jsStat]; 


} 
@end 
+0

我更新了我的代碼以包含此代碼。現在我有錯誤:void SendDelegateMessage(NSInvocation *):委託(webView:didFinishLoadForFrame :)等待10秒後未能返回。主運行循環模式:kCFRunLoopDefaultMode – SharkbaitWhohaha

+0

您能否檢查上述更新? – SharkbaitWhohaha

+0

這個錯誤是由於JavaScript代碼引起的。實際上,對於每個條目,JavaScript執行時間固定爲10秒。如果您的代碼執行超過10秒,則webview將停止執行腳本......這就是爲什麼您會收到此錯誤。 – Nilesh