13

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

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 上,我的 web 视图的 canGoBack 和 canGoForward 属性为 NO,因此我的后退和前进按钮不起作用。

附带说明一下,当第一次安装应用程序并且第一次加载页面时,我的按钮可以工作。但是当我再次运行我的应用程序时,当我点击网站上的链接时,我的 web 视图的 canGoBack 属性开始总是返回 NO。

我该如何解决这个问题?

编辑:我上传了一个迷你测试应用程序来演示我的问题。你可以从这里下载。请在 iOS 7 模拟器上运行应用程序,第一次安装应用程序时,请查看后退按钮是否正常工作。然后退出,再次运行应用程序,你会看到它会停止工作。

顺便说一句,问题似乎与 twitter 移动网站有关。您可以尝试其他网站地址并查看。

4

4 回答 4

18

这似乎与HTML5 的“应用程序缓存”功能有关。首次启动时,该站点未缓存,并且UIWebView正确检测它是否可以前进或后退。一旦缓存被填充,新UIWebView实例就会决定,即使 URL 发生变化(可以在UIWebViewDelegate's中观察到webView:shouldStartLoadWithRequest:navigationType:),也不再可能前进或后退。canGoForward并且会canGoBack返回NO并且不会做任何事情。只要此特定站点的 HTML5 缓存存在,这种情况就会在应用程序重新启动时持续存在。goForwardgoBack

也许这个问题仅限于通过 JavaScript在哈希标记之后修改 URL 的片段标识符的 Web 应用程序。是的,UIWebView在这种情况下 's 的行为在 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 nightly 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) 中修复!

有关的:

于 2013-10-29T16:10:51.980 回答
3

我在 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;
}
于 2013-11-12T23:51:34.870 回答
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];

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

- (void)webViewHistoryDidChange
{
     [self updateButtons:self.webView];
}
于 2015-12-30T19:58:50.960 回答
-1

将属性更改为“ strong”引用后,我的问题就消失了。

前:

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

将属性更改为“ strong”后:

 @property (nonatomic, strong) IBOutlet UIWebView *webView;
于 2014-04-30T00:44:21.403 回答