UIWebView JS注入
@property (weak, nonatomic) IBOutlet UIWebView *webView;
/*
一 .JS注入 : 把JS代码通过UIWebView的代理方法作为桥梁,注入到网页
1.步骤 :
1.1 确定要优化的地方
1.2 获取到优化界面的JS代码,如果自己会写就自己写,不会写就找前端"乞求"
1.3 找到对应的UIWebView的代理方法,调用系统提供的JS注入的方法,注入JS即可
二 .网页和苹果原生界面交互
1.步骤
1.1 需要使标签可点击 (JS注入点击事件,需要主动发送请求,自定义URL,用于拦截)
1.2 需要监听标签的点击 (shouldStartLoadWithRequest)
1.3 需要区分点击的标签是哪个 (拦截的请求地址和自定义URL对比)
1.4 根据不同的点击的标签跳转到不同的原生控制器
*/
- (void)viewDidLoad {
[super viewDidLoad];
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://m.dianping.com/tuan/deal/5501525"]]];
// 设置代理
self.webView.delegate = self;
}
/// 即将开始加载时调用的 : 拦截到网页上的所有的网络请求,监听网页的请求
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
// request : 就是监听/拦截到的网页的请求(window.location.href : 是在主动发送网络请求)
NSString *URLString = request.URL.absoluteString;
NSLog(@"拦截 %@",URLString);
if ([URLString isEqualToString:@"hm://www.yaowoya.com"]) {
[self.navigationController pushViewController:[TestViewController new] animated:YES];
return NO; // hm://www.yaowoya.com 没有数据,不要再尝试去加载,浪费流量
}
return YES; // 表示展示拦截到的请求对应的数据
// return NO; // 表示不展示拦截到的请求对应的数据
}
/// 加载完成时调用的 : 一般做"JS注入"
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSMutableString *stringM = [NSMutableString string];
// 拼接移除导航的JS代码
[stringM appendString:@"var headerTag = document.getElementsByTagName('header')[0];headerTag.parentNode.removeChild(headerTag);"];
// 拼接移除橙色按钮的JS代码
[stringM appendString:@"var fixTag = document.getElementsByClassName('footer-btn-fix')[0];fixTag.parentNode.removeChild(fixTag);"];
// 拼接移除底部的JS代码
[stringM appendString:@"var footerTag = document.getElementsByClassName('footer')[0];footerTag.parentNode.removeChild(footerTag);"];
// 给标签添加点击事件
[stringM appendString:@"var buytag = document.getElementsByClassName('buy-btn btn-gray')[0];buytag.onclick = function buytagClick() {window.location.href = 'hm://www.yaowoya.com'};"];
// JS注入的方法
[webView stringByEvaluatingJavaScriptFromString:stringM];
}