我需要传递一些额外的信息,UIWebView loadRequest:以便它达到我的NSURLProtocol. 信息不能绑定,NSURLRequest因为信息也必须保留NSURLRequest mainDocumentURL。所以我用它进行子类化NSURL和构建NSURLRequest。我已经知道NSURLRequestwhichreachNSURLProtocol 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.