Почему 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 моего веб-представления всегда возвращает значение NO.
Как я могу решить это?
РЕДАКТИРОВАТЬ: я загрузил мини-тестовое приложение, которое демонстрирует мою проблему. Вы можете скачать его здесь. Пожалуйста, запустите приложение на симуляторе iOS 7, убедитесь, что кнопка "Назад" работает при первой установке приложения. Затем закройте, снова запустите приложение, и вы увидите, что оно перестанет работать.
Кстати, проблема, кажется, о мобильном сайте в Твиттере. Вы можете попробовать другой адрес веб-сайта и увидеть это.
4 ответа
Похоже, это связано с функциональностью HTML5 "Кэш приложений". При первом запуске сайт не кэшируется и UIWebView
правильно определяет, может ли он идти вперед или назад. Как только кеш заполнен, новый UIWebView
случаи решают это, даже если URL-адрес изменяется (что можно наблюдать в UIWebViewDelegate
"s webView:shouldStartLoadWithRequest:navigationType:
), идти вперед или назад уже невозможно.canGoForward
а такжеcanGoBack
вернусь NO
а также goForward
а также goBack
не буду ничего делать Это сохраняется при перезапуске приложения, пока существует кэш HTML5 для этого конкретного сайта.
Возможно, эта проблема ограничена веб-приложениями, которые изменяют идентификатор фрагмента URL-адреса после хеш-метки через JavaScript. И да, UIWebView
Поведение в этой ситуации изменилось между iOS 6 и iOS 7.
Я еще не нашел решения, и нам, вероятно, придется подождать, пока Apple исправит это в iOS 7.1 или около того.
редактировать
Другие люди тоже имеют эту проблему:
Если вы используете кэш приложений, а также управляете состояниями с помощью хэша или другого метода, объект истории не сохранит историю навигации, поэтому 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!
Связанные с:
У меня тоже была эта проблема в 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;
}
Я была такая же проблема. Я могу решить это со следующими изменениями.
Реализован новый метод 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];
}
После изменения свойства на "strong
Ссылка, моя проблема исчезла.
до:
@property (nonatomic, weak) IBOutlet UIWebView *webView;
после изменения свойства на "strong
":
@property (nonatomic, strong) IBOutlet UIWebView *webView;