WKWebView或UIWebView无法拦截的页面地址变更问题 待续...

最近比较忙,只是以帖代码为主,后续会增加说明。
大家有没有发现微信端的js代码移植到ios app上,当点击js上的按钮跳转到页面,咱们的WKWebView或UIWebView无法拦截到这个地址的变更。
当h5页面的第一页面为下面的地址:http://test/market/homepage.htm,当点击他们上的按钮跳转到一个新的网页地址(https://test/market/homepage.htm#!/https://test/market/auction/detail.htm?aId=12)并刷新页面,而UIWebView的页面加载完回调函数(-(void)webViewDidFinishLoad:(UIWebView )webView)和加载前函数(-(BOOL)webView:(UIWebView )webView shouldStartLoadWithRequest:(nonnull NSURLRequest )request navigationType:(UIWebViewNavigationType)navigationType)没有任何回调;同样WKWebView的页面加载完回调函数(-(void)webView:(WKWebView )webView didFinishNavigation:(WKNavigation )navigation)和服务器开始请求的时候调用回调函数(- (void)webView:(WKWebView )webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler)没有任何回调。我把这两个控件的所有协议函数都实现也没有看到它回调他们,并且连WKWebView的进度条 KVO监听函数也没有回调,导致页面跳转时没有显示进度条。
我研究了两天发现,无语了,WKWebView或UIWebView根本根本无法监控到这种页面的变化。经过分析可能是页面被替换时,可能是os系统可能比较两者的地址是否互相以其中一个为前缀,若是就不回调。
但是我们的需求是要监控到这种页面变更,若是几个指定的首页页面不能显示返回按钮,若不是首页的页面请求需要显示返回按钮。
最好真的办法了,最终通过监控页面的变化来查看当前页面url来决定是否显示返回按钮。WKWebView的self.wkWebView.backForwardList.currentItem就是当前页面,这个地址:NSString *url = [currentItem.URL.absoluteString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];就是当前页面具体地址。
backForwardList是可以返回的页面请求地址。不过最好别直接读这个数组,或算它的个数。因为页面变化时,这个数组会变化的。大家知道,当一个可变数组正变化时,另一个线程计算它的个数可能引起crash.
问题是何时去读区当前页面的地址呢?由于WKWebView有一个成员对象scrollView,而UIScrollView的contentSize属性是可以通过KVO监控的。我们采用的响应式编程ReactiveCocoa这个库,通过这段代码监控页面尺寸的变化:

    [RACObserve(self.wkWebView.scrollView, contentSize) subscribeNext:^(id x) {
        @strongify(self);
        NSLog(@"xxxxxx:%@, nowTime:%lld毫秒", x, (long long)([[NSDate date] timeIntervalSince1970]*1000));
        [self updateNavigationItems];
    }];

大家可以看到只要页面地址变化,这个KVO都能监控到,当然有的js页面是不断刷新的,这个KVO也能监控到,这个频率不是一般的快,大约20毫秒左右就会出现一次页面尺寸的变化,当然有的页面加载完成后变化几次就不会引起页面尺寸的变化了。页面变化那么快,也就是手机打开网页,电量下降飞快的原因吧?

2018-05-31 17:19:26.114506+0800 ArtEnjoymentWeChatAuction[61101:5370688] xxxxxx:NSSize: {320, 504}, nowTime:1527758366114毫秒
2018-05-31 17:19:26.114783+0800 ArtEnjoymentWeChatAuction[61101:5370688] current url:https://test/market/homepage.htm
2018-05-31 17:19:26.122076+0800 ArtEnjoymentWeChatAuction[61101:5370688] xxxxxx:NSSize: {320, 504}, nowTime:1527758366121毫秒
2018-05-31 17:19:26.122325+0800 ArtEnjoymentWeChatAuction[61101:5370688] current url:https://test/market/homepage.htm
2018-05-31 17:19:26.148894+0800 ArtEnjoymentWeChatAuction[61101:5370688] xxxxxx:NSSize: {320, 504}, nowTime:1527758366148毫秒
2018-05-31 17:19:26.149110+0800 ArtEnjoymentWeChatAuction[61101:5370688] current url:https://test/market/homepage.htm

根据这个KVO更新返回按钮的隐藏属性就可以。

-(void)updateNavigationItems{
    WKBackForwardListItem *currentItem = self.wkWebView.backForwardList.currentItem;
    NSString *url = [currentItem.URL.absoluteString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"current url:%@", url);
    self.navigationItem.leftBarButtonItem.customView.hidden = [self isHiddenWebBackButton:url];
}

-(BOOL)isHiddenWebBackButton:(NSString *)reqUrl
{
    if(isEmptyString(reqUrl))
    {
        return YES;
    }
    if(([reqUrl rangeOfString:homepageHtml].location != NSNotFound) && ([reqUrl rangeOfString:homepageExtendHtml].location == NSNotFound))
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

具体代码见:https://blog.csdn.net/jia12216/article/details/80526133
用loadWebURLSring在跳转到这个h5页面是加载远程js代码或在viewDidLoad加载也可以,替换加载本地代码的方式。

猜你喜欢

转载自blog.csdn.net/jia12216/article/details/80527509