2011-01-14 50 views
7

我正在構建一個iPhone應用程序,該應用程序顯示一個指向我創建的Web應用程序的UIWebView。用戶交互有時會在UIWebView中產生jQuery ajax請求

Web應用程序頻繁地調用Web服務來調用用於在畫布上爲動畫製作動畫的數據項。數據調用使用jQuery ajax,通過JSON傳遞參數並接收XML響應。

我發現用戶與UIWebView交互正在發生時,javascript setTimeout方法被阻止,似乎根本沒有執行。很公平;有辦法解決這個問題。

但是,主要的問題是,在用戶交互(縮放,平移等)後,時不時的ajax Web服務調用將只會失敗,我無法建立一個原因。即使他們被反複製作,在接下來的幾分鐘內,他們甚至都不會接通網絡服務。如果您完全離開UIWebView,只要Web服務啓動並且存在連接,它們就永遠不會失敗。

任何人都可以提出爲什麼,以及如何解決/解決這個問題?

快速更新:根據Safari移動調試器,錯誤函數中的'響應'對象是未定義的。 (它可以工作,例如,我使URL無效,然後可以通過[webView stringByEvaluatingJavascript:@「lastError」]從objective-c調用該方法,但會拋出一個例外:「觸及uiwebview」錯誤):

$.ajax({ 
    type: "POST", 
    url: "WebService.asmx/GetValues", 
    async: true, 
    data: "{'pageVersionIndex': " + PageVersionIndex + " , 'timeStreamIndex': '" + TimeStream + "'}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "xml", 
    success: function (response) { UpdateControls(response); }, 
    error: function (response, status, errorthrown) { 
     calling = false; 
     lastError = response.statusText; //Throws exception 
     connectionInterrupted = true; 
     DataRoutine = window.setTimeout(DataService, dataFrequency); } 
    }); 
+1

我認爲這將是替代相關的iPhone標籤爲一個好主意其中一個標籤(「web應用程序」也許)。 – Pointy 2011-01-14 14:27:55

+0

好主意,會做。 – 2011-01-14 14:29:31

回答

2

恐怕你在某種程度上烤了。在iOS Safari和UIWebView中,系統進程優先於瀏覽器,並且如果突然需要更多的CPU能力或本地進程的內存(例如處理觸摸等),可能會發生任何正在運行的JavaScript將停止執行以減少內存負載或CPU使用率。最糟糕的部分是它不會拋出任何錯誤或任何東西......它只是停止你的代碼執行,就好像什麼也沒有發生。

害怕如果它發生在你的應用中很多,唯一的方法是添加某種計時器,如果請求沒有被阻止,那麼將會監聽 - 再次執行,直到成功。

的iOS的酸甜苦辣 - 他們真的很喜歡你去本地而不是網絡:)

希望它能幫助, 湯姆