需求背景
使用某个app的时候碰到一个web页面, 登录之后每次打开都还要重新登录. 想办法弄到url之后发现, 这个页面没有携带cookie. 所以, 就在想这种情况下有没办法实现自动登录.
实现思路
- 在Chrome浏览器打开url, 右键可以查看网页源码. 找到填充账号密码的js语句和登录方法
- oc执行js语句, 自动填充账号密码, 并调用js的登录方法
代码
-1. 加载webview
self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
self.webView.navigationDelegate = self;
[self.view addSubview:self.webView];
NSURL *URL = [NSURL URLWithString:@"http://www.kball.com.cn:3000/huolala/tkb_huolala_insurance_reg.html?channelId=huolala"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
[self.webView loadRequest:request];
-2. 在webview加载完成的代理方法中, 执行js语句
//webview加载完成代理
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation {
//拼接js语句,用js语句自动填充账号和密码
NSString *userPhone = @"18576677707";
NSString *userPassWord = @"123456";
NSString *javaScript = [NSString stringWithFormat:@"var x = document.getElementsByClassName('userPhone');var i;for (i = 0; i < x.length; i++) {x[i].value=%@;}var y = document.getElementsByClassName('userPassWord');var i;for (i = 0; i < y.length; i++) {y[i].value=%@;}" ,userPhone,userPassWord];
//调用js方法
[webView evaluateJavaScript:javaScript completionHandler:^(id _Nullable sucess, NSError * _Nullable error) {
//成功回调,调用登录方法
[webView evaluateJavaScript:@"login()" completionHandler:^(id _Nullable sucess, NSError * _Nullable error) {
}];
}];
}
注
- 这只是兴趣导向的小研究, 真实开发中一般不这么实现自动登录的需求.
- 因为web页面的代码随时可以更改发布, 而app更改之后要审核上架. web代码改了, app没改, 自动登录还是会失效.
- 所以真实开发中, 如果web页面要实现自动登录, 就必须在请求中携带cookie或者token, 客户端负责读取保存cookie.