Второй вопрос на самом деле проще ответить. Посмотрите на метод NSString stringWithContentsOfURL:encoding:error:
- он позволяет передавать URL-адрес как экземпляр NSURL (который может быть легко создан из NSString) и возвращает строку с полным содержимым страницы по этому URL-адресу. Например:
NSString *googleString = @"http://www.google.com";
NSURL *googleURL = [NSURL URLWithString:googleString];
NSError *error;
NSString *googlePage = [NSString stringWithContentsOfURL:googleURL
encoding:NSASCIIStringEncoding
error:&error];
После выполнения этого кода, googlePage
будет содержать HTML для www.google.com и error
будет содержать любые ошибки, возникающие в выборку. (Вы должны проверить содержимое error
после извлечения.)
Идти другим путем (из UIWebView) немного сложнее, но в основном является той же концепцией. Вы должны будете тянуть request с точки зрения, то делать выборки, как и раньше:
NSURL *requestURL = [[yourWebView request] URL];
NSError *error;
NSString *page = [NSString stringWithContentsOfURL:requestURL
encoding:NSASCIIStringEncoding
error:&error];
EDIT: Оба эти метода принимают удар по производительности, однако, так как они делают запрос дважды. Вы можете обойти эту проблему путем захвата содержимого из текущей загруженной UIWebView, используя свой метод stringByEvaluatingJavascriptFromString:
, как таковой:
NSString *html = [yourWebView stringByEvaluatingJavaScriptFromString:
@"document.body.innerHTML"];
Это будет захватывать текущее содержимое HTML из представления с помощью объектной модели документа, разобрать JavaScript, затем дайте его вам как NSString * HTML.
Другой способ - сделать ваш запрос программно сначала, а затем загрузить UIWebView из того, что вы запросили. Предположим, вы взяли второй пример выше, где у вас есть NSString *page
в результате звонка на stringWithContentsOfURL:encoding:error:
. После этого вы можете нажать эту строку в веб-просмотра с помощью loadHTMLString:baseURL:
, если вы также состоялось в NSURL вы просили:
[yourWebView loadHTMLString:page baseURL:requestURL];
Я не уверен, однако, если это будет работать JavaScript найти на странице загружаемой (имя метода, loadHTMLString
, несколько неоднозначно, и документы не говорят об этом много).
Для получения дополнительной информации:
Awesome! Спасибо за отличный ответ. Я предполагаю, что оба метода приводят к загрузке страницы дважды, что может повлиять на производительность. Есть ли способ избежать этого? –
На самом деле есть :) Отредактированный ответ. – Tim
Да, [yourWebView loadHTMLString: страница baseURL: requestURL]; запустит Javascript на странице. Я использовал этот api с картами Google. – jeff7091