如何从NSURLProtocol中获取请求UIWebView

时间:2010-07-29 21:32:52

标签: iphone uiwebview nsurlprotocol

我的应用程序使用NSURLProtocol的子类。应用程序中有几个UIWebViews,对于NSURLProtocol中实现的特定算法,我需要知道哪个UIWebViews发送请求。

我的理解是[self client]返回的对象应该与请求对象有些联系。但NSURLProtocolClient(由[self client]返回的对象实现的协议)和底层对象_NSCFURLProtocolBridge都没有任何属性/方法来获取请求的发送者。

任何人都可以帮我提出想法吗?

5 个答案:

答案 0 :(得分:3)

NSURLRequest有一个名为mainDocumentURL的方法,它返回根文档的URL。你可以在UIWebViewDelegate这样的方法中保存它,

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
   if([[request.URL absoluteString] isEqualToString:[request.mainDocumentURL absoluteString]]) 
   {
      // associate this URL with this UIWebview
   }
}

然后,您可以查看mainDocumentURL方法中的NSURLProtocol来识别UIWebView。这不是万无一失的,因为它没有考虑多个UIWebViews加载相同URL的情况。但这是我能想到的最好的解决方案。

答案 1 :(得分:1)

https://stackoverflow.com/a/19700910/502149。总而言之,您可以在使用用户默认值创建每个UIWebView之前设置用户代理。由于视图不会考虑用户代理的后续更改,因此您将在每个UIWebView中使用不同的用户代理。您可以在NSURLProtcol中使用它来识别视图,并且可以传递真实的UA代理,这样服务器就不会看到任何差异。

请注意,要让UIWebView“记住”UA字符串设置,它必须在更改设置之前至少发出一个请求。

答案 2 :(得分:0)

在loadRequest中:

static NSString* ProtocolClient=@"urAPP_ProtocolClient";

    NSMutableURLRequest* Request=[request mutableCopy];
    [Request setValue:[NSString stringWithFormat:@"someID",self.someID] forHTTPHeaderField:ProtocolClient];
协议中的

NSString* header=[_currentRequest valueForHTTPHeaderField:ProtocolClient];

if (header) {

答案 3 :(得分:0)

tar

请求是可变类型。所以你可以使用
- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 设置自定义属性。 +[NSURLProtocol setProperty:forKey:inRequest:]

内部的+[NSURLProtocol propertyForKey:inRequest]

答案 4 :(得分:-1)

理想情况下,您不必直接从NSURLProtocol引用UIWebView。但是,我过去一直需要NSURLProtocol向UIWebView发送超出常规委托消息的消息...使用NSNotificationCenter,我使用NSURLRequest对象作为对象发布通知,并订阅我感兴趣的那些通知监听器。