如何在iPhone上的UIWebview中清除后退列表?

时间:2010-09-26 21:35:37

标签: iphone ipad uiwebview clear

我想访问/清除后退列表,就好像UIWebView再次是新的一样。是否有任何公共API或解决方法来执行此操作?

我试过了:

while ([webview canGoback]) {
    [webview goBack];
}

但这会冻结设备(模拟器)。

8 个答案:

答案 0 :(得分:17)

<强>声明
与此类似,请注意,结果可能无法通过应用商店批准,并且可能无法在将来修订SDK时使用。


在SDK中没有官方方法。但是,如果您真的要清除UIWebView的后退/前进历史记录,可以通过对私有框架的深入研究来完成。

快速而肮脏的方法(完成一堆丑陋的编译器警告)如下:

鉴于myUIWebViewInstanceUIWebView的完全正常的实例:

id internalWebView=[[myUIWebViewInstance _documentView] webView];       
[internalWebView setMaintainsBackForwardList:NO];
[internalWebView setMaintainsBackForwardList:YES];

框架中还有一个相当诱人的_clearBackForwardCache方法,但是当它发痒时似乎并没有那么多。只是翻过boolian对我来说是一种享受。

答案 1 :(得分:13)

如果您正在尝试“重复使用”现有的UIWebView,并且无法返回之前的任何页面,您可以:

  1. 加载新请求(用户不应该返回的请求)时,请保存新请求的网址,例如:

    self.curURL = [NSURL urlWithString:@"http://www.bla.com"];
    [webview loadRequest:[NSURLRequest requestWithURL:curURL]];

  2. 我猜你有自己的后退按钮,所以在你的webViewDidFinishLoad委托方法中,添加:

    backbttn.enabled = webView.canGoBack && ![[webView.request URL] isEqual: curURL];

  3. 这样,用户甚至不知道UIWebView可以回到之前的页面。

答案 2 :(得分:6)

只需重新创建webview即可。它会重置包括历史在内的所有内容。

答案 3 :(得分:5)

我使用以下代码行成功(尽管你可以称这种解决方法'成功'):

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"if( window.history.length > 1 ) { window.history.go( -( window.history.length - 1 ) ) }; window.setTimeout( \"window.location.replace( '%@' )\", 300 );", targetLocation]];

其中targetLocation是所需的网址NSString

它的作用是告诉浏览器在历史记录过程中向后移动,然后在短暂超时后加载所需的URL。

这当然不能解决清除前进历史的问题(在我的情况下我不需要这样做)。

答案 4 :(得分:2)

我认为如果您释放uiwebview对象并重新创建,那么它将清除历史记录。我实际上有一个反向问题。如果uiwebview对象位于不可见的视图中,则会在低内存事件期间自动释放。然后我必须在viewDidLoad中重新创建它,但是从那时起它不会保留历史记录。

答案 5 :(得分:0)

我想你可以通过手动加载一些HTML来打破历史......

类似的东西:

[webview loadHTMLString:@"" baseURL:@""];

答案 6 :(得分:0)

挑选吉尔伯特聪明的方法:如果修改了它,它确实可以用于重定向(到目前为止它还没有,正如mharper所指出的那样)。

在加载请求之前,保存所需的URL并设置一个名为_saveURL的布尔成员变量,以指示应保存重定向URL(稍后您将看到这两个变量的确切用法):

- (void)my_loadURL:(NSURL *)url
{
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; // create the request
    [_desiredURL release]; // clear up the previous value (assuming -my_loadURL: may be called multiple times)
    _desiredURL = [url retain]; // store the desired URL (will be used later)
    _saveURL = YES; // will also be used later
    [_webView loadRequest:request]; // start loading the request
}

(如果在自动引用计数(ARC)环境中进行编译,保留和释放调用当然不会有必要。)

现在在-webViewDidFinishLoad:委托回调中,通过测试网络视图的当前请求的URL是否与所需的URL不同来检查重定向是否已经发生。如果是,请将重定向URL保存在成员变量_firstURL中。这也是_saveURL到位的地方。每次调用此委托方法时都要避免覆盖_firstURL。 此外,按照我们之前的方式启用或禁用后退和前进按钮。

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    // grab the URL currently being loaded
    NSURL *currentURL = [webview.request URL];

    // check whether we are supposed to save the redirect URL and
    // whether redirection has taken place yet
    if (_saveURL && ![currentURL isEqual:_desiredURL]) {
        [_firstURL release];
        _firstURL = [currentURL retain];
    }

    // adjust the enabled-state of the back and forward buttons just like before
    _backButton.enabled = _webView.canGoBack && ![currentURL isEqual:_firstURL];
    _forwardButton.enabled = _webView.canGoForward;
}

(同样,启用ARC时不需要保留和释放。)

然而,这种方法的一个关键缺点。仅当您确定传入my_loadURL:的网址将重定向时,它才有效。否则,_firstURL变量将在其他位置设置。因此,如果您无法判断相应的网址是否会重定向,那么这种方法就不适合您的需求。无论如何,它确实符合我的需要,我希望我也可以帮助其他人。

更新:您可以通过放弃处理_desiredURL的所有内容来改进此方法,这意味着不要在-my_loadURL:-webViewDidFinishLoad:中保存所需的网址,只需说if(_saveURL)。这样,它就可以用于根本不重定向或立即重定向的网站。

答案 7 :(得分:0)

我几乎尝试过几乎没有成功的所有解决方案。我的情况是Childbrowser phonegap插件,但基于同样的问题,一个webview实例用于在我的应用程序中显示外部页面。当我显示外部页面时,webview会保留显示的先前页面的历史记录。 我想在显示新的外部网页时删除历史记录。

经过一番研究,我找到了一个适合我的解决方案in this SO post

[webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML = \"\";"];

在儿童浏览器的情况下,我将其放在方法-(IBAction) onDoneButtonPress:(id)sender中,该方法之前插入了空白页以开始空白(但启用了后退按钮)。

HTH! 米尔顿。