我正在使用UIWebView来显示验证码。如果用户输入验证码正确,则服务器使用JSON序列化返回数据。我不希望视图显示这个,而是我想拦截UIWebView的负载,如果它返回JSON序列化数据,我想要存储该数据并删除UIWebView。从UIWebView中读取JSON内容
我正在考虑为UIWebView设置委托并使用它的webViewDidFinishLoad,但是如何获取加载的内容?
我正在使用UIWebView来显示验证码。如果用户输入验证码正确,则服务器使用JSON序列化返回数据。我不希望视图显示这个,而是我想拦截UIWebView的负载,如果它返回JSON序列化数据,我想要存储该数据并删除UIWebView。从UIWebView中读取JSON内容
我正在考虑为UIWebView设置委托并使用它的webViewDidFinishLoad,但是如何获取加载的内容?
您可能想要考虑定义UIWebViewDelegate
并使用 webView:shouldStartLoadWithRequest:navigationType:
来拦截请求并对其进行处理。
对于您的情况,您将评估NSURLRequest
并返回NO
以防止加载WebView。接下来,您将创建一个具有相同请求的单独NSURLConnection
,并设置一个委托来接收(JSON)响应。
我想出了这个(也许不是很漂亮)解决方案:
而不是返回一个只JSON响应,我使用我用来验证码相同的HTML模板。如果验证码成功,我送我想HTML模板的JSON,显示它在一个隐藏的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
}
一般而言,我认为这是非常容易和直接实施。
好主意,为我工作。 – jarnoan 2010-10-21 14:31:36
@jarnoan你想分享你的代码,我没有得到这个答案 – 2011-02-23 12:09:58