WKWebView

来源:互联网 发布:linux 如何查看nat 编辑:程序博客网 时间:2024/06/05 20:05


#import <WebKit/WebKit.h>


@interface ViewController () <WKNavigationDelegate>


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    // 展示webView

    WKWebView *webView = [[WKWebView allocinitWithFrame:[UIScreen mainScreen].bounds];

    [self.view addSubview:webView];

    

    // 加载数据

    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://m.dianping.com/tuan/deal/5501525"]]];

    

    // 设置代理

    webView.navigationDelegate = self;

    

    // 使用KVO监听网页加载进度 : KVO属于观察者模式的这一种,一般用来监听某个"对象"的某个"属性"是否发生了变化

    /*

     1.Observer : 观察者

     2.forKeyPath : 要监听/观察的属性

     3.options : 观察选项,设置观察的结果是得到新值还是旧值

     

     语义 : 让当前的`ViewController`,监听`webView`的属性`estimatedProgress`新值的变化

     */

    [webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];

}


/// 实现观察结果的回调的方法 : KVO监听到变化后自动执行的回调/方法,在监听进度时,调用非常频繁的

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {

    // keyPath : 监听的属性; object : 观察者; change : 属性的新值和旧值(重要)

    

    // 获取进度

//    float progress = [change[@"new"] floatValue];

    float progress = [change[NSKeyValueChangeNewKeyfloatValue];

    NSLog(@"进度 %f",progress);

}


/// 网页即将开始加载时调用的

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {

    // 获取拦截到的请求地址

    NSString *URLString = navigationAction.request.URL.absoluteString;

    NSLog(@"拦截 %@",URLString);

    

    if ([URLString isEqualToString:@"hm://www.yaowoya.com"]) {

        NSLog(@"点击了'已结束'标签");

    }

    

    // decisionHandler : 等价于 UIWebView里面的return YES/NO;

    decisionHandler(WKNavigationActionPolicyAllow); // 允许加载数据

    // decisionHandler(WKNavigationActionPolicyCancel); // 不允许加载数据

}


/// 网页加载结束后调用的 : JS注入地方之一

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {

    

    NSMutableString *stringM = [NSMutableString string];

    

    // 移除导航

    [stringM appendString:@"var headerTag = document.getElementsByTagName('header')[0];headerTag.parentNode.removeChild(headerTag);"];

    // 移除橙色按钮

    [stringM appendString:@"var fixTag = document.getElementsByClassName('footer-btn-fix')[0];fixTag.parentNode.removeChild(fixTag);"];

    // 移除网页底部

    [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 evaluateJavaScript:stringM completionHandler:nil];

}