首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

NSURLProtocol 对 WKWebView 的处理

之前写过一篇文章是关于基于 NSURLProtocol 做的 DNS 解析,其中对 NSURLProtocol 也有了简单的介绍,我们都知道他可以拦截所有基于 URL Loading System 中的请求...拉下代码直接搜索 NSURLProtocol,看看有没有有关的信息 看来的确是有和 NSURLProtocol 有关系,后面通过断点的调用栈中也找到了 + [NSURLProtocol canInitWithRequest...:] 这样的字样,再通过网上查一些资料也证实了我的猜想,其实 WKWebview 在一开始时候是会调用到 NSURLProtocol 中的入口方法 canInitWithRequest 的,但是就没有然后了...,也就是说 WKWebview 是和 NSURLProtocol 有一定关联,只是在 NSURLProtocol 的入口处返回 NO 所以导致 NSURLProtocol 不接管 WKWebview 的请求...关于 post 请求 大家会发现拦截不了 post 请求 (拦截到的 post 请求 body 体为空),这个其实和 WKWebview 没有关系,这个是苹果为了提高效率加快流畅度所以在 NSURLProtocol

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

    WKWebView 那些坑

    简单的适配方法本文不再赘述,主要来说说适配 WKWebView 过程中填过的坑以及善待解决的技术难题。...WKWebView Cookie 问题在于 WKWebView 发起的请求不会自动带上存储于 NSHTTPCookieStorage 容器中的 Cookie。...3、WKWebView NSURLProtocol问题 WKWebView 在独立于 app 进程之外的进程中执行网络请求,请求数据不经过主进程,因此,在 WKWebView 上直接使用 NSURLProtocol...http(s)请求都会通过 IPC 传给主进程 NSURLProtocol 处理,导致 post 请求 body 被清空; b、对ATS支持不足 测试发现一旦打开ATS开关:Allow Arbitrary...request3 的 body 中,并使用 NSURLConnection 加载 request3,最后通过 NSURLProtocolClient 将加载结果返回 WKWebView; 5、WKWebView

    4.7K130

    iOS开发之NSURLProtocol的那些坑

    接触过iOS系统中URL Loading System都知道,NSURLProtocol是如此地强大,可以拦截应用内几乎所有的网络请求(除了WKWebView),并可以修改请求头,返回client任意自定义的数据等等...下面主要讲一下NSURLProtocol在使用过程中可能会遇到的坑,给自己以及需要的朋友留个提醒。 1....上面一开始就已经说了,对于WebView的请求,目前NSURLProtocol还不能拦截WKWebView的请求,只能拦截UIWebview的,但后者好像AppStore已经不让审核通过了(尴尬脸)。...NSURLProtocol在拦截NSURLSession的POST请求时不能获取到Request中的HTTPBody,这个貌似早就国外的论坛上传开了,但国内好像还鲜有人知,据苹果官方的解释是Body是NSData...为了解决这个问题,我们可以通过把Body数据放到Header中,不过Header的大小好像是有限制的,我试过2M是没有问题,不过超过10M就直接Request timeout了。。。

    2.6K91

    H5秒开技术选型

    基于NSURLProtocol进行请求拦截,实现预加载3. 基于WKURLSchemeHandler进行自定义scheme注册拦截,实现预加载4....基于NSURLProtocol进行请求拦截,实现预加载描述:在UIWebView上,创建个子类,在子类里面实现protocol的代理方法即可实现对所有请求的拦截。...拦截对css、js、img等资源加载的请求。优点:UIWebView原生支持缺点:WKWebView网络请求独立于主进程,NSURLProtocol无法拦截。...优点:WKWebView原生支持缺点:需要改造前端页面,替换为customScheme。安卓不需要自定义,而且只能支持iOS11。4....WebView(预加载了html),直接调用js设置页面内容通过js控制图片的显示,图片懒加载(当图片在可见区域或即将可见才会加载图片),点击加载图片等 Html中的图片通过ContentProvider

    1.2K40

    iOS WKWebView设置cookie方法总结

    这个问题首先你要明白,WKWebView有自己的进程,使用自己的存储空间来存储cookie和cache,WKWebView会忽视NSURLCache、NSHTTPCookieStorage、NSCredentialStorage...同时WKWebView发起的资源请求也是不经过NSURLProtocol的,导致无法自定义请求。...让WKWebview支持NSURLProtocol可参考:NSURLProtocol对WKWebView的处理 所以这里应该很清楚,NSHTTPCookieStorage已经用不到了,但是你可以把他作为存储...我自己的项目里面已经全部删除了它的使用 第一种:通过NSMutableURLRequest设置cookie(js开发的不推荐) 以我项目为例,这种方法设置的cookie,不能被js读取到,在浏览器调试中也不能看到...所以cookie中尽量设置一些无关紧要的参数,或者就尽量不去使用。 毕竟cookie这个坑,踩起来难受!!! 个人不推荐使用Cookie!

    6.3K31

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

    前言 动手实践:写一个tweak ,修改请求的HTTPHeaderField NSURLProtocol 只能拦截 UIURLConnection、NSURLSession 和 UIWebView 中的请求...; 对于 WKWebView 中发出的网络请求也无能为力,如果真的要拦截来自 WKWebView 中的请求,还是需要实现 WKWebView 对应的 WKNavigationDelegate,并在代理方法中获取请求...应用场景: 1、 自定义请求头的HTTPHeaderField 2、针对NSURLSessionConfiguration设置代理和端口,让一些特殊的请求走自定义的隧道IP和端口 I NSURLProtocol...拦截 HTTP 请求 1.1 NSURLProtocol 拦截 HTTP 请求的原理 An NSURLProtocol object handles the loading of protocol-specific...HTTP 请求开始时,URL 加载系统创建一个合适的 NSURLProtocol 对象处理对应的 URL 请求,因此我们只需写一个继承自 NSURLProtocol 的类,并通过 - registerClass

    1.4K30

    NSURLPtotocol 网络hooker

    NSURLProtocol的作用 NSURLProtocol可以拦截监听每一个URL Loading System中发出request请求,记住是URL Loading System中那些类发出的请求,...相对应的也有unregistClass方法,不让某个子类起作用,这个起作用的时候并不是一定要在appDelegate中,你想要他在什么时候起作用,某个请求之前注册他就行,相应的不想他起作用就unregist...因为打开一个页面,里面的每一个请求包括网页图片等都会去走一遍子类中请求处理的判断方法,导致很多想调试的request找不到。...WKWebView不起作用,因为WKWebView走得是WebKit内核,不走苹果这一套逻辑,目前貌似还没有有效的解决方法。...注意点 可以注册多个NSURLProtocol的子类,注册多个NSURLProtocol子类会逆序去执行,也就是先注册的子类后执行。

    41220

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

    库加载并使用, UIWebView 中限制了; WKWebView 目前缺少关于页码相关的 API; WKWebView 提供加载网页进度的属性; WKWebView 使用 Safari 相同的 JavaScript...WKWebView loadRequest 问题 在 WKWebView 上通过 loadRequest 发起的 post 请求 body 数据会丢失,同样是由于进程间通信性能问题, HTTPBody...WKWebView NSURLProtocol问题 WKWebView 在独立于 app 进程之外的进程中执行网络请求,请求数据不经过主进程,因此,在 WKWebView 上直接使用 NSURLProtocol...如果是用正常 HTTP 和 HTTPs 就是用 WKWebView 自带的拦截器,自定义协议用 NSURLProtocol 拦截。...详细可以参考:《NSURLProtocol处理WKWebView的http和https的请求》 5.

    3.2K00

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

    ) WKScriptMessageHandler协议必须实现的函数,是APP与js交互,提供从网页中收消息的回调方法- (void)userContentController:(WKUserContentController...比UIWebView更安全 基于NSURLProtocol实现iOS应用底层所有网络请求拦截(含网页ajax请求拦截【不支持WKWebView】NSURLProtocol 只能拦截 UIURLConnection...、NSURLSession 和 UIWebView 中的请求; 对于 WKWebView 中发出的网络请求也无能为力,如果真的要拦截来自 WKWebView 中的请求,还是需要实现 WKWebView...对应的 WKNavigationDelegate,并在代理方法中获取请求。...formdata的请求形式在4.0都有了调整,因此需要更改工程中的相应的方法 例如 修改为: [manager GET:urlStr parameters:params headers

    3.3K20

    网易严选的wkwebview测试之路

    ,作为一名客户端的测试人员,我更加关注的主要是wkwebview的各大特性背后带来的测试点,以下就从测试的视角分析一下替换wkwebview之后,测试中遇到比较多的问题:   1、首先就是cookie的问题...  以前UIWebView会自动去NSHTTPCookieStorage中读取cookie,但是WKWebView并不会去读取,因此导致cookie丢失以及一系列问题,在测试的过程中我们发现在一个活动页面触发了登录之后...除了测试中遇到的问题,测试完成之后,我们对wkwebview的性能也做了简单的统计,主要是为了对比wkwebview相比较于UIwebview的优势在哪里,我们针对两种不同的webview,在APP内进行一些正常用户行为的操作...依据职责单一的原则,拆分成了三个协议去实现WebView的响应,解耦了JS交互和加载进度的响应处理。但是他有一个最致命的缺陷,就是WKWebView的请求不能被NSURLProtocol截获。...而UIwebview可以让app对于H5容器使用NSURLProtocol技术将H5进行离线包的处理,H5的图片和Native的图片公用一套缓存,因此WKWebView是没有做缓存处理的,对网页需要缓存的加载性能要求没那么高的还是可以考虑

    1.8K10

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

    ,我对于他的理解,苹果在iOS8中推出的新框架“Webkit”,其中WKWebView就是用来替换原来的UIWebView,一句话,你用它原来UIWebView出现的各种问题都被解决了。...当然随之而来的会有一些小问题,比如:WKWebView是一个独立进程,那么它的请求就无法通过系统的URL SYSTEM了,你无法像UIWebView一样,可以通过NSURLProtocol来拦截所有的请求...:Dictionary = message.body as!...在初始化WKWebView时你还需要配置一个Conf,这个Conf中你可以添加一个属性,这个属性在JavaScript这一边你可以通过window.webkit.messageHandlers.icepyApp..., withError error: Error) { // 页面加载错误 print(error) } 每一个delegate实现中你都应该去做一条日志的记录或者是页面加载完成时间

    87130

    浅谈iOS中的WKWebView添加cookie

    https://blog.csdn.net/u010105969/article/details/53942862 最近开发新功能,其中有加载网页的需求,而最近又了解到了WKWebView,说是耗内存小...因为需要与网页进行交互,而之前使用UIWebView发现与网页的交互并不是很好,于是这次决定使用WKWebView。...在体会着使用新控件且更好的控件的喜悦的时候,一个新的问题出现了--加载网页,后台无法及时获取cookie。后台无法及时获取cookie,在加载网页的时候就无法加载到正确的数据。...(需要多加载几次网页,才能加载到正确的数据) 在查阅相关资料后,发现在使用WKWebView的时候需要我们手动添加cookie到网页中。...在使用WKWebView的时候手动添加cookie: NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary]; NSMutableString

    2.2K10

    一个 Hybrid SDK 设计与实现

    这样客户端可以做的事情就非常多了,举个例子,NSURLProtocol 无法拦截 WKWebview 发起的网络请求,采用 Hybrid 方式交由客户端来发送,便可以实现对应的拦截。...当URL Loading System使用NSURLRequest去获取资源的时候,它会创建一个NSURLProtocol子类的实例,你不应该直接实例化一个NSURLProtocol,NSURLProtocol...WKWebView 网络请求拦截 方法一(Native 侧): 原生 WKWebView 在独立于 app 进程之外的进程中执行网络请求,请求数据不经过主进程,因此在 WKWebView 上直接使用 NSURLProtocol...registerSchemeForCustomProtocol:@"https"] 但是因为出于性能的原因,WKWebView 的网络请求在给主进程传递数据的时候会把请求的 body 去掉,导致拦截后请求的...body 参数丢失。

    1.3K10

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

    中限制了; WKWebView 目前缺少关于页码相关的 API; WKWebView 提供加载网页进度的属性; WKWebView 使用 Safari 相同的 JavaScript 引擎; WKWebView...WKWebView Cookie 问题 WKWebView Cookie 问题在于 WKWebView 发起的请求不会自动带上存储于 NSHTTPCookieStorage 容器中的 Cookie,而在...原因是: WKWebView 拥有自己的私有存储,不会将 Cookie 存入到标准的 Cookie 容器 NSHTTPCookieStorage 中。...WKWebView loadRequest 问题 在 WKWebView 上通过 loadRequest 发起的 post 请求 body 数据会丢失,同样是由于进程间通信性能问题, HTTPBody...WKWebView NSURLProtocol问题 WKWebView 在独立于 app 进程之外的进程中执行网络请求,请求数据不经过主进程,因此,在 WKWebView 上直接使用 NSURLProtocol

    2.3K20

    iOS开发中的WKWebView与JS的交互

    /u010105969/article/details/53189934),可当时用来展示网页的控件是UIWebView,而在iOS8之后苹果推出了WKWebView,此控件也能用来显示网页,可与JS的交互却与...注意:在利用UIWebView展示网页的时候我们如果要想与JS进行交互那么我们就得获取JS代码中的方法名,而我们在使用WKWebView的时候就不用了。...首先需要增加html中的代码,如在“111111”按钮的点击事件增加代码:  window.webkit.messageHandlers.AppModel.postMessage({body: 'call...js alert in js'}); AppModel是我们注入的对象,“()”中的内容是我们传递给客户端的数据。...客户端中需增加的代码: // 注入JS对象名称AppModel,当JS通过AppModel来调用时, // 我们可以在WKScriptMessageHandler代理中接收到  [config.userContentControlleraddScriptMessageHandler

    2.3K20

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

    中限制了; WKWebView 目前缺少关于页码相关的 API; WKWebView 提供加载网页进度的属性; WKWebView 使用 Safari 相同的 JavaScript 引擎; WKWebView...WKWebView Cookie 问题 WKWebView Cookie 问题在于 WKWebView 发起的请求不会自动带上存储于 NSHTTPCookieStorage 容器中的 Cookie,而在...原因是: WKWebView 拥有自己的私有存储,不会将 Cookie 存入到标准的 Cookie 容器 NSHTTPCookieStorage 中。...WKWebView loadRequest 问题 在 WKWebView 上通过 loadRequest 发起的 post 请求 body 数据会丢失,同样是由于进程间通信性能问题, HTTPBody...WKWebView NSURLProtocol问题 WKWebView 在独立于 app 进程之外的进程中执行网络请求,请求数据不经过主进程,因此,在 WKWebView 上直接使用 NSURLProtocol

    2.3K30

    script在head和在body中的区别

    区别: 在HTML body部分中的JavaScript会在页面加载的时候被执行。 在HTML head部分中的JavaScripts会在被调用的时候才执行,但是在主页和其余部分代码之前预先装载。...JavaScript应放在哪里 head 部分中的脚本: 需调用才执行的脚本或事件触发执行的脚本放在HTML的head部分中。...body 部分中的脚本: 当页面被加载时立即执行的脚本放在HTML的body部分。放在body部分的脚本通常被用来生成页面的内容。...body 和 head 部分可同时有脚本: 你可在文件中放无数的脚本,因此你的文件中可以在body和head部分同时存在脚本。...(常规html结构都是head在前,body在后)如果head的js代码是需要传入一个参数(在body中调用该方法时,才会传入参数),并需调用该参数进行一系列的操作,那么这时候肯定就会报错,因为函数该参数未定义

    3K42
    领券