2009-10-24 6 views
2

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

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

ответ

7

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

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

+0

Хорошая идея, работал для меня. – jarnoan

+1

@jarnoan Вы хотели бы поделиться своим кодом, я не получил этот ответ –

5

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

вместо возвращения JSon только ответ, я использую тот же шаблон HTML, который я использовал для капчи. Если капча удастся, я посылаю JSON Я хочу шаблон HTML, который отображает его в скрытом DIV с ID:

<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 
} 

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

Смежные вопросы