为什么在iOS7中UIWebView canGoBack = NO?

我将这个网站embedded到我的应用程序中,如下所示:

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个button可以在这个网站上前进和后退。 我在打电话

[self.twitterWebView goBack];
[self.twitterWebView goForward]; 因此。

这在iOS 6上工作正常,但在iOS 7上,我的web视图的canGoBack和canGoForward属性是NO,因此我的后退和前进button不起作用。

作为一个侧面说明,当应用程序第一次安装,并在第一次加载页面,我的button的工作。 但是当我再次运行我的应用程序,当我点击网站上的链接时,我的web视图的canGoBack属性开始始终返回NO。

我该如何解决这个问题?

编辑 :我上传了一个小型testing应用程序,演示了我的问题。 你可以从这里下载。 请在iOS 7模拟器上运行应用程序,请参阅第一次安装应用程序后退button。 然后退出,再次运行应用程序,你会发现它会停止工作。

顺便问题似乎是关于Twitter的移动网站。 你可以尝试另一个网站地址,看看。

这似乎与HTML5的“应用程序caching”function有关 。 首次启动时,网站不会被caching, UIWebView正确检测是否可以前进或后退。 只要caching被填充,新的UIWebView实例就决定,即使URL改变(可以在UIWebViewDelegatewebView:shouldStartLoadWithRequest:navigationType:观察到),前进或后退不再可能。 canGoForwardcanGoBack将返回NOgoForwardgoBack将不会做任何事情。 只要该特定网站的HTML5caching存在,就会在应用的重新启动之后持续存在。

也许这个问题仅限于通过JavaScript修改哈希标记后的 URL的片段标识符的 Web应用程序。 是的, UIWebView在这种情况下的行为DID在iOS 6和iOS 7之间变化。

我还没有find解决scheme,我们可能不得不等待苹果在iOS 7.1中解决这个问题。

编辑

其他人也有这个问题:

如果您正在使用应用程序caching并通过散列或其他技术pipe理状态,那么历史logging对象将不会保留您的导航历史logging,因此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每晚构build (r158339)似乎正常工作。 这个修复很可能只是一个时间问题,直到iOS和OS X版本。

编辑3

这个问题在iOS 7.1和OS X 10.9.2中仍然存在。

编辑4

OS X的iOS 8和Safari 7.1(9537.85.10.17.1)已修复此错误!

有关:

  • 历史对象不保留导航历史loggingios7 safari

我在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事件中调用上述方法。

现在棘手的部分来了。 进行上述更改后,后退和前进button按预期工作,除非在一种情况下。 当我们通过点击返回button返回到第一页时,它不会被禁用。 因为当按下后退/前进button,页面被加载时,它不会触发上述任何事件。 它只是从caching加载。

我尝试了很多方法,但只有一个解决了我的问题。

在WebHistoryItemChangedNotification上添加了一个观察者。

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

在webViewHistoryDidChange中调用相同的updatebuttons方法。

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

将该属性更改为“ strong ”参考后,我的问题消失了。

之前:

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

在将财产更改为“ strong ”之后:

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