2011-01-14 8 views
7

Sto costruendo un'app per iPhone che visualizza una UIWebView che punta a un'applicazione Web che ho creato.L'interazione dell'utente a volte elimina le richieste jQuery ajax in UIWebView

L'applicazione Web effettua frequenti chiamate al servizio Web per gli elementi dati utilizzati per animare i controlli su un'area di disegno. Le chiamate per i dati utilizzano jQuery ajax, passando i parametri tramite JSON e ricevendo una risposta XML.

Sto scoprendo che mentre si verificano interazioni dell'utente con UIWebView, il metodo javascript setTimeout è bloccato e non sembra affatto essere eseguito. Giusto; ci sono modi per aggirare questo

Ma il problema principale è che ogni tanto dopo le interazioni dell'utente (zoom, panning, ecc.), Le chiamate al servizio web ajax falliscono sempre e non riesco a stabilire un motivo per cui. Anche se sono fatti ripetutamente, per i prossimi minuti nessuno di loro potrà nemmeno accedere al servizio web. Se si lascia completamente UIWebView, non falliranno mai fino a quando il servizio web è attivo e la connettività è presente.

Qualcuno può suggerire perché e come risolvere/aggirare questo problema?

Aggiornamento rapido: secondo il debugger mobile Safari, l'oggetto "risposta" nella funzione di errore non è definito. (Funziona se, ad esempio, faccio l'URL non valido. Questo può quindi essere chiamato da ogg-c da [webView stringByEvaluatingJavascript: @ "lastError"], ma genera un'eccezione per questo errore "toccato l'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

penso che sarebbe una buona idea per sostituire un tag rilevante per iPhone uno dei tag che hai (forse "applicazioni web"). – Pointy

+0

Buona idea, lo farò. –

risposta

2

Ho paura che tu sia tostato ... in un certo senso. In iOS Safari e in UIWebView, rispettivamente, i processi di sistema hanno la priorità sul browser e se c'è una richiesta improvvisa di maggiore potenza o memoria della CPU per i processi nativi (come la gestione del tocco, ecc.) Potrebbe accadere che qualsiasi javascript in esecuzione venga arrestato per ridurre il carico di memoria o utilizzo della CPU. La parte peggiore è che non genererà alcun errore o altro ... semplicemente interrompe l'esecuzione del codice come se nulla fosse accaduto.

Paura che se succede molto nella tua app l'unico modo sarebbe quello di aggiungere una specie di timer che ascolterà se la richiesta non è bloccata se è così - fallo di nuovo fino a quando avrà successo.

Alti e bassi di iOS - che piace molto ad andare nativo piuttosto che web :)

Speranza che aiuta, Tom

+0

Grazie per il consiglio. Ho esaurito tutte le strade e l'unico modo in cui sono stato in grado di superare il problema è effettuare le chiamate al servizio web manualmente utilizzando un NSURLConnection piuttosto che chiamare i metodi javascript sulla pagina. Inoltre, offre un controllo migliore sui tempi di uscita, riprovare, ecc. –

Problemi correlati