需求背景
使用某個(gè)app的時(shí)候碰到一個(gè)web頁(yè)面, 登錄之后每次打開都還要重新登錄. 想辦法弄到url之后發(fā)現(xiàn), 這個(gè)頁(yè)面沒(méi)有攜帶cookie. 所以, 就在想這種情況下有沒(méi)辦法實(shí)現(xiàn)自動(dòng)登錄.
實(shí)現(xiàn)思路
- 在Chrome瀏覽器打開url, 右鍵可以查看網(wǎng)頁(yè)源碼. 找到填充賬號(hào)密碼的js語(yǔ)句和登錄方法
- oc執(zhí)行js語(yǔ)句, 自動(dòng)填充賬號(hào)密碼, 并調(diào)用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加載完成的代理方法中, 執(zhí)行js語(yǔ)句
//webview加載完成代理
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation {
//拼接js語(yǔ)句,用js語(yǔ)句自動(dòng)填充賬號(hào)和密碼
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];
//調(diào)用js方法
[webView evaluateJavaScript:javaScript completionHandler:^(id _Nullable sucess, NSError * _Nullable error) {
//成功回調(diào),調(diào)用登錄方法
[webView evaluateJavaScript:@"login()" completionHandler:^(id _Nullable sucess, NSError * _Nullable error) {
}];
}];
}
注
- 這只是興趣導(dǎo)向的小研究, 真實(shí)開發(fā)中一般不這么實(shí)現(xiàn)自動(dòng)登錄的需求.
- 因?yàn)閣eb頁(yè)面的代碼隨時(shí)可以更改發(fā)布, 而app更改之后要審核上架. web代碼改了, app沒(méi)改, 自動(dòng)登錄還是會(huì)失效.
- 所以真實(shí)開發(fā)中, 如果web頁(yè)面要實(shí)現(xiàn)自動(dòng)登錄, 就必須在請(qǐng)求中攜帶cookie或者token, 客戶端負(fù)責(zé)讀取保存cookie.