OC JS交互(通常情况下,如果网页写得正规的话,是可以正常交互的,之前就遇到后台写h5始终拿不到事件,元素也拿不到,更别说交互了,真是奇了怪了)
自动填充表单
@"document.getElementById('loginid').value = '这里填入你的用户名';document.getElementById('userpassword').value = '这里填入你的密码';";
根据ID拿到输入用户名的输入框并给值
根据ID拿到输入密码的输入框并给值
自动点击登录按钮
@"document.getElementById('login').click()"
根据ID获取登录按钮这个元素,并调用其点击事件click()
如果有特别限制的话,我们需要先访问一次特定网址,并存入cookie
NSURL * cookieHost = [NSURL URLWithString:@"http://mmmmmm/login/Login.jsp"]; NSHTTPCookie * cookie = [NSHTTPCookie cookieWithProperties: [NSDictionary dictionaryWithObjectsAndKeys: [cookieHost host],NSHTTPCookieDomain, [cookieHost path],NSHTTPCookiePath, @"COOKIE_NAME",NSHTTPCookieName, @"COOKIE_VALUE",NSHTTPCookieValue,nil]]; [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
退出登录里为了,不受其他干扰,要清掉cookie
NSHTTPCookieStorage * myCookie = [NSHTTPCookieStorage sharedHTTPCookieStorage]; for (NSHTTPCookie * cookie in [myCookie cookies]) { [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie]; } NSString * path = NSHomeDirectory(); NSString * filePath = [path stringByAppendingPathComponent:@"/Library/Cookies/Cookies.binarycookies"]; NSFileManager * manager = [NSFileManager defaultManager]; [manager removeItemAtPath:filePath error:nil];
开始发起请求,附带上cookie去请求,伪装成特定User-Agent,referer等
NSURL * url = [NSURL URLWithString:@"http://mmmmm/login/Login.jsp"]; NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url]; NSArray * cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]; NSDictionary * headers = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies]; [request setValue:@"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36" forHTTPHeaderField:@"User-Agent"]; [request setValue:@"http://mmmmmm" forHTTPHeaderField:@"Origin"]; [request setValue:@"http://mmmmm/login/Login.jsp" forHTTPHeaderField:@"Referer"]; [request setHTTPMethod:@"GET"]; [request setHTTPShouldHandleCookies:YES]; [request setAllHTTPHeaderFields:headers];
如果要求在特定的网络环境下才能访问网址,就得处理判断了,当然这种情况下,只能受限了
NSString *ipString = [self deviceIPAdress][@"en1/ipv4"]; ipString = ipString ? ipString : [ self deviceIPAdress][@"en0/ipv4"]; if ([self canLoadNetFrom:ipString]) { [self.webView loadRequest:request]; } else { [SVProgressHUD showErrorWithStatus:@"当前网络环境不支持登录"]; }
更新:要切换不同账户密码怎么办,重新写程序?这里用Settings.bundle
然后直接用偏好去取就是了
NSUserDefaults *user = [NSUserDefaults standardUserDefaults]; NSString *accout = [user stringForKey:@"name_preference"]; NSString *psd = [user stringForKey:@"psd_preference"];