我的应用程序使用 NSURLProtocol 的子类化。应用程序中有几个 UIWebViews,对于在 NSURLProtocol 中实现的特定算法,我需要知道哪个 UIWebViews 发送请求。
我的理解是 [self client] 返回的对象应该与请求对象有一定的联系。但是 NSURLProtocolClient(即由 [self client] 返回的对象实现的协议)和底层对象 _NSCFURLProtocolBridge 都没有任何属性/方法来获取请求的发送者。
谁能帮我出主意?
我的应用程序使用 NSURLProtocol 的子类化。应用程序中有几个 UIWebViews,对于在 NSURLProtocol 中实现的特定算法,我需要知道哪个 UIWebViews 发送请求。
我的理解是 [self client] 返回的对象应该与请求对象有一定的联系。但是 NSURLProtocolClient(即由 [self client] 返回的对象实现的协议)和底层对象 _NSCFURLProtocolBridge 都没有任何属性/方法来获取请求的发送者。
谁能帮我出主意?
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 的情况。但这是我能想到的最好的解决方案。
请参阅https://stackoverflow.com/a/19700910/502149。总而言之,您可以在UIWebView使用用户默认值创建之前为每个设置用户代理。因为视图没有考虑用户代理的后续更改,所以您最终会在每个UIWebView. 您可以使用它NSURLProtcol来识别视图,并且可以传递真正的 UA 代理,这样服务器就不会看到任何差异。
请注意,UIWebView要“记住” UA 字符串设置,它必须在更改设置之前至少发出一个请求。
在加载请求中:
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) {
- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
请求是可变类型。所以你可以
+[NSURLProtocol setProperty:forKey:inRequest:]用来设置自定义属性。并且+[NSURLProtocol propertyForKey:inRequest]从里面NSURLProtocol
理想情况下,您不必直接从 NSURLProtocol 引用 UIWebView。但是,我过去需要让 NSURLProtocol 向 UIWebView 发送常规委托消息之外的消息...使用 NSNotificationCenter,我使用 NSURLRequest 对象作为对象发布通知,并订阅我感兴趣的那些通知听众。