ios wkwebview的代理啊方法执行多次问题

本文探讨了在iOS开发中使用UIWebView时遇到的问题,特别是针对同一个UIViewController重复实例化来展示不同H5界面的情况。文章详细分析了-(void)webViewDidFinishLoad代理方法被多次调用的原因,并给出了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天帮别人调试程序,由于程序中大部分都是H5界面,所以采用UIViewController上放UIVebView的方式来实现。比较纠结的地方是所有的vc都是同一个, 只是实例化出很多对象,可能是为了简化代码,但是在类里就需要写很多if...else来判断不同场景,个人是不喜欢这样写,感觉太冗余了不如写一个基类,然后继承来的方便。

在调试过程中,点击页面上一个按钮发现 - (void)webViewDidFinishLoad:(UIWebView *)webView 加载了很多次,在网上查了很多资料,发现如果网页内有异步请求或者重定向时,就会多次调用上述方法。 - (void)webViewDidFinishLoad:(UIWebView *)webView{ if (webView.isLoading) { return; } // This is your code. }

后来通过查看Html文件发现里面使用了<iFrame></iFrame>标签,从而导致了UIWebView 的四个代理方法又重新加载了一次。所以如果有在 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType(UIWebViewNavigationType)navigationType 方法里有特殊操作的就需要注意了。

作者:z_hy 链接:http://www.jianshu.com/p/db627431dd5e 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
<think>好的,我现在需要回答用户关于UC浏览器在搜索时前端和后端如何交互,特别是客户端如何与前端交互的问题。首先,我得回顾一下自己了解的浏览器工作原理,尤其是移动浏览器如UC的情况。 用户提到的是搜索时的情况,也就是当用户在UC浏览器中输入关键词并执行搜索后,前端利用后端返回的数据进行模板渲染,然后客户端如何与前端交互。我的理解是,这里可能涉及到前后端的数据传输、渲染机制以及客户端(比如手机上的UC浏览器应用)如何处理这些数据并展示给用户。 首先,我需要明确几个关键点:前端通常指浏览器中负责展示的部分,后端是处理请求和数据的服务器,而客户端在这里应该指的是用户设备上安装的UC浏览器应用。用户的问题核心在于,当搜索发生时,客户端(应用)如何与前端(可能指浏览器内渲染的页面或应用内的WebView)进行交互。 接下来,我需要考虑UC浏览器可能的架构。移动浏览器通常有两种方式处理网页:一种是传统的WebView渲染,另一种是可能的内置优化机制,比如预加载、数据压缩等。UC浏览器以省流量和快速加载著称,可能在后端先对网页进行处理,提取主要内容,再返回给客户端渲染。 对于搜索过程,可能的步骤是: 1. 用户在客户端输入搜索关键词,触发搜索请求。 2. 客户端将请求发送到UC的后端服务器。 3. 后端服务器处理请求,可能向搜索引擎(如Google、百度)发送请求,获取搜索结果。 4. UC后端对获取的原始搜索结果进行处理,比如提取文本、图片优化、广告过滤等,生成结构化的数据(可能是JSON格式)。 5. 处理后的数据返回给客户端。 6. 客户端(应用内的WebView或原生组件)根据这些数据使用模板进行渲染,展示给用户。 这里的关键点在于第6步,客户端如何将后端返回的数据渲染成用户可见的页面。如果是WebView,可能需要加载一个本地HTML模板,然后将数据注入到模板中动态生成页面。如果是原生组件(如Android的RecyclerView或iOS的UITableView),则可能需要解析数据并填充到预先设计好的UI组件中。 另外,UC浏览器可能有自己的渲染引擎优化,或者使用系统自带的WebView(如Chrome的Blink或WKWebView)。在数据传输方面,可能采用压缩技术减少流量,比如服务器返回的数据是经过精简的结构化数据,而不是完整的HTML页面,这样客户端可以更快地解析和渲染。 需要验证的细节包括:UC是否在客户端使用原生组件渲染搜索结果,还是依赖于Web技术(HTML/CSS/JS)。如果是后者,那么客户端中的WebView会负责渲染;如果是前者,客户端需要将数据绑定到原生UI组件上。不同的实现方式会影响交互的具体流程。 此外,客户端与前端交互可能还涉及用户的操作响应,比如点击搜索结果后,客户端如何处理导航。可能的情况是,客户端拦截点击事件,先通过后端服务器获取目标页面的优化内容,再渲染,而不是直接跳转到目标网站,这样可以保持流量节省和速度优化。 总结一下,可能的交互流程是: - 用户输入触发客户端发送请求到UC后端。 - 后端处理并返回结构化数据。 - 客户端根据数据渲染页面(WebView或原生UI)。 - 用户交互由客户端处理,可能再次与后端通信获取更多数据。 需要确认是否有更多的步骤或不同的技术实现,比如是否使用Service Worker进行缓存,或者是否有预加载机制在用户输入时提前获取数据。不过,根据UC的特点,重点可能在于后端数据处理和客户端的高效渲染,减少不必要的数据传输。</think>UC浏览器在搜索时客户端与前端的交互流程可以分为以下几个步骤,结合其省流量和快速渲染的特点,具体机制如下: 1. **用户触发搜索**: - 用户在搜索框输入关键词后,UC客户端(移动应用)会捕获输入事件,可能伴随关键词预判(如联想建议)。 2. **请求发送与后端处理**: - 客户端将搜索关键词发送至UC专用代理服务器(而非直接请求原始搜索引擎)。 - 后端服务器执行多级处理: - **内容抓取**:向目标搜索引擎(如百度/Google)发起请求获取原始HTML。 - **数据清洗**:移除广告、冗余脚本等无关内容,提取核心文本/图片。 - **结构化处理**:将内容转换为轻量级数据格式(如JSON),包含标题、摘要、链接等字段。 3. **数据传输优化**: - 采用压缩算法(如自研U3内核的压缩技术)减小数据包体积。 - 可能对图片进行转码降低分辨率,进一步节省流量。 4. **客户端渲染机制**: - **混合渲染模式**: - *WebView渲染*:若页面复杂度高,客户端将结构化数据注入预置HTML模板,通过内置精简版Web引擎渲染。 - *原生组件渲染*:对搜索结果列表等高频交互部分,可能使用Native UI组件(如Android的RecyclerView)直接渲染,提升滑动流畅度。 - **模板预置策略**: - 常见搜索结果的UI模板已预装在客户端,避免重复下载,仅动态填充数据。 5. **交互事件处理**: - 用户点击搜索结果时,客户端拦截跳转请求,优先向UC服务器请求目标页面的优化内容。 - 实现"二次加速":服务器返回优化后的页面数据,客户端再次渲染,而非直接加载原始网页。 6. **缓存与预加载**: - 历史搜索结果的模板和数据可能缓存在本地,减少重复请求。 - 根据用户行为预测预加载下一页内容(如滑动至列表底部时自动加载)。 **技术亮点解析**: - **流量节省**:据公开数据,UC的后端处理可使页面数据量减少达90%。例如原始网页1MB,经处理后仅传输100KB结构化数据。 - **渲染加速**:Native+Web混合渲染使首屏呈现时间比传统浏览器快30%-50%。 - **协议优化**:可能使用私有协议代替HTTP,减少Header开销,提升数据传输效率。 **示例流程**: ``` 用户搜索"量子计算" → 客户端发送加密请求至UC服务器 → 服务器获取百度结果并提取核心内容 → 返回JSON数据{title:"...", snippet:"...", img:"base64..."} → 客户端匹配新闻卡片模板渲染 → 用户看到精简排版的结果列表 ``` 这种架构使UC在弱网环境下仍能快速呈现可读内容,同时大幅降低流量消耗,特别适合移动网络场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值