首页
学习
活动
专区
圈层
工具
发布

iOS WebView 的 Hybrid 框架设计

Cookie 和不能通过 NSURLProtocol 自定义请求等坑~导致 WKWebView 并没有被开发者大规模推荐使用。...本套框架的预加载和缓存模块儿需要借助 NSURLProtocol 实现,所以这里还是优先使用 UIWebView(想吐个槽,其实如果预加载和缓存这套系统做好以后,UIWebView 的效果并没不比 WKWebView...Bridge设计 Hybrid APP 的交互无非是 Native 调用前端页面的 JS 方法,或者前端页面通过 JS 调用 Native 提供的接口,两者交互的桥梁皆 Webview: ?...: 方法捕获,从而执行相应的操作,但是属于异步操作;还有一种前端可以通过 Ajax 发起 Bridge 请求,可以有同步异步两种方式,不过在 WebView 这层捕获不到此请求,只能通过 NSURLProtocol...hybrid_params={params need encode}&callback=callback_ID 客户端需要根据约定,在 Bridge 处理结束后通过 WebView window 对象中的

2K10

NSURLPtotocol 网络hooker

NSURLProtocol的作用 NSURLProtocol可以拦截监听每一个URL Loading System中发出request请求,记住是URL Loading System中那些类发出的请求,...忽略网络请求使用本地缓存 重定向网络请求 改变request的请求头 NSURLProtocol的使用 因为NSURLProtocol是一个虚基类,所以不能直接使用它,要想使用它就必须自定义一个类成为他的子类...相对应的也有unregistClass方法,不让某个子类起作用,这个起作用的时候并不是一定要在appDelegate中,你想要他在什么时候起作用,某个请求之前注册他就行,相应的不想他起作用就unregist...所以在我们startLoading里面,我们对这个request进行标记,标记他已经被处理过了,然后在canInitWithRequest方法中根据这个标记拿到这个request,如果被标记了,就不再次进行处理了...NSURLProtocolClient 如果我们使用UIWebView发送一个request,拦截以后当我们使用NSURLSession发出了request,那么这个request的response是无法回到这个

55620
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    NSURLProtocol 对 WKWebView 的处理

    各种 UIWebView 的问题没有了,速度更快了,占用内存少了,一句话,WKWebView 是 App 内部加载网页的最佳选择!...# WebKit 源码分析 由于 WKWebview 是基于 webkit 内核来做的,所以我们在使用的时候需要导入一个这样的东西。...拉下代码直接搜索 NSURLProtocol,看看有没有有关的信息 看来的确是有和 NSURLProtocol 有关系,后面通过断点的调用栈中也找到了 + [NSURLProtocol canInitWithRequest...:] 这样的字样,再通过网上查一些资料也证实了我的猜想,其实 WKWebview 在一开始时候是会调用到 NSURLProtocol 中的入口方法 canInitWithRequest 的,但是就没有然后了...webkit 注册 CustomScheme 的方法,只要我们在注册完我们自己的 CustomProtocol 之后在调用该方法应该就可以了。

    1.9K30

    有赞 App 如何实现动态域名

    作者:杨彬&李子 部门:社交电商 一、概述 在移动开发中,网络层面的监控一直是非常有必要的,比如统计网络接口的失败率、重定向网络请求、网络Request增加公共header头、实现动态域名等等。...请求开始,URL会加载系统创建的NSURLProtocol对象处理对应的URL请求,根据文档我们只需要创建一个子类继承自NSURLProtocol,通过registerClass:方法注册我们自定义的网络协议类...那么,我们需要解决的问题就是使用自定义的NSURLProtocol来处理App所有的网络请求,苹果官方文档中CustomHTTPProtocol介绍了如何自定义NSURLPtotocol来实现网络拦截。...3.1.7 实现NSURLSessionTaskDelegate 然后将自定义的protocol注册到NSURLProtocol中即可这样就可以拦截UIWebView和自定义的网络请求了,如果要拦截AFNetworking...以上就是自定义NSURLProtocol大体流程,配合上配置中心,我们就可以实现动态域名替换,当然你还可以做以下事情: 统计网络接口的失败率 重定向网络请求 自定义修改request 自定义返回网络请求的结果

    7.4K31

    H5秒开技术选型

    通过获取沙盒H5路径直接加载2. 基于NSURLProtocol进行请求拦截,实现预加载3. 基于WKURLSchemeHandler进行自定义scheme注册拦截,实现预加载4....基于NSURLProtocol进行请求拦截,实现预加载描述:在UIWebView上,创建个子类,在子类里面实现protocol的代理方法即可实现对所有请求的拦截。...拦截对css、js、img等资源加载的请求。优点:UIWebView原生支持缺点:WKWebView网络请求独立于主进程,NSURLProtocol无法拦截。...安卓不需要自定义,而且只能支持iOS11。4. 起本地服务器加载本地资源描述:如果本地有资源可以满足该请求的话,H5 容器会使用本地资源。 如果没有可以满足请求的本地资源,H5 容器会使用线上资源。...WebView(预加载了html),直接调用js设置页面内容通过js控制图片的显示,图片懒加载(当图片在可见区域或即将可见才会加载图片),点击加载图片等 Html中的图片通过ContentProvider

    1.6K40

    iOS小技能:UIWebView 被拒的解决方案(用更安全的WKWebView替代UIWebView)

    引言 背景:202012之后苹果将不接受使用UIWebView UIWebView 被拒的解决方案:使用WKWebView替代UIWebView 1、查 SDK是否用 UIWebView 的 API...2、移除/升级含UIWebView的第三方SDK(例:AFNetworking) 3、使用WKWebView替代UIWebView 4、WKWebView与JS交互案例(点击页面图片,调用iOS方法进行图片放大显示...更安全 基于NSURLProtocol实现iOS应用底层所有网络请求拦截(含网页ajax请求拦截【不支持WKWebView】NSURLProtocol 只能拦截 UIURLConnection、NSURLSession...1.2 移除/替换自己项目使用UIWebView API的代码 自己是否用了该 API 只需要在 Xcode 中全局搜索即可 II 升级包含UIWebView的第三方SDK的具体例子 pod...分类 新版本主要移除的类如下 处理afn的接口问题,老版本的post get formdata的请求形式在4.0都有了调整,因此需要更改工程中的相应的方法 例如 修改为: [manager

    3.9K20

    WKWebView 那些坑

    导语 WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用、内存泄漏的 UIWebView。...在一些用 webGL 渲染的复杂页面,使用 WKWebView 总体的内存占用(App Process Memory + Other Process Memory)不见得比 UIWebView 少很多。...3、WKWebView NSURLProtocol问题 WKWebView 在独立于 app 进程之外的进程中执行网络请求,请求数据不经过主进程,因此,在 WKWebView 上直接使用 NSURLProtocol...post 方式的请求可以通过 customScheme 发起请求,比如 dynamic://www.dynamicalbumlocalimage.com/,然后在 app 进程 NSURLProtocol...并使用 NSURLConnection 加载 request3,最后通过 NSURLProtocolClient 将加载结果返回 WKWebView; 5、WKWebView 页面样式问题 在 WKWebView

    5.5K130

    Hybrid App 应用 开发中 9 个必备知识点复习(WebView 调试 等)

    不过苹果在 iOS8 以后推出了 WKWebView 来加载 Web,并应用于 iOS 和 OSX 中,它取代了 UIWebView 和 WebView ,在两个平台上支持同一套 API。..., UIWebView 中限制了; WKWebView 目前缺少关于页码相关的 API; WKWebView 提供加载网页进度的属性; WKWebView 使用 Safari 相同的 JavaScript...WKWebView NSURLProtocol问题 WKWebView 在独立于 app 进程之外的进程中执行网络请求,请求数据不经过主进程,因此,在 WKWebView 上直接使用 NSURLProtocol...如果是用正常 HTTP 和 HTTPs 就是用 WKWebView 自带的拦截器,自定义协议用 NSURLProtocol 拦截。...于是我们找到了“为什么WebView总是很慢”的原因之一: 在浏览器中,我们输入地址时(甚至在之前),浏览器就可以开始加载页面。

    4.2K00

    iOS开发之NSURLProtocol的那些坑

    接触过iOS系统中URL Loading System都知道,NSURLProtocol是如此地强大,可以拦截应用内几乎所有的网络请求(除了WKWebView),并可以修改请求头,返回client任意自定义的数据等等...,NSURLProtocol对象在停止加载时调用该方法 + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request,可选方法...,对于需要修改请求头的请求在该方法中修改 下面代码定义了一个专门拦截https请求的NSURLProtocol子类,并通过CFHttpMessageRef重新请求 @interface CFHttpMessageURLProtocol...下面主要讲一下NSURLProtocol在使用过程中可能会遇到的坑,给自己以及需要的朋友留个提醒。 1....上面一开始就已经说了,对于WebView的请求,目前NSURLProtocol还不能拦截WKWebView的请求,只能拦截UIWebview的,但后者好像AppStore已经不让审核通过了(尴尬脸)。

    2.9K91

    网易严选的wkwebview测试之路

    app和web信息交换通道   允许JavaScript的Nitro库加载并使用,UIWebView中限制了   提供加载网页进度的属性(estimatedProgress)   将UIWebViewDelegate...  以前UIWebView会自动去NSHTTPCookieStorage中读取cookie,但是WKWebView并不会去读取,因此导致cookie丢失以及一系列问题,在测试的过程中我们发现在一个活动页面触发了登录之后...2、wkwebview的本地html页面加载失败   严选app内置了一份网络解决方案,如若检测到无网络状态可以查看这个本地页面进行网络的配置(主要是iOS10系统刚推出的时候,需要用户开启app启动网络的权限才能使用的问题...最后,WKWebView相较于UIWebView在整体上有较大的提升,满足OS上面使用同一套控件的功能,同时对整个内存的开销以及滚动刷新率和JS交互做了优化的处理。...而UIwebview可以让app对于H5容器使用NSURLProtocol技术将H5进行离线包的处理,H5的图片和Native的图片公用一套缓存,因此WKWebView是没有做缓存处理的,对网页需要缓存的加载性能要求没那么高的还是可以考虑

    2.1K10

    iOS小技能:【intercept the HTTPHTTPS requests 】利用NSURLProtocol 拦截请求

    前言 动手实践:写一个tweak ,修改请求的HTTPHeaderField NSURLProtocol 只能拦截 UIURLConnection、NSURLSession 和 UIWebView 中的请求...应用场景: 1、 自定义请求头的HTTPHeaderField 2、针对NSURLSessionConfiguration设置代理和端口,让一些特殊的请求走自定义的隧道IP和端口 I NSURLProtocol...HTTP 请求开始时,URL 加载系统创建一个合适的 NSURLProtocol 对象处理对应的 URL 请求,因此我们只需写一个继承自 NSURLProtocol 的类,并通过 - registerClass...: 方法注册我们的协议类,然后 URL 加载系统就会在请求发出时使用我们创建的协议对象对该请求进行处理。...方法中,可以修改 request headers NSURLProtocol 如何实例化?

    1.8K30

    IOS开发系列——UIWebView专题【整理,部分原创】

    等方法并不会被调用。...其解决方法需要Javascript和navtive code一起来做,其基本原理可参考这片文章,其流程是在Javascript handler中每创建Ajax的请求时,需要将这段js存在ajax_handler.js...http://blog.csdn.net/fengbingyang/article/details/7484453 方案一: 最近在使用ios中的UIWebView显示本地网页时,遇到如下问题:...UIWebView加载带有锚点的URL(如"file:///Users/admin/home.html#pos"),程序使用javascript的range.surroundContents方法在网页中为选中文字创建高亮标签...经过一番尝试,摸索出一种解决办法,具体如下: 在javascript代码的结尾部分添加一句kk="###"; 通过这样的尝试,成功让UIWebView不再跳转到初始加载位置。

    1.3K40

    【Hybrid】288- Hybrid App 应用开发中 9 个必备知识点复习

    不过苹果在 iOS8 以后推出了 WKWebView 来加载 Web,并应用于 iOS 和 OSX 中,它取代了 UIWebView 和 WebView ,在两个平台上支持同一套 API。...WKWebView 支持了更多的 HTML5 特性; WKWebView 高效的 app 和 web 信息交换通道; WKWebView 允许 JavaScript 的 Nitro 库加载并使用, UIWebView...WKWebView NSURLProtocol问题 WKWebView 在独立于 app 进程之外的进程中执行网络请求,请求数据不经过主进程,因此,在 WKWebView 上直接使用 NSURLProtocol...解决办法: 无奈之下,我们只能约定一个JS接口,让游戏开发商实现该接口,具体是通过 canvas getImageData()方法取得图片数据后返回 base64 格式的数据,客户端在需要截图的时候,调用这个...于是我们找到了“为什么WebView总是很慢”的原因之一: 在浏览器中,我们输入地址时(甚至在之前),浏览器就可以开始加载页面。

    3.3K20

    Hybrid App 应用开发中 9 个必备知识点复习

    不过苹果在 iOS8 以后推出了 WKWebView 来加载 Web,并应用于 iOS 和 OSX 中,它取代了 UIWebView 和 WebView ,在两个平台上支持同一套 API。...WKWebView 支持了更多的 HTML5 特性; WKWebView 高效的 app 和 web 信息交换通道; WKWebView 允许 JavaScript 的 Nitro 库加载并使用, UIWebView...WKWebView NSURLProtocol问题 WKWebView 在独立于 app 进程之外的进程中执行网络请求,请求数据不经过主进程,因此,在 WKWebView 上直接使用 NSURLProtocol...解决办法: 无奈之下,我们只能约定一个JS接口,让游戏开发商实现该接口,具体是通过 canvas getImageData()方法取得图片数据后返回 base64 格式的数据,客户端在需要截图的时候,调用这个...于是我们找到了“为什么WebView总是很慢”的原因之一: 在浏览器中,我们输入地址时(甚至在之前),浏览器就可以开始加载页面。

    3.2K30

    Hybrid App 应用开发中 9 个必备知识点复习

    不过苹果在 iOS8 以后推出了 WKWebView 来加载 Web,并应用于 iOS 和 OSX 中,它取代了 UIWebView 和 WebView ,在两个平台上支持同一套 API。...UIWebView 中限制了; WKWebView 目前缺少关于页码相关的 API; WKWebView 提供加载网页进度的属性; WKWebView 使用 Safari 相同的 JavaScript...WKWebView NSURLProtocol问题 WKWebView 在独立于 app 进程之外的进程中执行网络请求,请求数据不经过主进程,因此,在 WKWebView 上直接使用 NSURLProtocol...于是我们找到了“为什么WebView总是很慢”的原因之一: 在浏览器中,我们输入地址时(甚至在之前),浏览器就可以开始加载页面。...4. debugger 断点 具体的说就是通过在代码中添加" debugger;"语句,当代码执行到该语句的时候就会自动断点。

    3.6K20

    【IOS开发基础系列】UIWebView专题

    交互 2.1 WebView中使用Ajax 2.1.1 实现机制         Hybrid框架下的app,使用的Ajax,需要注意的是UIWebViewDelegate不会监测到Ajax的request...,也就是再执行Ajax代码时,shouldStartLoadWithReuqest等方法并不会被调用。         ...其解决方法需要Javascript和navtive code一起来做,其基本原理可参考这片文章,其流程是在Javascript handler中每创建Ajax的请求时,需要将这段js存在ajax_handler.js...http://blog.csdn.net/fengbingyang/article/details/7484453     方案一:         最近在使用ios中的UIWebView显示本地网页时...经过一番尝试,摸索出一种解决办法,具体如下:         在javascript代码的结尾部分添加一句location.href="###";         通过这样的尝试,成功让UIWebView

    78730

    技术 | Hybrid载体的变化(一)

    当然随之而来的会有一些小问题,比如:WKWebView是一个独立进程,那么它的请求就无法通过系统的URL SYSTEM了,你无法像UIWebView一样,可以通过NSURLProtocol来拦截所有的请求...在初始化WKWebView时你还需要配置一个Conf,这个Conf中你可以添加一个属性,这个属性在JavaScript这一边你可以通过window.webkit.messageHandlers.icepyApp...icepyApp"); self.wkWebView = WKWebView(frame: self.view.frame, configuration: config) 最终当你需要向Native发送消息时就需要使用这个属性并调用其..., withError error: Error) { // 页面加载错误 print(error) } 每一个delegate实现中你都应该去做一条日志的记录或者是页面加载完成时间...,客户端这边从页面加载完成开始计时,选择一个你认为比较合理的渲染时间,当Web报时大于它时,肯定渲染就不符合预期,这个时候,你还需要从另外的角度去分析问题了,我的建议是使用performance再加上DOM

    1.1K30

    一个 Hybrid SDK 设计与实现

    Native 的能力 ◆ Api 交互 调用 Native Api 接口的方式和使用传统的 Ajax 调用服务器,或者 Native 的网络请求提供的接口相似 ?...,在H5站点下使用ajax请求,在Native内嵌时使用代理发出,与Native的约定为 requestHybrid({ tagname: 'NativeRequest', param: {...当用户在弱网络或者网速比较差的环境下,这个加载时间会很长。于是我们通过离线预推的方式,把页面的资源提前拉取到本地,当用户加载资源的时候,相当于从本地加载,即使没有网络,也能展示首屏页面。...拦截加载 事实上,在高度定制的 wap 页面场景下,我们对于 webview 中可能出现的页面类型会进行严格控制。...WKWebView 网络请求拦截 方法一(Native 侧): 原生 WKWebView 在独立于 app 进程之外的进程中执行网络请求,请求数据不经过主进程,因此在 WKWebView 上直接使用 NSURLProtocol

    1.7K10

    iOS下JS与OC互相调用(一)--UIWebView 拦截URL

    因为就相互调用的接口使用的非常少啊,就那么三两个,完全没必要使用牛刀啊。 ? UIWebView 拦截URL 我之前就使用的是UIWebView + 拦截URL 的方式实现的JS与OC 交互。...1.创建UIWebView,并加载本地HTML。 加载本地HTML的目的是便于自己写JS调用做测试,最终肯定还是加载网络HTML。...答:因为如果当前网页正使用window.location.href加载网页的同时,调用window.location.href去调用OC原生方法,会导致加载网页的操作被取消掉。...答:便于在OC 中做拦截处理,减少在JS中调用一些OC 没有实现的方法时,webView 做跳转。...所有的参数都在URL的query中,先通过&将字符串拆分,在通过=把参数拆分成key 和实际的值。

    4.3K40
    领券