美文网首页程序员webview
iOS 在UIWebview 和WKWebview之间艰难的踩坑

iOS 在UIWebview 和WKWebview之间艰难的踩坑

作者: Peanut_S1 | 来源:发表于2018-06-13 14:17 被阅读14次

    进来做项目,我们项目要求的是加载本地网页。之前接触最多的是加载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。

    相关文章

      网友评论

        本文标题:iOS 在UIWebview 和WKWebview之间艰难的踩坑

        本文链接:https://www.haomeiwen.com/subject/xxzdeftx.html