如何从 iOS Webview 登录网站?

How do you log in to a website from an iOS Webview?

我正在为我的学校开发一个 iOS 应用程序,该应用程序将允许用户访问学校文档,例如日程表、日历和 grade/tuition 网站。我一直在研究如何为一些需要登录的站点保存凭据,我的最终目标不仅是保存凭据,而且在加载 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

虽然有一个新错误,void SendDelegateMessage(NSInvocation *): delegate (webView:didFinishLoadForFrame:) 在等待 10 秒后未能 return。 main 运行 循环模式:kCFRunLoopDefaultMode

我使用的网站,bodyUsername是lusername,bodyPassword是lpassword,bodyButton登录。页面加载但未执行 javascript.

您可以通过自动填充该网页的用户名和密码字段来执行此操作。首先从网页中获取用户名和密码字段的名称。右键点击网页。 单击检查元素,然后您可以轻松找到它。 然后写WebView Delegate Method

//  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