Как получить содержимое ресурса в WebKit? - PullRequest
7 голосов
/ 01 июля 2010

Я писал приложение для Mac для проверки каждого HTTP-запроса и поэтому использую WebView для загрузки запроса.

Проблема в том, что я не могу понять, как получитьсодержимое каждого из элементов ресурса.

Я пытаюсь получить содержимое для ресурса с помощью метода WebResourceLoadDelegate:

- (void)webView:(WebView *)sender resource:(id)identifier didFinishLoadingFromDataSource:(WebDataSource *)dataSource

Это не похоже на работу.

Я также смотрел на [dataSource data], но он просто дал мне HTML для запроса, а не данные для элемента ресурса.

Любые идеи о том, как я могу получить содержимоересурсы?

Ответы [ 2 ]

18 голосов
/ 24 февраля 2011

Да, это должно сработать, и кажется, что когда-то это было. Вы можете обойти это, внедрив собственный NSURLProtocol.

Во-первых, вам нужно выяснить, какие запросы вас интересуют для перехвата (или все они, неважно). Я делаю это в моем WebResourceLoadDelegate. Если я забочусь о запросе, я заменяю его своим собственным, присоединяя себя как собственность. Я буду использовать это свойство в NSURLProtocol позже.

- (NSURLRequest*) webView:(WebView*)sender 
                 resource:(id)identifier 
          willSendRequest:(NSURLRequest*)request 
         redirectResponse:(NSURLResponse*)redirectResponse     
           fromDataSource:(WebDataSource*)dataSource
{
    // Am I interested in this request?
    if (/* figure out if you want it or not */) {
        NSMutableURLRequest* newRequest = [[request mutableCopy] autorelease];
        [NSURLProtocol setProperty:self forKey:@"MyApp" inRequest:newRequest];
        return newRequest;
    }
    else {  
        // Not interested, let it go through normally
        return request;
    }
}

Мой NSURLProtocol выглядит следующим образом.

@interface MyURLProtocol : NSURLProtocol {
    id _delegate;
    NSURLConnection* _connection;
    NSMutableData* _data;
}
@end

В моем подклассе NSURLProtocol я могу использовать присоединенное свойство, чтобы узнать, должен ли я перехватить ответ.

+ (BOOL) canInitWithRequest:(NSURLRequest*)request
{   
    id delegate = [NSURLProtocol propertyForKey:@"MyApp" inRequest:request];
    return (delegate != nil);
}

В initWithRequest я перемещаю делегата в мой экземпляр NSURLProtocol и удаляю свойство из запроса. Это предотвращает бесконечный цикл позже, когда я действительно пытаюсь загрузить этот запрос.

- (id) initWithRequest:(NSURLRequest*)theRequest 
        cachedResponse:(NSCachedURLResponse*)cachedResponse 
                client:(id<NSURLProtocolClient>)client
{
    // Move the delegate from the request to this instance
    NSMutableURLRequest* req = (NSMutableURLRequest*)theRequest;    
    _delegate = [NSURLProtocol propertyForKey:@"MyApp" inRequest:req];  
    [NSURLProtocol removePropertyForKey:@"MyApp" inRequest:req];

    // Complete my setup
    self = [super initWithRequest:req cachedResponse:cachedResponse client:client];
    if (self) {
        _data = [[NSMutableData data] retain];
    }
    return self;
}

Все остальное - загрузка URL со склада.

- (void) startLoading
{
    _connection = [[NSURLConnection connectionWithRequest:[self request] delegate:self] retain];
}

- (void) stopLoading
{
    [_connection cancel];
}

- (void)connection:(NSURLConnection*)conn didReceiveResponse:(NSURLResponse*)response 
{
    [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:[[self request] cachePolicy]];
    [_data setLength:0];
}

- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data
{
    [[self client] URLProtocol:self didLoadData:data];
    [_data appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection*)conn
{
    [[self client] URLProtocolDidFinishLoading:self];

    // Forward the response to your delegate however you like
    if (_delegate && [_delegate respondsToSelector:@selector(...)]) {
        [_delegate ... withRequest:[self request] withData:_data];
    }
}

- (NSURLRequest*)connection:(NSURLConnection*)connection willSendRequest:(NSURLRequest*)theRequest redirectResponse:(NSURLResponse*)redirectResponse
{
    return theRequest;
}

- (void)connection:(NSURLConnection*)conn didFailWithError:(NSError*)error 
{
    [[self client] URLProtocol:self didFailWithError:error];
}
0 голосов
/ 14 июля 2011

используйте это внутри этого метода делегата

<code>  for(NSString *s in [dataSource subresources])
        NSLog(@"resource : %@",s);

он покажет все ресурсы, загружаемые в WebDataSource

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...