La seconda domanda è in realtà più facile da rispondere. Guarda il metodo stringWithContentsOfURL:encoding:error:
di NSString: ti consente di passare un URL come un'istanza di NSURL (che può essere facilmente istanziata da NSString) e restituisce una stringa con il contenuto completo della pagina su quell'URL. Per esempio:
NSString *googleString = @"http://www.google.com";
NSURL *googleURL = [NSURL URLWithString:googleString];
NSError *error;
NSString *googlePage = [NSString stringWithContentsOfURL:googleURL
encoding:NSASCIIStringEncoding
error:&error];
Dopo l'esecuzione di questo codice, googlePage
conterrà il codice HTML per www.google.com, e error
conterrà eventuali errori riscontrati nel recupero. (Si dovrebbe verificare il contenuto del error
dopo il recupero.)
Andando nella direzione opposta (da un UIWebView) è un po 'più complicato, ma è fondamentalmente lo stesso concetto. Dovrete tirare la request dalla vista, poi fare la prendere come prima:
NSURL *requestURL = [[yourWebView request] URL];
NSError *error;
NSString *page = [NSString stringWithContentsOfURL:requestURL
encoding:NSASCIIStringEncoding
error:&error];
EDIT: Entrambi questi metodi prendono un calo di prestazioni, tuttavia, dal momento che fanno la richiesta per due volte. È possibile aggirare questo afferrando il contenuto da un UIWebView attualmente caricata utilizzando il suo metodo stringByEvaluatingJavascriptFromString:
, come ad esempio:
NSString *html = [yourWebView stringByEvaluatingJavaScriptFromString:
@"document.body.innerHTML"];
Ciò afferrare il contenuto HTML corrente della vista utilizzando il Document Object Model, analizzare il codice JavaScript, quindi dartelo come NSString * di HTML.
Un altro modo è di eseguire prima la richiesta in modo programmatico, quindi caricare UIWebView da ciò che è stato richiesto. Supponiamo che tu prenda il secondo esempio sopra, dove hai NSString *page
come risultato di una chiamata a stringWithContentsOfURL:encoding:error:
. È quindi possibile spingere quella stringa nella visualizzazione Web utilizzando loadHTMLString:baseURL:
, supponendo che si tengono anche al NSURL richiesto:
[yourWebView loadHTMLString:page baseURL:requestURL];
Non sono sicuro, però, se questo verrà eseguito JavaScript trovato nella pagina si carica (il nome del metodo, loadHTMLString
, è un po 'ambiguo, e i documenti non dicono molto a riguardo).
Per maggiori informazioni:
Impressionante! Grazie per la magnifica risposta. Presumo che entrambi i metodi comportino il caricamento della pagina due volte, il che potrebbe avere un impatto sulle prestazioni. C'è un modo per evitarlo? –
In effetti, ci sono :) Risposta modificata. – Tim
Sì, [yourWebView loadHTMLString: page baseURL: requestURL]; eseguirà il Javascript nella pagina. Ho usato questa API con le mappe di Google. – jeff7091