Чтение содержимого JSON из UIWebView - PullRequest
3 голосов
/ 24 октября 2009

Я использую UIWebView для отображения капчи. Если пользователь вводит капчу правильно, то сервер возвращает данные, используя сериализацию JSON. Я не хочу, чтобы представление отображало это, вместо этого я хочу перехватить загрузки UIWebView, и если он возвращает сериализованные данные JSON, я хочу сохранить эти данные и удалить UIWebView.

Я думал о настройке делегата в UIWebView и использовании его webViewDidFinishLoad, но как мне загрузить контент?

Ответы [ 2 ]

8 голосов
/ 24 октября 2009

Возможно, вы захотите определить UIWebViewDelegate и использовать webView:shouldStartLoadWithRequest:navigationType: перехватить запрос и обработать его.

В вашем случае вы должны оценить NSURLRequest и вернуть NO, чтобы предотвратить загрузку WebView. В свою очередь, вы должны создать отдельный NSURLConnection с тем же запросом и настроить делегата для получения ответа (JSON).

5 голосов
/ 25 октября 2009

Я придумал это (возможно, не очень красивое) решение:

Вместо того, чтобы возвращать ответ только для json, я использую тот же шаблон HTML, который я использовал для капчи. Если капча прошла успешно, я отправляю json, который хочу, в шаблон HTML, который отображает его в скрытом div с идентификатором:

<html>
<body>

{% if captcha_success %}

<div id="json" style="display: none">{"jsonvalue":"{{result}}"}</div>

{% else %}

// display captcha as usual

{% endif %}

</body>
</html>

и затем я могу получить содержимое в webViewDidFinishLoad, используя:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString *res = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('json').innerHTML"];
NSDictionary *json = [[CJSONDeserializer deserializer] deserializeAsDictionary:[res dataUsingEncoding:NSUTF8StringEncoding] error:nil];
// more stuff
}

Обычно я думаю, что это было довольно легко и просто реализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...