进来做项目,我们项目要求的是加载本地网页。之前接触最多的是加载url的方式加载网页,优先也会选择WKWebview。现在加载本地网页,查了查WKWebview加载本地网页好像有啥影响,具体忘了!!于是开启了UIWebview的慢慢长征,以至于我在UIWebview 和WKWebview之间艰难的踩坑。
以下是加载本地网页遇到的一些雷!!!!
1.<input type=file>
web端调起原生相册,web端无论怎么设置都是多选。 如果用户多选很多的话还会导致卡死
尝试了很多方法,无法解决,最后换了WKWebview(可以设置单选和多选。默认单选)
2.display:flex
UIWebview上使用这个弹性布局在iOS11以下都无法对齐 搜了很多方法 什么轴啊 加什么适配浏览器的属性啊 全无效 最后写死坐标了 WKWebview暂无试
3.UIWebview上进行输入的时候 超过三行就开始屏幕抖动 英文好像没事 9宫格输入就有问题 妈的 搜了好多解决方案 暂时无效 WKWebview就没事
4.'时间2017-02-01 13:28 转时间戳'
2017-02-01 13:28 这种横杠的时间戳无法比较大小(开始时间不能大于结束时间)
最后用正则用 将“-”变成 “/” 在进行对比就可以了
5.UIWebview
原生给web传参数 //native ->js(<=2参数),
例子: NSString *report = [selfWeak.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"showInfoFromIos(\"%@\",\"%@\")", companyId,loginName]]; //showInfoFromIos(和web端定义的方法名)
[selfWeak.webView stringByEvaluatingJavaScriptFromString:report];
//json字符串('%@')这样写,普通字符串(\"%@\")这样写
例子 : NSString *report3 = [selfWeak.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"showReportFromJs('%@')", msg]]; //showReportFromJs(和web端定义的方法名)
[selfWeak.webView stringByEvaluatingJavaScriptFromString:report];
6.WKWebview
使用WKWebview和UIWebview时,无论是native ->js还是js ->native,web端的写法都不一样了。
例如使用WKWebview,js ->native,web 端的写法
window.webkit.messageHandlers.<方法名>.postMessage(<数据>)
// native调用js方法传递参数
例子: NSString*JSResult = [NSStringstringWithFormat:@"updateHeadImg(\"%@\")",base64String0];
[self.wkwebViewevaluateJavaScript:JSResultcompletionHandler:^(id_Nullableresult,NSError*_Nullableerror) {
NSLog(@"%@", error);//error为空时传递成功
}];
详细写法可以问度娘,这里就不多说了!!!
8.页面消失的时候,一定要清除缓存,不然查看图层,你会发现你加载了好多层网页,你的内存也会飙升呦!!!
例子:-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[[NSURLCache sharedURLCache] removeAllCachedResponses];
}
9.精准获取webView内容高度,自适应高度
项目中需要高度自适应,为了获得较准确的高度,试了几种方法;
其中一种是,在webView的回调方法webViewDidFinishLoad中获取网页内容高度,设置为webView的高度;问题来了,无论是JS获取,还是contentSize获取,最后结果都难以获取到准确高度,原因(webViewDidFinishLoad代理方法被调用时,页面并不一定完全展现完成,可能有图片还未加载出来,导致此时获取的高度是偏小的,过会儿图片加载出来后,浏览器会重新排版网页被撑大,而我们之前给的高度不够内容的展示,导致显示异常)
最后的终极有效办法
给webView的scrollView的contentSize属性添加监听,每当内容发生变化,contentSize一定会跟着变,捕获这个变动,在监听方法中实现webViewDidFinishLoad中的代码,也就是获取最新的内容高度赋给webView:
[self.webView.scrollView addObserver:self forKeyPath:@"contentSize" options: NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context
{
self.webView.height = self.webView.scrollView.contentSize.height;
}
- (void)dealloc{
//移除观察者
[self.webView.scrollView removeObserver:self forKeyPath:@"contentSize"];
}
好了,加载本地网页遇到雷大概基本这些,如果你有更多欢迎贴出来探讨。最后还要补充一下,加载url的方式加载网页,无论是UIWebview 还是WKWebview,很少出现这些乱七八遭不兼容的问题,页面布局错乱的问题,只不过WKWebview 性能较好,还是偏向WKWebview。
网友评论