我正在构建一个iPhone应用程序,显示指向我创建的Web应用程序的UIWebView。
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); }
});
答案 0 :(得分:2)
我害怕你在某种程度上敬酒......在iOS Safari和UIWebView中,系统进程优先于浏览器,如果突然需要更多的CPU功率或内存进行本机进程(如处理触摸等),可能会发生任何正在运行的javascript将停止执行以减少内存负载或CPU使用率。最糟糕的是它不会抛出任何错误或任何东西......它只是停止你的代码执行,好像什么也没发生。
如果它在你的应用程序中发生了很多,那么唯一的办法就是添加某种计时器,如果请求没有被阻止就会监听,如果是这样的话 - 再次成功直到成功。
iOS的起起落落 - 他们真的很喜欢你本土而不是网络:)
希望它有所帮助, 汤姆