iOS:将自定义NSURL传递给NSURLProtocol

Pav*_*nek 6 nsurl nsurlrequest nsurlprotocol ios

我需要传递一些额外的信息,UIWebView loadRequest:以便它达到我的实现NSURLProtocol.信息不能绑定,NSURLRequest因为信息也必须保留NSURLRequest mainDocumentURL.所以我用它进行了子类化NSURL和构造NSURLRequest.我已经知道NSURLRequest到达NSURLProtocol startLoading的不是我所提供的实例UIWebView loadRequest,所以我也实现NSURL copyWithZone了,天真地期望URL加载系统将使用它.

现在,NSURLProtocol canInitWithRequest不是人们合理预期的,而是至少4次startLoading.前两次,传入NSURLRequest仍然包含我的自定义NSURL实现.然后叫一个不幸的内部代码CFURLCopyAbsoluteURL询问了absoluteURL我的定制NSURL和下canInitWithRequest(以及随后的startLoading)已经得到了全新的NSURLRequest新鲜NSURL的吧.copyWithZone永远不会被调用,我的子类NSURL丢失了.

在我放弃并实现一个低级且易碎的解决方案并将内容直接附加到URL字符串之前,我想问更高级别的向导,他们是否看到了如何捕获NSURLProtocol雷达上的初始闪烁或如何CFURLCopyAbsoluteURL进入的方法携带我的自定义实例.我试图NSURL absoluteURL通过再次返回我的自定义NSURL类的新实例来破解,但它没有帮助.我已经在NSURLProtocol setProperty功能上看到了一些承诺,但现在看起来很无用.URL加载系统快乐地创建所有内容的新实例,并且NSURLRequest到达时NSURLProtocol似乎与UIWebView仅偶然输入的内容相同.

更新:好的我想保持帖子尽可能短,但即使是第一个回复是要求技术背景,所以我们去:我UIWebView在应用程序中有多个s.这些视图可以同时运行请求,绝对可以运行相同URL的请求.这就像桌面浏览器中的标签.但我需要区分哪个UIWebViewNSURLRequest到达的每个特定的起源NSURLProtocol.我需要每个URL请求都带有一个上下文.我不能简单地将URL映射到数据,因为多个UIWebViews可能随时加载相同的URL.

更新2:附加上下文信息NSURL是首选,并且据我的理解,唯一可用.问题是页面内部引用的资源请求(图像等)根本没有完成UIWebViewDelegate,最终NSURLProtocol直接进入.我没有机会在任何地方接触,检查或修改此类请求NSURLProtocol.这些请求的唯一上下文链接是他们的NSURLRequest mainDocumentURL.

Mat*_*ner 3

如果有什么方法可以让你的原件得到NSURL使用,mainDocumentURL那将是理想的选择。如果没有办法防止它被复制,我想到了以下 hack 作为替代方案:

在创建每个之前UIWebView将用户代理字符串设置为唯一值。据说此更改仅影响UIWebView随后创建的对象,因此每个视图最终都会有自己独特的用户代理字符串。

在实现中NSURLProtocol,您可以检查用户代理字符串以识别关联UIWebView,并使用实际的用户代理字符串将其传递到真正的协议处理程序(因此服务器不会看到任何不同)。

所有这一切都取决于视图真正以不同的 UA 字符串结束。如果您设法让它发挥作用,请告诉我!