Подтвердить что ты не робот

Почему UIWebView canGoBack = НЕТ в iOS7?

Я внедряю этот веб-сайт в свое приложение следующим образом:

NSString *url = [NSString stringWithFormat:@"https://mobile.twitter.com/search?q=%@", @"@test OR #test"];
url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[self.twitterWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];

self.twitterWebView.scalesPageToFit = YES;

И у меня есть 2 кнопки для перехода назад и вперед на этом веб-сайте. Я звоню

[self.twitterWebView goBack]; и
[self.twitterWebView goForward]; соответственно.

Это отлично работает на iOS 6, но на iOS 7, мои свойства canGoBack в Интернете и canGoForward - это НЕТ, и поэтому мои кнопки назад и вперед не работают.

Как примечание, когда приложение установлено в первый раз, и страница загружается в первый раз, мои кнопки работают. Но когда я снова запускаю приложение, и когда я нажимаю ссылку на веб-сайте, мой веб-ресурс canGoBack начинает возвращаться всегда НЕТ.

Как я могу это решить?

EDIT. Я загрузил мини-тестовое приложение, которое демонстрирует мою проблему. Вы можете скачать его из здесь. Запустите приложение на симуляторе iOS 7, убедитесь, что кнопка "Назад" работает над первой установкой приложения. Затем закройте, запустите приложение, и вы увидите, что он перестанет работать.

Кстати, проблема связана с мобильным сайтом twitter. Вы можете попробовать другой адрес веб-сайта и увидеть это.

4b9b3361

Ответ 1

Это похоже на HTML5 "Кэш приложения" . При первом запуске сайт не кэшируется, а UIWebView правильно определяет, может ли он идти вперед или назад. Как только кеш заполняется, новые экземпляры UIWebView решают, что даже если URL-адрес изменится (что можно увидеть в UIWebViewDelegate webView:shouldStartLoadWithRequest:navigationType:), движение вперед или назад больше невозможно. canGoForward и canGoBack вернутся NO, а goForward и goBack ничего не сделают. Это сохраняется за перезапуском приложения, если существует кеш HTML5 для этого конкретного сайта.

Возможно, эта проблема ограничена веб-приложениями, которые изменяют URL Идентификатор фрагмента после хешмарка через JavaScript. И да, поведение UIWebView в этой ситуации DID менялось между iOS 6 и iOS 7.

Я еще не нашел решение, и нам, вероятно, придется ждать, пока Apple исправит это в iOS 7.1 или около того.

Edit

У других людей тоже есть эта проблема:

Если вы используете Application Cache, а также управляете состояний через хэш или другую технику, объект истории не будет сохраните историю навигации, поэтому history.back() никогда не будет работать и history.length остается в 1 навсегда.

(из http://www.mobilexweb.com/blog/safari-ios7-html5-problems-apis-review)

Изменить 2

Эта проблема существует в Safari 7.0 (9537.71, по умолчанию в OS X 10.9 Mavericks). Тем не менее, самая новая ночная сборка WebKit (r158339), похоже, работает правильно. Скорее всего, это всего лишь вопрос времени, пока исправление не приведет к выпуску iOS и OS X.

Изменить 3

Эта проблема все еще существует в iOS 7.1 и OS X 10.9.2.

Изменить 4

Эта ошибка была исправлена ​​в iOS 8 и Safari 7.1 (9537.85.10.17.1) для OS X!

Связанный:

Ответ 2

У меня тоже была эта проблема в iOS 7. Что для меня работало, было перемещение кода "canGoBack" и кода "canGoForward" в shouldStartLoadWithRequest, как показано ниже. Раньше у меня это было в webViewDidFinishLoad, которое работало для iOS 6, но не для iOS 7.

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
 navigationType:(UIWebViewNavigationType)navigationType
 {
    if ([webView canGoBack])
    {
        [browserBackItem setEnabled:YES];
    }
    else
    {
        [browserBackItem setEnabled:NO];
    }
    if ([webView canGoForward])
    {
        [browserForwardItem setEnabled:YES];
    }
    else
    {
        [browserForwardItem setEnabled:NO];
    }
    return YES;
}

Ответ 3

У меня была такая же проблема. Я могу разрешить его со следующими изменениями.

Внедрен новый метод updateButtons

- (void)updateButtons:(UIWebView*)theWebView {
    if ([theWebView canGoBack])
    {
        self.backButton.enabled = YES;
    }
    else
    {
        self.backButton.enabled = NO;
    }
    if ([theWebView canGoForward])
    {
        self.forwardButton.enabled = YES;
    }
    else
    {
        self.forwardButton.enabled = NO;
    }
     }

Добавлен вызов вышеуказанного метода в событиях shouldStartLoadWithRequest, webViewDidFinishLoad, didFailLoadWithError.

Теперь наступает сложная часть. После внесения изменений, кнопки назад и вперед работают как ожидалось, за исключением одного сценария. Когда мы вернемся к первой странице, нажав кнопку "Назад", она не будет отключена. Поскольку он не будет запускать какие-либо из вышеперечисленных событий, когда страница загружается, нажав кнопку назад/вперед. он просто загружается из кеша.

Я пробовал много подходов, но только тот, который решил мою проблему.

Добавлен наблюдатель в WebHistoryItemChangedNotification.

   [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(webViewHistoryDidChange:)
                                             name:@"WebHistoryItemChangedNotification"
                                           object:nil];

Вызывается тот же метод updatebuttons в webViewHistoryDidChange.

- (void)webViewHistoryDidChange
{
     [self updateButtons:self.webView];
}

Ответ 4

После изменения свойства на ссылку "strong" моя проблема исчезла.

перед:

 @property (nonatomic, weak) IBOutlet UIWebView *webView;

после изменения свойства на "strong":

 @property (nonatomic, strong) IBOutlet UIWebView *webView;