Каков наилучший (самый безопасный) способ увеличить URL-адрес, используемый UIWebView? - PullRequest
1 голос
/ 01 сентября 2011

Мы разрабатываем гибридное приложение для iOS. Большая часть приложения представляет собой WebApp, работающее в UIWebView. Иногда для собственной части приложения необходимо изменить URL-адрес, добавив некоторые параметры. Я знаю, что есть «альтернативные» решения, которые мы могли бы использовать (например, нативное приложение обращается к нашему серверу независимо от веб-просмотра); Тем не менее, меня интересует, прежде всего, хорошее и безопасное решение для увеличения URL.

Я искал «лучшую» технику для этого и нашел две, которые, кажется, (в основном) работают.

Техника № 1 - повторная инициализация URL

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSLog(@"GOTO: %@", [[request URL] absoluteString]);
    NSURL * oldurl = request.URL;
    [[request URL] initWithString:[NSString stringWithFormat:@"%@&newParam=dave", [oldurl absoluteString]]];
    return YES;
}

Техника № 2 - отклонить 1-й URL и добавить новый

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL * oldurl = request.URL;
    if ([self isFixed:oldurl]) {
        return YES;
    } else {
        NSURL * newurl = [NSURL URLWithString:[NSString stringWithFormat:@"%@&newParam=dave", [oldurl absoluteString]]];
        [theWebView loadRequest:[NSURLRequest requestWithURL:newurl]];
        return NO;
    }
}

Техника # 2, кажется, вызывает артефакты на некоторых страницах («загрузка iFrame прервана», возможно, другие проблемы).

Мне любопытно, сделал ли кто-нибудь еще замену URL, например, или с помощью другой техники, или если кто-то знает о проблемах с техникой № 1 (которую я, надеюсь, буду использовать).

Я знаю, что метод swizzling не рекомендуется, и документ Apple рекомендует не создавать подклассы UIWebView.

Спасибо!

UPDATE Упс - техника № 1 на самом деле не работает. Мой настоящий код делал больше, чем я опубликовал, и он только работал ... Это, наверное, хорошие новости, так как я хотел немного больше зла.

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Никогда не вызывайте метод -init для объекта, который уже был инициализирован. Это не определенное поведение. Вполне вероятно, что вы теряете память здесь, поскольку старые запросы иваров, вероятно, не были выпущены правильно.

Нечто подобное второму подходу обычно предпочтительнее.

Другой подход заключается в использовании NSURLProtocol для внедрения себя в процесс загрузки URL. Делая это таким образом, вы можете создать свой собственный NSURLConnection, используя модифицированный NSURLRequest.

0 голосов
/ 01 сентября 2011

Вот еще один способ попробовать.Я играл с stringByEvaluatingJavaScriptFromString: и обнаружил, что могу сделать следующее:

- (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *oldUrlString = [NSString stringWithFormat:"%@", request.URL.absoluteURL];

    if ([oldUrlString isEqualToString:@"http://www.google.com/"])
    {
        [webView stringByEvaluatingJavaScriptFromString:@"window.location = \"http://www.arstechnica.com\""];

        return NO;
    }

    return YES;
}

Мне удалось перенаправить с помощью инъекции JavaScript, первый запрос к www.google.com был отклонен и перенаправлен наwww.arstechnica.com (я выбрал случайный сайт).

Я думаю, что это немного лучше, чем горячая замена URL на лету.

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