我需要传递一些额外的信息,UIWebView loadRequest:
以便它达到我的NSURLProtocol
. 信息不能绑定,NSURLRequest
因为信息也必须保留NSURLRequest mainDocumentURL
。所以我用它进行子类化NSURL
和构建NSURLRequest
。我已经知道NSURLRequest
whichreachNSURLProtocol startLoading
不是我提供给的实例UIWebView loadRequest
,所以我也实现NSURL copyWithZone
了,天真地期待 URL 加载系统会使用它。
现在,NSURLProtocol canInitWithRequest
不是像人们合理预期的那样被调用一次,而是在之前至少被调用了 4 次startLoading
。前 2 次,传入的NSURLRequest
仍然包含我的自定义NSURL
实现。然后一个不幸的内部代码CFURLCopyAbsoluteURL
要求absoluteURL
我的自定义NSURL
和下一个canInitWithRequest
(和后续startLoading
的)已经获得了一个全新NSURLRequest
的全新NSURL
。copyWithZone
永远不会被调用,并且我的子类NSURL
丢失了。
在我放弃并实施一个将东西直接附加到 URL 字符串的劣质且脆弱的解决方案之前,我想问问更高级别的向导,他们是否找到了一种方法来捕捉NSURLProtocol
雷达上的初始闪烁或如何CFURLCopyAbsoluteURL
欺骗携带我的自定义实例。我试图NSURL absoluteURL
通过再次返回我的自定义 NSURL 类的新实例来破解,但它没有帮助。我已经看到了一些NSURLProtocol setProperty
功能上的承诺,但现在它似乎毫无用处。URL加载系统愉快地创建了一切的新实例,并且NSURLRequest
到达NSURLProtocol
似乎与UIWebView
偶然输入的相同。
更新:好的,我想让帖子尽可能短,但即使是第一个回复也要求提供技术背景,所以我们开始吧:我UIWebView
在 app 中有多个 s。这些视图可以同时运行请求,并且绝对可以运行相同 URL 的请求。它就像桌面浏览器中的选项卡。但我需要区分UIWebView
每个特定NSURLRequest
到达的来源NSURLProtocol
。我需要每个 URL 请求都携带一个上下文。我不能简单地将 URL 映射到数据,因为多个UIWebViews
可能随时加载相同的 URL。
更新 2:附加上下文信息NSURL
是首选,据我所知,这是唯一可用的。问题是对页面内引用的资源(图像等)的请求根本没有通过UIWebViewDelegate
并NSURLProtocol
直接进入。在NSURLProtocol
. 此类请求的唯一上下文链接是它们的NSURLRequest mainDocumentURL
.