美文网首页Cocoa
iOS 中的 UIWebView、WKWebView、NSURL

iOS 中的 UIWebView、WKWebView、NSURL

作者: 望穿秋水小作坊 | 来源:发表于2021-07-28 08:42 被阅读0次

    一、Native 开发中为什么需要 H5 容器

    1. Native 开发的优点(至少说两点)?

    • 可以直接调用各个平台的系统 API
    • 体验较好,一般而言性能较高

    2. Native 开发的缺点(至少说两点)?

    • 需要各个平台编写对应的代码,基本不能共用代码
    • 有bug或需求都要通过发版解决,发版周期比较长

    3. H5 开发模式的优点?

    • 灵活性强,服务端可以随时对 H5 的内容进行修改。
    • 一套代码解决多端

    4. H5 开发模式的缺点?

    • 每次都需要下载完整的 UI 数据(html、css、js),弱网用户体验较差,流量消耗较大
    • 无法调用系统文件系统,硬件资源等等。

    二、UIWebView/WKWebView/NSURLProtocol

    1. UIWebView/WKWebView的基本用法

    2. NSURLProtocol 的基本用法

    3. UIWebView 对比 WKWebView 说几句?

    • WKWebView与UIWebView相比较,拥有更快的加载速度和性能,更低的内存占用
    • 将UIWebViewDelegate和UIWebView重构成了14个类,3个协议,可以让开发者进行更加细致的配置
    • WKWebView他有一个最致命的缺陷,就是WKWebView的请求不能被NSURLProtocol截获。而我们团队开发的app中对于H5容器最佳的优化点主要就在于使用NSURLProtocol技术对于H5进行离线包的处理和H5的图片和Native的图片公用一套缓存的技术。

    4. NSURLProtocol 能拦截哪些请求?

    • 不能拦截:WKWebView的所有请求
    • 不能拦截:早些年基于 CFNetwork 实现的,比如 ASIHTTPRequest,其网络请求就无法被拦截
    • 除了上面两点之外的几乎所有请求,都能拦截。包括 AFN 和 Alamofire 等等网络请求。

    5. NSURLProtocol 对于能拦截的请求,能做些什么事情?

    • 重定向网络请求,解决 DNS 域名劫持的问题
    • 进行全局或局部的网络请求设置,比如修改请求地址、header 等
    • 忽略网络请求,使用 H5 离线包或是缓存数据等
    • 自定义网络请求的返回结果,比如过滤敏感信息

    6. 如何拦截 WKWebView

    虽然 NSURLProtocol 无法直接拦截 WKWebView,但其实还是有解决方案的。就是使用 WKBrowsingContextController 和 registerSchemeForCustomProtocol。

    // 注册 scheme
    Class cls = NSClassFromString(@"WKBrowsingContextController");
    SEL sel = NSSelectorFromString(@"registerSchemeForCustomProtocol:");
    if ([cls respondsToSelector:sel]) {
        // 通过 http 和 https 的请求,同理可通过其他的 Scheme 但是要满足 URL Loading System
        [cls performSelector:sel withObject:@"http"];
        [cls performSelector:sel withObject:@"https"];
    }
    

    但由于这涉及到了私有方法,直接引用无法过苹果的机审,所以使用的时候需要对字符串做下处理,比如对方法名进行算法加密处理等,实测也是可以通过审核的。

    三、WKWebView 的离线包

    四、webView 的 cookie 问题

    相关文章

      网友评论

        本文标题:iOS 中的 UIWebView、WKWebView、NSURL

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