4

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

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

谁能帮我出主意?

4

5 回答 5

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 的情况。但这是我能想到的最好的解决方案。

于 2012-03-15T06:07:58.260 回答
1

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

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

于 2013-11-01T13:47:04.760 回答
0

在加载请求中:

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) {
于 2011-11-08T17:34:44.297 回答
0
- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

请求是可变类型。所以你可以
+[NSURLProtocol setProperty:forKey:inRequest:]用来设置自定义属性。并且+[NSURLProtocol propertyForKey:inRequest]从里面NSURLProtocol

于 2016-03-31T09:34:43.850 回答
-1

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

于 2011-06-09T18:46:21.917 回答