2013-09-22 50 views
13

我嵌入這個網站爲我的應用程序是這樣的:爲什麼iOS7中的UIWebView canGoBack = NO?

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 goForward];相應地。

這適用於iOS 6,但在iOS 7上正常工作,我的web視圖的canGoBack和canGoForward屬性爲NO,因此我的後退和前進按鈕不起作用。

作爲一個側面說明,當應用程序第一次安裝,並在第一次加載頁面時,我的按鈕可以工作。但是當我再次運行我的應用程序,並且當我點擊網站上的鏈接時,我的web視圖的canGoBack屬性開始始終返回NO。

我該如何解決這個問題?

編輯:我上傳了一個小型測試應用程序,演示了我的問題。您可以從here下載它。請在iOS 7模擬器上運行應用程序,請參閱後退按鈕正在處理應用程序的第一次安裝。然後退出,再次運行應用程序,你會發現它會停止工作。

順便說一下,問題似乎是關於Twitter的移動網站。你可以嘗試另一個網站地址,看看。

回答

18

這似乎與HTML5's "Application Cache" functionality有關。在第一次啓動時,該網站沒有被緩存,並且UIWebView正確地檢測它是否可以前進或後退。只要緩存填充完畢,即使URL更改(可在UIWebViewDelegatewebView:shouldStartLoadWithRequest:navigationType:中觀察到),新的UIWebView實例也會判定即使前進或後退不再可能。 canGoForwardcanGoBack將返回NOgoForwardgoBack不會做任何事情。只要該特定網站的HTML5緩存存在,此操作就會在應用重新啓動時持續存在。

也許這個問題僅限於通過JavaScript修改URL的Fragment identifier after the hashmark的網絡應用程序。 是的,UIWebView在這種情況下的行爲DID在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小牛)存在此問題,太。但是,最近的WebKit nightly build(r158339)似乎正常工作。這很可能只是一個時間問題,直到修復程序發佈到iOS和OS X版本。

編輯3

這個問題仍然存在的iOS 7.1和與OS X 10.9.2。

編輯4

此bug已被固定在iOS的8和Safari 7.1(9537.85.10.17.1)爲OS X!

相關:

+0

您的相關鏈接表示他們通過禁用應用程序緩存來修復它們。這是如何完成的?謝謝! – Olie

+1

@Olie它們是指通過不引用HTML文檔的「head」部分中的清單來完全禁用HTML5緩存功能。這不是一個真正的修復... –

+0

那麼,這是'subOptimal' ...:\是否有任何體面的工作? – Olie

4

我有這個問題太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; 
} 
+1

不,也沒有解決我的問題。我相信這個問題是安德烈亞斯在上面解釋過的。 – aslisabanci

-1

改變屬性爲「strong」引用後,我的問題就消失了。

前:

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

後更改屬性爲 「strong」:

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

這並沒有解決我的問題 – Jesse

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]; 
} 
+0

這個解決方案解決了我的問題與YouTube移動頁面。實際上,我在4個函數中調用updateButtons:shouldStartLoadWithRequest,webViewDidFinishLoad,didFailLoadWithError和webViewHistoryDidChange。當網站是桌面版時,前三個效果很好。但是在處理手機網站時,我需要第四個功能。 –

+1

這是正確的答案。 – iOS

相關問題