2011-11-03 81 views
4

我們的iOS應用程序具有一個Web視圖,它正在渲染來自文件:URL的頁面。當用戶觸摸<A>元素切換頁面,時間大約20%,它卡住如下:UIWebView在webViewDidStartLoad後卡住

  1. 用戶點擊鏈接<A>
  2. 我們得到WebView.shouldStartLoadWithRequest回調
  3. 我們得到的WebView。 webViewDidStartLoad回調
  4. 沒有任何反應後,該

屏幕仍顯示與它的聯繫原來的頁面。我們可以打破在兩個方面的僵局:

  1. 旋轉裝置
  2. 點擊屏幕

在這一點上,該頁面將立即完成加載。

我們所用的配方從這裏:

Javascript console.log() in an iOS UIWebView

,讓我們一些洞察頁面加載。我們將javascript方面的東西放在我們加載到頁面上的第一個腳本文件中,並且在我們執行旋轉或分接點解決方法之後纔會打印它的消息。

所以看起來,它開始加載頁面,並開始評估頁面上的東西之間的某處。

我們已經嘗試了一些變通,其中沒有幫助:

  • 設置location.href,而不是使用標籤
  • 從設置location.href JavaScript的超時
  • 在didStartLoad回調,創建了一個線程,在webView上反覆調用setNeedDisplay

任何想法我們可能會做錯什麼?

+0

你能評論一下網頁上的所有內容,或者大部分內容,但是仍然會重現問題嗎?那將是我第一個診斷的方法。也許這是一個頁面大小/內存問題。如果有應用程序內存錯誤,你是NSLog嗎? –

+0

在我的應用程序中同樣奇怪的行爲。你找到了解決方案嗎? – olfuerniss

+0

還沒有答案,儘管我很高興我們並不孤單。我已經看到了完全無關緊要的頁面的問題,正如我所說的,我們已經嘗試在我們要開始的頁面的開頭添加日誌記錄,但這並未發生。所以webkit已經離開了舊頁面並開始加載新頁面,但在解析任何內容之前就停止了。 –

回答

2

您可以在XCode中使用gdb來調試問題。我認爲,可能有斷點的消息canidates是:

- (void)webViewDidStartLoad:(UIWebView *)webView 
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 

我也想補充一個破發以任何UIViewController是顯示您的UIWebView爲:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

然後,你可以通過一步,並希望趕上你的UIWebView子類有什麼問題。

如果您不想添加斷點,則只需在XCode調試器中運行您的應用程序,並在應用程序加載時無響應時點擊控制檯窗口上方的「暫停執行」按鈕即可。

GDB Pause Execution Button

很難知道發生了什麼事情,沒有任何代碼走下車,但我打賭的Xcode可以幫助你快速找到問題。

祝你好運!

+0

這是我們需要的線索。我們發現UIWebView和我們的Open GL渲染代碼之間存在着一種軟性的僵局(我們通過一個opengl圖像對Web視圖進行分層)。 Web視圖掛起來等待信號量。 我們通過簡單地關閉頁面加載期間的GL刷新循環來解決問題。 –

0

找到了這種奇怪行爲的解決方案,至少在我的情況下。

在我的應用程序中,我創建了UIWebView的子類。我知道蘋果文檔指出你不應該繼承UIWebView。但它在我的應用程序中是「必要的」。

問題是,我覆蓋了scrollViewDidEndDragging:willDecelerate:沒有調用超級。

- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { 
    // my code 
} 

變得

- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { 
    [super scrollViewDidEndDragging:scrollView willDecelerate:decelerate]; 
    // my code 
} 

現在,它始終是一個HTML鏈接上敲擊時加載的網站。

+0

我們對UIWebView進行了子類化,但我們並沒有重寫該方法。無論如何,我們只是重構,以消除子類(沒有意識到這是一個「不應該」)。問題依然存在。 –