2011-01-14 9 views
7

Buduję aplikację na iPhone'a, która wyświetla interfejs UIWebView wskazujący na utworzoną aplikację internetową.Czasami interakcje użytkownika powodują utratę żądań ajax jQuery w UIWebView

Aplikacja internetowa wykonuje częste wywołania serwisowe do elementów danych, które służą do animowania elementów sterujących na obszarze roboczym. Wywołania danych wykorzystują jQuery ajax, przekazując parametry za pośrednictwem JSON i otrzymując odpowiedź XML.

Dowiaduję się, że podczas interakcji użytkownika z UIWebView występują, metoda setTimeout javascript jest zablokowana i nie wydaje się, aby w ogóle wykonać. Słusznie; są sposoby obejścia tego.

Ale głównym problemem jest to, że od czasu do czasu interakcje użytkownika (powiększanie, przesuwanie, itp.) Wywołania usługi internetowej ajax po prostu zawodzą przez cały czas i nie mogę ustalić przyczyny. Nawet jeśli są wykonywane wielokrotnie, przez kilka następnych minut żadna z nich nie przejdzie nawet do usługi sieciowej. Jeśli całkowicie opuścisz interfejs UIWebView, nigdy się nie zawiedzie, dopóki usługa internetowa jest uruchomiona, a łączność jest obecna.

Czy ktoś może sugerować, dlaczego i jak to naprawić/obejść?

Szybka aktualizacja: zgodnie z mobilnym debugerem Safari, obiekt "response" w funkcji błędu jest niezdefiniowany. (Działa to, gdy na przykład powoduję, że adres URL jest nieważny, może on zostać wywołany z obiektu c przez [webView stringByEvaluatingJavascript: @ "lastError"], ale zgłasza wyjątek dla tego błędu "dotknął 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

myślę, że będzie to dobry pomysł, aby zastąpić odpowiednią etykietę dla iPhone jeden z dostępnych tagów (być może "aplikacje internetowe"). – Pointy

+0

Dobry pomysł, zrobię. –

Odpowiedz

2

Obawiam się, że jesteś wznoszący toast ... w pewien sposób. W systemach iOS Safari i UIWebView procesy systemowe mają priorytet nad przeglądarką i jeśli nagłe zapotrzebowanie na moc procesora lub pamięć dla procesów natywnych (takich jak obsługa dotykowa itp.) Może się zdarzyć, że każdy uruchomiony javascript zostanie zatrzymany przed wykonaniem, aby zmniejszyć obciążenie pamięci lub użycie procesora. Najgorsze jest to, że nie wyśle ​​żadnych błędów ani niczego ... po prostu zatrzymuje wykonywanie kodu tak, jakby nic się nie stało.

Obawia się, że jeśli zdarzy się tak wiele w aplikacji, jedynym sposobem będzie dodanie zegara, który będzie nasłuchiwał, jeśli żądanie nie zostanie zablokowane, jeśli tak się stanie - zrób to ponownie, aż do pomyślnego zakończenia.

Wzloty i upadki z iOS - oni naprawdę podoba Ci się zasymilować, a następnie internetowych :)

nadzieję, że to pomaga, Tom

+0

Dzięki za poradę. Wyczerpałem każdą drogę i jedynym sposobem, w jaki udało mi się przezwyciężyć problem, jest ręczne wywoływanie wywołań do usługi sieciowej przy użyciu NSURLConnection zamiast wywoływania metod javascript na stronie. Zapewnia to również lepszą kontrolę nad przekroczeniem limitu czasu, ponowną próbą itp. –

Powiązane problemy