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

匿名 (未验证) 提交于 2019-12-03 00:22:01

最近比较忙,只是以帖代码为主,后续会增加说明。
大家有没有发现微信端的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加载也可以,替换加载本地代码的方式。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!