我的应用程序使用NSURLProtocol的子类。应用程序中有几个UIWebViews,对于NSURLProtocol中实现的特定算法,我需要知道哪个UIWebViews发送请求。
我的理解是[self client]返回的对象应该与请求对象有些联系。但NSURLProtocolClient(由[self client]返回的对象实现的协议)和底层对象_NSCFURLProtocolBridge都没有任何属性/方法来获取请求的发送者。
任何人都可以帮我提出想法吗?
答案 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)
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对象作为对象发布通知,并订阅我感兴趣的那些通知监听器。