为什么在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改变(可以在UIWebViewDelegate
的webView:shouldStartLoadWithRequest:navigationType:
观察到),前进或后退不再可能。 canGoForward
和canGoBack
将返回NO
, goForward
和goBack
将不会做任何事情。 只要该特定网站的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;