如何从iOS Webview登录网站



我正在为我的学校开发一款iOS应用程序,该应用程序将允许用户访问学校文档,如时间表、日历和年级/学费网站。我一直在研究如何为一些需要登录的网站保存凭据,我的最终目标不仅是保存凭据,而且是在加载Web视图时自动将用户登录到网站。到目前为止,我的代码如下:

#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

在这里发现另一篇堆栈溢出文章后,我对我的一些代码进行了建模通过UIWebView加载带有POST参数的网页

我试图整合的一个网站的例子是https://adphila.gradeconnect.com/front/slogin.php

到目前为止,我的代码还没有成功地将我登录到网站并带我进入下一个页面,所以我不确定我用于参数的主体是否是错误的,是否我的代码有错误,或者是否存在其他问题。此外,如果你对如何提高我以前的代码的效率有任何建议,我也很欢迎!

编辑:学校也对学生的电子邮件使用gmail,所以有可能嵌入电子邮件内容的uiwebview吗?我知道谷歌有自己的API,但我以前从未使用过非苹果库。

编辑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*):委托(webView:didFinishLoadForFrame:)在等待10秒后未能返回。主运行循环模式:kCFRunLoopDefaultMode

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

您可以通过自动填充该网页的用户名和密码字段来完成此操作。首先从网页中获取用户名和密码字段的名称。右键单击网页。点击检查元素,然后你可以很容易地找到它。然后编写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

最新更新