UIWebView: как вести историю URL-адресов на ajax-сайтах?

Добрый день!
Ранее возникал вопрос как обновлять кнопки браузера назад/вперед при посещении страниц ajax-сайтов (типа m.vk.com). Частично я решил эту проблему.
Теперь стоит задача как вести историю URL-адресов для кнопок назад/вперед когда для ajax-сайтов проблемно идентифицировать момент перехода и сам URL-адрес страницы.
В мобильном сафари это сделано. Как такое реализовать?
  • Вопрос задан
  • 2947 просмотров
Пригласить эксперта
Ответы на вопрос 2
alexyat
@alexyat
iOS Developer
NSURLProtocol вам в помощь, eng.42go.com/customizing-uiwebview-requests-with-n... видит все http запросы.
Например моя заготовка для детекта mp3, чтобы зарегать класс, выполняю. этот код

[NSURLProtocol registerClass:[MP3DetectURLProtocol class]];


MP3DetectURLProtocol.h
#import <Foundation/Foundation.h>

@interface MP3DetectURLProtocol : NSURLProtocol

@property (nonatomic, strong) NSURLConnection *connection;

@end


MP3DetectURLProtocol.m
#import "MP3DetectURLProtocol.h"

@implementation MP3DetectURLProtocol

static NSString *PBProxyURLHeader = @"X-PB";

+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
    //if([[request.URL absoluteString] rangeOfString:@"mp3"].length !=0)
        NSLog(@"request url = %@", [request.URL absoluteString]);
    if ([request valueForHTTPHeaderField:PBProxyURLHeader] == nil)
    {
        return YES;
    }
    return NO;
}

+ (NSURLRequest *) canonicalRequestForRequest:(NSURLRequest *)request
{
    return request;
}

- (void) startLoading
{
    NSMutableURLRequest *newRequest = [self.request mutableCopy];
    [newRequest setValue:@"" forHTTPHeaderField:PBProxyURLHeader];
    // Here we set the User Agent
    //[newRequest setValue:@"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36 Kifi/1.0f" forHTTPHeaderField:@"User-Agent"];
    
    //[NSURLProtocol setProperty:@YES forKey:@"UserAgentSet" inRequest:newRequest];
    //NSLog(@"start loading");
    self.connection = [NSURLConnection connectionWithRequest:newRequest delegate:self];
}

- (void)stopLoading
{
    //[self.connection cancel];
}

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

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    [self.client URLProtocol:self didFailWithError:error];
    self.connection = nil;
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed];
}

- (NSURLRequest *)connection:(NSURLConnection *)connection
             willSendRequest:(NSURLRequest *)request
            redirectResponse:(NSURLResponse *)response
{
    [self.client URLProtocol:self wasRedirectedToRequest:request redirectResponse:response];
    return nil;
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [self.client URLProtocolDidFinishLoading:self];
    self.connection = nil;
}

@end
Ответ написан
@max_sokolov
Интересные какие у вас задачи с UIWebView. Ну какой тут вариант. Давайте посмотрим в сторону метода stringByEvaluatingJavaScriptFromString у UIWebView. В webViewDidFinishLoad можно посмотреть какие ссылки были нажаты, например, так

NSString *result = [webView stringByEvaluatingJavaScriptFromString:@"var a = document.getElementsByTagName(\"a\");for(var i=0; i<a.length; i++){a[i].onclick = function(){alert(this.href);}}"];

Но тут есть проблема stringByEvaluatingJavaScriptFromString инжектит скрипт и возвращает управление. Соответственно если мы вместо alert поставим return, то в result ничего не получим. Можно попробовать выполнить скрипт после какого-нибудь UITapGestureRecognizer.

В результате не уверен, времени пробовать сейчас нет, но как пища для размышлений.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы