我有一个桌面浏览器应用程序,它使用 WebView 来托管 Flash 插件。 Flash 插件定期向外部网站请求新数据,然后将其绘制为精美的图形。
我想拦截这些网络请求并获取数据(这样我就可以通过 Growl 显示它,而不是保留桌面窗口)。但据我所知,Flash 发出的请求不会被普通的 WebView 委托接收。
还有其他地方可以设置挂钩吗?我尝试通过 [NSURLCache setSharedURLCache] 安装自定义 NSURLCache 但从未被调用。我还尝试了方法混合其他一些类(如 NSCachedURLResponse),但找不到方法。有什么想法吗?非常感谢!
没想到没人回答这个问题,其实很简单。创建NSURLProtocol的子类,然后调用registerClass开始拦截。
[NSURLProtocol registerClass:[MyCustomURLProtocol class]];
以下是子类的重要部分:
#define REQUEST_HEADER_TAG @"x-mycustomurl-intercept"
+ (BOOL)canInitWithRequest:(NSURLRequest*)theRequest
{
// Check for the custom header on the request to break the
// infinite loop created by the [startLoading] below.
if ([theRequest valueForHTTPHeaderField:REQUEST_HEADER_TAG]) {
return NO;
}
if ([theRequest.URL.scheme caseInsensitiveCompare:@"http"] == NSOrderedSame) {
return YES;
}
return NO;
}
+ (NSURLRequest*)canonicalRequestForRequest:(NSURLRequest*)theRequest
{
return theRequest;
}
- (id)initWithRequest:(NSURLRequest*)theRequest
cachedResponse:(NSCachedURLResponse*)cachedResponse
client:(id<NSURLProtocolClient>)client
{
// Add a custom header on the request to break the
// infinite loop created by the [startLoading] below.
NSMutableURLRequest* newRequest = [theRequest mutableCopy];
[newRequest setValue:@"" forHTTPHeaderField:REQUEST_HEADER_TAG];
// Now continue the process with this "tagged" request
self = [super initWithRequest:theRequest
cachedResponse:cachedResponse
client:client];
if (self) {
// capture the data received
[self setRequest:newRequest];
receivedData = [[NSMutableData data] retain];
}
[newRequest release];
return self;
}
- (void)dealloc
{
[connection release];
[request release];
[receivedData release];
[super dealloc];
}
- (void)startLoading
{
// Load the data off the web as usual, but set myself up as the delegate
// so I can intercept the response data as it comes in.
[self setConnection:[NSURLConnection connectionWithRequest:request delegate:self]];
}
- (void)stopLoading
{
[connection cancel];
}
#pragma mark NSURLConnection delegate implementation
- (void)connection:(NSURLConnection*)conn
didReceiveResponse:(NSURLResponse*)response
{
[[self client] URLProtocol:self
didReceiveResponse:response
cacheStoragePolicy:[request cachePolicy]];
[receivedData setLength:0];
}
- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data
{
[[self client] URLProtocol:self didLoadData:data];
[receivedData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection*)conn
{
[[self client] URLProtocolDidFinishLoading:self];
[self setConnection:nil];
if (requestTag != 0) {
if (requestDelegate &&
[requestDelegate respondsToSelector:
@selector(finishedLoadingData:forURL:taggedWith:)]) {
[requestDelegate finishedLoadingData:receivedData
forURL:[request URL]
taggedWith:requestTag];
}
}
}
- (void)connection:(NSURLConnection*)conn didFailWithError:(NSError*)error
{
[[self client] URLProtocol:self didFailWithError:error];
[self setConnection:nil];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)